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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM