首页 > 代码库 > OSX: 逻辑卷管理系统Core Storage(3)

OSX: 逻辑卷管理系统Core Storage(3)

目前的CoreStorage都可以干什么?前面有了举例,使用了几个简单的命令,显示了看上去的core storage在OS X中是什么样子的,它的大致结构如何。


有关CoreStorage中前后文使用的缩写对照:

PV = Physical Volume

LVG = Logical Volume Group

LVF = Logical Volume Family

LV = Logical Volume

cs = coreStorage


为了能更好地了解Core Storage能干什么以及如何做,那么首先要了解它的命令行的参数了。管理Core Storage与它打交道的唯一途径就是diskutil命令了,对于熟悉该命令的来说,这个命令是OS X管理本地磁盘分区的,而所有人都用的Disk Utility可以说是这个命令的GUI接口而已,地层的工作都是它可以完成的,而且可以干得更多。


命令

diskutil的一个子命令集coreStorage或者简写为cs,就是管理Core Storage的。基本的命令形式是:

diskutil <coreStorage | cs> <verbs> ….

cs是coreStorage的缩写形式,后面我们都用这个写法。


命令分类

下面我们按照功能分类详细解释每个verbs。

获取信息

list - 显示所有CoreStorage的逻辑结构和信息

info - 显示特定CoreStorage对象的详细内容

转换

convert - 将普通卷转换成CoreStorage卷(无损)

revert -CoreStorage卷转换成普通卷(无损)

LVG命令

create-创建新的CoreStorage的LVG

delete-删除CoreStorage的LVG

PV命令

resizeDisk-改变一个PV的大小(10.10之前是公开的-注1)

removeDisk-移除一个PV(10.10之前是公开的)

addDisk-添加PV到一个LVG(10.10之前是公开的)

LV命令

createVolume-创建新的LV

unlockVolume-将LV解锁

deleteVolume-删除LV

changeVolumePassphrase-改变LV的密码

resizeVolume-改变LV的大小(10.0之前是公开的)

resizeStack-同时改变LV和它相关的PV的大小(10.10之前是公开的)

加密解密

encryptVolume-加密一个LV(无损)

decryptVolume-解密一个LV(无损)


list最简单,显示cs中的所有PV-LVG-LVF-Lvs的彼此关系,前面的举例中也看到了。

Usage:  diskutil coreStorage list
        diskutil coreStorage list -plist
        diskutil coreStorage list UUID

解释:

没有后面参数的,就以柱状图形式显示cs所有对象彼此之间的关系。

如果使用-plist,那么会以plist的格式输出结果,你可以使用重定向来保存在一个plist文件中,作为以后处理用途。

如果显示特定一个对象的信息,可以参考下面的info,或者在此命令中指定该对象的UUID。


info: 显示给定cs目标的信息

<span style="font-size:18px;">diskutil cs info | information [-plist] <device></span>

解释:

其中的<device>可以是cs中适合该对象的UUID|MountPoint|DiskIdentifier|DeviceNode中的一个。

比如,参看前一篇举例的第二个图,对OSX93这个LV来说,可以是诸如disk2(DiskIdentifier), B4236385-106A-4C98-9BBF-66B93AEAD8AC(UUID),/(MountPoint),而PV中的/dev/disk1s2(DeviceNode)等。

-plist的用法与list中的解释相同


convert:将一个普通GPT分区转化成cs的LV

Usage:  diskutil coreStorage convert
        MountPoint|DiskIdentifier|DeviceNode
        [-stdinpassphrase | -passphrase [passphrase]]
解释:

这个被转换的普通分区必须是可装载并可改变大小的,在OS X中也就是JHFS+分区,而且要求对该分区有写权限,-可能需要sudo来获取。

如果不提供密码(passphrase)那么它只生成LVF,并且以后也无法对它进行加密了。

如果使用-stdinpassphrase参数,那么运行这个命令后,它会等待用户从stdin输入密码;-passphrase后面直接跟着密码。

MountPoint|DiskIdentifier|DeviceNode的解释与info中的相同,只是因为普通的分区等没有UUID,所以这里没有把UUID列出。


revert:将cs的LV转化为普通分区

Usage:  diskutil coreStorage revert
        MountPoint|DiskIdentifier|DeviceNode|lvUUID
        [-stdinpassphrase | -passphrase [passphrase] | -recoverykeychain file]

解释:

这个就是上面的convert的反过程。


create: 把指定的一个或多个普通分区转化成一个LVG

Usage:  diskutil coreStorage create lvgName
        MountPoint|DiskIdentifier|DeviceNode ...
解释:

比如diskutil cs create MyLVG disk1s2 disk2s2 disk3s2命令把disk1s2,disk2s2和disk3s2分区转化为PV之后归并到MyLVG中。

注意:转化后,所有原分区中的数据将会丢失。

另外需要执行的用户拥有对这些普通分区的写权限。


delete: 很明显的,这个是对应上面的Create的,也就是删除一个LVG

Usage:  diskutil coreStorage delete lvgUUID
解释:
需要执行的用户拥有对这些普通分区的写权限。另外与之相关的LVF和LV都会被影响。


resizeDisk: 改变一个PV的分区大小

Usage:  diskutil coreStorage resizeDisk pvUUID size
        [part1Format part1Name part1Size part2Format part2Name part2Size
         part3Format part3Name part3Size ...]
解释:

pvUUID可以从“diskutil cs list”命令中得到。

改变PV的大小直接影响到与其相关的LV的可用空间的大小,当缩小的时候,可以为空域出来的空间指定一个分区。而且这个命令对在线数据也是非破坏性的。

removeDisk: 把一个PV从LVG中删除

<span style="font-size:18px;">Usage:  diskutil coreStorage removeDisk pvUUID</span>
解释:

目前不知道,删除的时候是否会影响现存在LV中的数据。

addDisk: 添加一个PV到指定的LVG中

Usage:  diskutil coreStorage addDisk lvgUUID NewMemberDeviceName
解释:

这个的用途应该最多,可以扩展现有的LV中的空间。其中NewMemberDeviceName应该与前面create中的命令所要求的相同,可以是MountPoint|DiskIdentifier|DeviceNode中的一个。


createVolume-创建新的LV(和LVF)

Usage:  diskutil coreStorage createVolume lvgUUID type name size
        [-stdinpassphrase | -passphrase [passphrase]]
解释:

其中type可以是JHFS+或者JHFSX(Case-sensitive Journaled HFS+)或者HFSX(Case-sensitive HFS+). 分区大小与普通diskutil的命令,如partitionDisk,相同。

比如: diskutil cs createVolume 0000000000-1111-2222-3333-444444444444 JHFS+ lvName 100%

unlockVolume-将LV解锁

Usage:  diskutil coreStorage unlockVolume lvUUID
        [-stdinpassphrase | -passphrase passphrase | -recoverykeychain file]
解释:

无论何种系统原因(因为没有一个用户接口去直接锁定),一个LV可能被锁住,锁住的LV不会被系统装载,所以要先解锁才能装载。密码也就是在生成的时候指定的。后面有机会可以演示如何处理这些。

deleteVolume-删除LV

Usage:  diskutil coreStorage deleteVolume lvUUID
解释:

删除一个LV,数据会丢失,而且这个LV应该是处于解锁状态。

changeVolumePassphrase-改变LV的密码

Usage:  diskutil coreStorage changeVolumePassphrase|passwd lvUUID
        [-recoverykeychain file] | [-oldpassphrase old]
        [-newpassphrase new] | [-stdinpassphrase]
解释:

这个命令可能比较有用,特别是在改变FileVault v2的密码的时候。后面有机会可以演示如何处理这些。

resizeVolume-改变LV的大小(10.0之前是公开的)

Usage:  diskutil coreStorage resizeVolume lvUUID size
解释:

这个命令不会影响数据。改变大小可能大于或者小于LVG的实际空间大小。

resizeStack-同时改变LV和它相关的PV的大小(10.10之前是未公开的)

Usage:  diskutil coreStorage resizeStack lvUUID [pvUUID] size
        [part1Format part1Name part1Size part2Format part2Name part2Size
         part3Format part3Name part3Size ...]
解释:

这个命令可以一次性地同时扩大或者缩小指定地LV(lvUUID)以及和它关联地一个PV(pvUUID)扩充或者缩小空间大小。如果是缩小,那么可以指定富余出来的空间生成新的LV。


encryptVolume:-加密一个LV(无损)

Usage:  diskutil coreStorage encryptVolume lvUUID
        [-stdinpassphrase | -passphrase passphrase]
decryptVolume:-解密一个LV(无损)

Usage:  diskutil coreStorage decryptVolume lvUUID
        [-stdinpassphrase | -passphrase passphrase]
解释:

很好理解,就是加密/解密一个LV,并可指定一个密码。注意这个密码不要和createVolume时的混淆。

注1:在本文成文之时,10.10的正式版还没有发布,所以该句的意思包括10.7.0直到10.9.3之间的各个版本。