OSX: diskutil命令-轉換成自由空間並再對其分區

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

聲明:本文涉及的操作很可能會破壞你的系統檔案,造成資料丟失,請謹慎模仿,一切後果作者均不承擔任何責任。


目的:

雖然說比較熟悉diskutil命令和它的GUI前端程式磁碟工具(Disk Utility),因為有時需要對磁碟分割進行操作,那麼在前端使用磁碟工具比較方便,而且不容易出錯。可是有時需要遠程或者通過諸如ssh來處理,特別是對多個機器同時操作的情況下,總不能顯得自己那麼的笨手笨腳的吧。每個公司甚至是每個辦公室,總有那麼一個人難對付,那老兄要求幫忙,順便給你來一句:要是給我管理員權限,這個我在家經常做。他不就是覺得自己牛逼嘛,你會的他也會,看不起咱麼。如果不讓他領教一下厲害,就讓他抓住把柄了還!再說,只能通過GUI來做的,恨不得是個年輕人都會不是,年輕的時候誰沒有玩過電腦啊。所以,掌握獨門之計,不被常人所知的技藝,讓他都不知道怎麼做到的,他才能服。不用多,來個兩次,他就不炸刺兒了,你也就立住腳了。

那都是題外話,那些也不是咱擺弄機器的動力。這次就是想使用命令列diskutil命令來完成兩個工作:

一是把一個沒用的分區,轉化為沒有被使用的閒置空間。在磁碟工具中就是點-號來刪除一個分區。

二是把磁碟上一個空閑空間,分配出一個分區。在磁碟工具中就是點+號來產生一個分區。

而且,一個原則是,不能破壞其他分區和裡面的資料。


概況:

既然是要使用diskutil命令,就來看看它能幹什麼。下面列出的功能只限於本篇有用和相關的幾個。

diskutil命令支援的功能:

對磁碟的操作:

    • eraseDisk:擦除整個磁碟
    • partitionDisk:給一個磁碟分割

對分區的操作:

    • eraseVolume:擦除一個分區/卷
    • reformat:給一個分區重新格式化
    • resizeVolume:改變一個分區的大小
    • splitPartition:把一個分區分成多個小分區
    • mergePartitions:把多個分區合并
你看,沒有一個功能是說能直接完成咱們上面兩個任務的。


一些常識:

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

1. OS X系統內建支援的分區類型,可以用命令來列出,做到心中有數:

$ diskutil listFilesystemsFormattable file systemsThese 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) freeMS-DOS                          MS-DOS (FAT)                                    MS-DOS FAT12                    MS-DOS (FAT12)                                  MS-DOS FAT16                    MS-DOS (FAT16)                                  MS-DOS FAT32                    MS-DOS (FAT32)                                    (or) fat32HFS+                            Mac OS Extended                                 Case-sensitive HFS+             Mac OS Extended (Case-sensitive)                  (or) hfsxCase-sensitive Journaled HFS+   Mac OS Extended (Case-sensitive, Journaled)       (or) jhfsxJournaled 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 


工作環境:

使用任何一個隨身碟進行嘗試,例子中用的是1GB的隨身碟. 來做三個分區一個空閑空間,第一個是25%空間的exFAT分區DOS,後面是300MiB的空閑空間,然後是100MB的JHFS+分區A,最後是所有剩餘空間分配指JHFS+分區B.

$ diskutil partitionDisk disk1 GPT exFAT DOS 25% free whatIam 300Mi JHFS+ A 100M JHFS+ B RStarted partitioning on disk1Unmounting diskCreating the partition mapWaiting for the disks to reappearFormatting disk1s1 as ExFAT with name DOSVolume name      : DOSPartition offset : 2048 sectors (1048576 bytes)Volume size      : 507904 sectors (260046848 bytes)Bytes per sector : 512Bytes per cluster: 4096FAT offset       : 128 sectors (65536 bytes)# FAT sectors    : 512Number of FATs   : 1Cluster offset   : 640 sectors (327680 bytes)# Clusters       : 63408Volume Serial #  : 53c9fdc4Bitmap start     : 2Bitmap file size : 7926Upcase start     : 4Upcase file size : 5836Root start       : 6Mounting diskFormatting disk1s2 as Mac OS Extended (Journaled) with name AInitialized /dev/rdisk1s2 as a 95 MB HFS Plus volume with a 512k journalMounting diskFormatting disk1s3 as Mac OS Extended (Journaled) with name BInitialized /dev/rdisk1s3 as a 349 MB HFS Plus volume with a 8192k journalMounting diskFinished 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 0BStarted partitioning on disk1s3 AVerifying the diskChecking file systemChecking Journaled HFS Plus volumeChecking extents overflow fileChecking catalog fileChecking multi-linked filesChecking catalog hierarchyChecking extended attributes fileChecking volume bitmapChecking volume informationThe volume A appears to be OKResizingFinished 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 disk1s3Started erase on disk1s2Unmounting diskError: 2: POSIX reports: No such file or directory

雖然看上去有個錯誤,那是因為自由空間無法被裝載,所以沒有問題。




操作2:

現在來看看如何把空閑空間費配稱一個可用的分區。

一種方法最簡單,如果磁碟上的資料都不需要了,那麼重新分區(diskutil partitionDisk)最最簡單直接。

可是如果要儲存資料呢?而經過上面的分析,你可以看到,空閑空間不會被分配一個裝置,也就是沒有UUID, 沒有裝置描述符,沒有節點,沒有載入點。什麼都沒有,就沒有直接打方式。

不過可以“曲線救國”,利用resizeVolume再splitPartition來達到目的。比如把中A分區後面的分配回給B,可以這樣做:

#resizeVolume limits -> get Current SizenewVol="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 disk1Password:    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 disk1sudo gpt add disk1diskutil unmountDisk force disk1sudo diskutil eraseVolume JHFS+ C disk1s4diskutil mountDisk disk1

更複雜的情況,可能需要這樣處理:
diskutil unmountDisk force disk1sudo gpt remove -b 1122576 disk1sudo gpt remove -b 1317888 disk1sudo gpt add -b   509952 -s 612624 disk1sudo gpt add -b 1122576 -s 195312 disk1sudo gpt add -b 1317888 -s 714784 disk1diskutil unmountDisk force disk1sudo diskutil eraseVolume JHFS+ C disk1s2diskutil mountDisk disk1
 

Ref:

man diskutil

The Chromium Projects: Disk Format

Secrets of the GPT

GUID Partition Table

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.