zoukankan      html  css  js  c++  java
  • OSX: diskutil命令-转换成自由空间并再对其分区

    声明:本文涉及的操作非常可能会破坏你的系统文件,造成数据丢失。请谨慎模仿,一切后果作者均不承担不论什么责任。



    目的:

    尽管说比較熟悉diskutil命令和它的GUI前端程序磁盘工具(Disk Utility),由于有时须要对磁盘分区进行操作。那么在前端使用磁盘工具比較方便。并且不easy出错。但是有时须要远程或者通过诸如ssh来处理。特别是对多个机器同一时候操作的情况下,总不能显得自己那么的笨手笨脚的吧。

    每一个公司甚至是每一个办公室,总有那么一个人难对付,那老兄要求帮忙,顺便给你来一句:要是给我管理员权限,这个我在家常常做。他不就是认为自己牛逼嘛。你会的他也会,看不起咱么。

    假设不让他领教一下厉害,就让他抓住把柄了还!再说,仅仅能通过GUI来做的,恨不得是个年轻人都会不是,年轻的时候谁没有玩过电脑啊。

    所以,掌握独门之计,不被常人所知的技艺,让他都不知道怎么做到的,他才干服。不用多。来个两次。他就不炸刺儿了,你也就立住脚了。

    那都是题外话,那些也不是咱摆弄机器的动力。

    这次就是想使用命令行diskutil命令来完毕两个工作:

    一是把一个无用的分区,转化为没有被使用的空暇的空间。

    在磁盘工具中就是点-号来删除一个分区。

    二是把磁盘上一个空暇空间,分配出一个分区。

    在磁盘工具中就是点+号来生成一个分区。

    并且,一个原则是,不能破坏其它分区和里面的数据。


    概况:

    既然是要使用diskutil命令。就来看看它能干什么。以下列出的功能仅仅限于本篇实用和相关的几个。

    diskutil命令支持的功能:

    对磁盘的操作:

      • eraseDisk:擦除整个磁盘
      • partitionDisk:给一个磁盘分区

    对分区的操作:

      • eraseVolume:擦除一个分区/卷
      • reformat:给一个分区又一次格式化
      • resizeVolume:改变一个分区的大小
      • splitPartition:把一个分区分成多个小分区
      • mergePartitions:把多个分区合并
    你看。没有一个功能是说能直接完毕咱们上面两个任务的。


    一些常识:

    整理一下他的基本常识概念。

    1. OS X系统内置支持的分区类型。能够用命令来列出,做到心中有数:

    $ diskutil listFilesystems
    Formattable file systems
    
    These file system personalities can be used for erasing and partitioning.
    When specifying a personality as a parameter to a verb, case is not considered.
    Certain common aliases (also case-insensitive) are listed below as well.
    
    -------------------------------------------------------------------------------
    PERSONALITY                     USER VISIBLE NAME                               
    -------------------------------------------------------------------------------
    ExFAT                           ExFAT                                           
    Free Space                      Free Space                                      
      (or) free
    MS-DOS                          MS-DOS (FAT)                                    
    MS-DOS FAT12                    MS-DOS (FAT12)                                  
    MS-DOS FAT16                    MS-DOS (FAT16)                                  
    MS-DOS FAT32                    MS-DOS (FAT32)                                  
      (or) fat32
    HFS+                            Mac OS Extended                                 
    Case-sensitive HFS+             Mac OS Extended (Case-sensitive)                
      (or) hfsx
    Case-sensitive Journaled HFS+   Mac OS Extended (Case-sensitive, Journaled)     
      (or) jhfsx
    Journaled HFS+                  Mac OS Extended (Journaled)                     
      (or) jhfs+
    
    它说了,个性化的名称是大写和小写不敏感的。


    使用也是简单明了,比方jhfs+或者JHFS+或者“Journaled HFS+”都是一样的。也能够使用人可识别的名称,比如%Applie_HFS%。可是这些名称必须是系统可识别的。详细有哪些,还不清楚。

    另一种使用UUID的方式就是指定分区类型的UUID, 这个UUID能够是GPT定义好的,或者是随意的,这个方式比較灵活。

    由于仅仅有Apple HFS的分区才支持无损的变更分区大小的操作,所以后面都使用JHFS+。


    2. 描写叙述分区的三个參数:Format(格式) Name(名称) Size(大小)。

    它们被叫做分区三联式(Triplet)。

    三联式中的每一个部分都使用空格分开。当中,格式在前面已经说了;名称非常明显,就是字符串。能够用“”来说明。大小能够是以下的几种形式:

    • 浮点数后跟B,K(10^3)),M(10^6)),G(10^9),T(10^12),P(10^15),E(10^18)等(单位是字节Byte),用来表述xxMB/GB/TB的空间大小
    • 浮点数后跟S(512字节区块),Ki(2^10)),Mi(2^20)),Gi(2^30),Ti(2^40),Pi(2^50),Ei(2^60)等(单位是字节Byte),用来表述xxMB/GB/TB的空间大小
    • DBS是指使用设备内定的区块大小,通常是512字节。只是要依据设备而定。所以不经常使用。
    • 浮点数后跟%,用来表述占用磁盘空间的百分比
    • R,是说全部剩余空间。在多个分区三联式中,它不一定非得是最后一个。但仅仅能有一个(It need not be in the last triplet.  It must only appear in at most one triplet among all triplets.)。

    3. 我们经常使用的命令:

    查看当前磁盘分区情况: diskutil list

    查看某一个分区的详细信息:diskutil info disk1s2

    4. 设备: 能够是四种形式,每种形式依据命令的需求不同。适用于不同的情况。

    1. 设备描写叙述符(device identifier): 看上去类似disk1s3
    2. 设备节点(device node): 看上去是/dev/disk1s3
    3. 分区载入点(Volume mount point):默认的类似于 /Volumes/My_Partition
    4. UUID(通用唯一标识符): 看上去类似11111111-2222-3333-4444-555555555555 


    工作环境:

    使用不论什么一个U盘进行尝试,样例中用的是1GB的U盘. 来做三个分区一个空暇空间,第一个是25%空间的exFAT分区DOS。后面是300MiB的空暇空间,然后是100MB的JHFS+分区A,最后是全部剩余空间分配指JHFS+分区B.

    $ diskutil partitionDisk disk1 GPT exFAT DOS 25% free whatIam 300Mi JHFS+ A 100M JHFS+ B R
    
    Started partitioning on disk1
    Unmounting disk
    Creating the partition map
    Waiting for the disks to reappear
    Formatting disk1s1 as ExFAT with name DOS
    Volume name      : DOS
    Partition offset : 2048 sectors (1048576 bytes)
    Volume size      : 507904 sectors (260046848 bytes)
    Bytes per sector : 512
    Bytes per cluster: 4096
    FAT offset       : 128 sectors (65536 bytes)
    # FAT sectors    : 512
    Number of FATs   : 1
    Cluster offset   : 640 sectors (327680 bytes)
    # Clusters       : 63408
    Volume Serial #  : 53c9fdc4
    Bitmap start     : 2
    Bitmap file size : 7926
    Upcase start     : 4
    Upcase file size : 5836
    Root start       : 6
    Mounting disk
    Formatting disk1s2 as Mac OS Extended (Journaled) with name A
    Initialized /dev/rdisk1s2 as a 95 MB HFS Plus volume with a 512k journal
    Mounting disk
    Formatting disk1s3 as Mac OS Extended (Journaled) with name B
    Initialized /dev/rdisk1s3 as a 349 MB HFS Plus volume with a 8192k journal
    Mounting disk
    Finished partitioning on disk1
    /dev/disk1
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *1.0 GB     disk1
       1:       Microsoft Basic Data DOS                     260.0 MB   disk1s1
       2:                  Apple_HFS A                       100.0 MB   disk1s2
       3:                  Apple_HFS B                       366.0 MB   disk1s3

    尝试1:

    是否能用resizeVolume把一个分区的大小变成0来达到使之变成空暇空间呢?

    咱们先来复制一个文件到分区A中,在来尝试以下命令:

    $ diskutil resizeVolume disk1s3 0B
    
    Started partitioning on disk1s3 A
    Verifying the disk
    Checking file system
    Checking Journaled HFS Plus volume
    Checking extents overflow file
    Checking catalog file
    Checking multi-linked files
    Checking catalog hierarchy
    Checking extended attributes file
    Checking volume bitmap
    Checking volume information
    The volume A appears to be OK
    Resizing
    Finished partitioning on disk1s3 A
    /dev/disk1
       #:                       TYPE NAME                    SIZE       IDENTIFIER
       0:      GUID_partition_scheme                        *1.0 GB     disk1
       1:       Microsoft Basic Data DOS                     260.0 MB   disk1s1
       2:                  Apple_HFS A                       100.0 MB   disk1s2
       3:                  Apple_HFS B                       366.0 MB   disk1s3
    
    

    能够看到,根本没有作用。

    事实上前面已经说了resizeVolume是一种非破坏性的操作。


    操作1:

    好了,前面卖了个官司,事实上使用这个命令就好了,特别简单。

    $ diskutil eraseVolume free NONE disk1s3
    
    Started erase on disk1s2
    Unmounting disk
    Error: 2: POSIX reports: No such file or directory

    尽管看上去有个错误。那是由于自由空间无法被装载。所以没有问题。




    操作2:

    如今来看看怎样把空暇空间费配称一个可用的分区。

    一种方法最简单,假设磁盘上的数据都不须要了,那么又一次分区(diskutil partitionDisk)最最简单直接。

    但是假设要保存数据呢?而经过上面的分析。你能够看到,空暇空间不会被分配一个设备,也就是没有UUID, 没有设备描写叙述符。没有节点。没有载入点。什么都没有,就没有直接打方式。

    只是能够“曲线救国”,利用resizeVolume再splitPartition来达到目的。比方把上图中A分区后面的分配回给B。能够这样做:

    #resizeVolume limits -> get Current Size
    newVol="B"
    currentSize=`diskutil resizeVolume disk1s2 limits | grep "Current" | awk '{print $3$4}'`
    currentVol=`diskutil list disk1 |grep "disk1s2" | awk '{print $3}'`
    #resizeVolume to Rest:
    diskutil resizeVolume disk1s2 R
    #splitePartition:
    diskutil splitPartition disk1s2 2 JHFS+ $currentVol $currentSize JHFS+ $newVol R


    GPT分区:

    使用Diskutil list查看磁盘分区状况。并不能反应出空暇空间的状况。所以须要使用另外一个命令来解释:

    $ sudo gpt -r show disk1
    Password:
    
        start     size  index  contents
            0        1         PMBR
            1        1         Pri GPT header
            2       32         Pri GPT table
           34     2014         
         2048   507904      1  GPT part - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
       509952   612624         
      1122576   195312      2  GPT part - 48465300-0000-11AA-AA11-00306543ECAC
      1317888   714784      3  GPT part - 48465300-0000-11AA-AA11-00306543ECAC
      2032672        2         
      2032674       32         Sec GPT table
      2032706        1         Sec GPT header
    


    操作3:

    前面有时卖关子,由于什么呢?比方前面那个在DOS分区后和A分区前的那部分空暇空间就不好办,由于前面的DOS分区不可改变分区大小,或者其它复杂状况,更是难以处理。而有了上面对GPT分区表的了解,真正能够处理的方法在这里了。

    最简单的方法是:

    diskutil unmountDisk force disk1
    sudo gpt add disk1
    diskutil unmountDisk force disk1
    
    sudo diskutil eraseVolume JHFS+ C disk1s4
    diskutil mountDisk disk1

    更复杂的情况。可能须要这样处理:
    diskutil unmountDisk force disk1
    sudo gpt remove -b 1122576 disk1
    sudo gpt remove -b 1317888 disk1
    sudo gpt add -b   509952 -s 612624 disk1
    sudo gpt add -b 1122576 -s 195312 disk1
    sudo gpt add -b 1317888 -s 714784 disk1
    diskutil unmountDisk force disk1
    sudo diskutil eraseVolume JHFS+ C disk1s2
    diskutil mountDisk disk1
     

    Ref:

    man diskutil

    The Chromium Projects: Disk Format

    Secrets of the GPT

    GUID Partition Table

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6844591.html
Copyright © 2011-2022 走看看