宣告:本文涉及的操作非常可能會破壞你的系統檔案,造成資料丟失。請謹慎模仿,一切後果作者均不承擔不論什麼責任。
目的:
儘管說比較熟悉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. 裝置: 能夠是四種形式,每種形式依據命令的需求不同。適用於不同的情況。
- 裝置描寫敘述符(device identifier): 看上去類似disk1s3
- 裝置節點(device node): 看上去是/dev/disk1s3
- 分割槽載入點(Volume mount point):預設的類似於 /Volumes/My_Partition
- 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: