文、專任講師小州

D018.jpg  

前言:
     全新的硬碟購買回來後,通常硬碟需要使用之前都要先經過磁碟分割的動作,並適當的格式化建立檔案系統才可以正常使用。目前許多外接的硬碟,尤其隨身碟這類都已經在出貨之前預先完成這類流程。在 linux 系統環境安裝了適當的硬碟後,通常也會使用適當的磁碟分割工具先完成所需要的自訂分割環境,最終才格式化成為所需要的檔案系統。所以本篇來談談新式 linux 下的磁碟分割工具。


傳統 fdisk 程式:

     傳統大家在 linux 環境下的磁碟分割工具都是使用 fdisk 這個命令,相信許多使用 linux 的管理人員對這個指令都會很熟悉。不過伴隨著目前硬碟製程的進步,單一顆硬碟已經可以高達 2TB 的儲存容量,傳統 MBR 開機磁區內的 Partition Table 的儲存記錄也出現了記錄的定址問題,所以為了解決這個問題就新設計了 GUID Partition Table 磁碟分割表的儲存架構來解決這個問題。不過 linux 環境大家常使用的 fdisk 命令本身並不支援讀取與 建立 GUID 磁碟分割表的格式,所以解決的方式就是使用 GNU 所開發設計的 parted 命令就可以正確支援了。


GNU parted 程式:

      parted 程式本身為 GNU 所開發,雖然說 parted 是一個磁碟分割程式,不過正確來說這個程式本身不單純支援傳統的磁碟分割功能,也支援建立磁碟分割後可以順便格式化建立檔案系統。其他部分也支援分割區的大小調整等功能,是一個完整與多功能複合的磁碟分割整合管理工具。 

     過 parted 命令列方式對許多初學者來說是稍微複雜一點,有一個專案計畫本身為 gparted,本身可以執行於 X 環境下的 parted的圖形介面的程式可以讓操作更簡單達成所需要的目的。詳細可以參考:

http://gparted.sourceforge.net/

GNU parted 程式進入方式:

    本篇使用環境為 RHEL6 環境,所以本篇以該版本 為測試的運作所需環境,執行 parted 程式可以傳入要處理的磁碟的裝置名稱,比方 /dev/sda 與 /dev/hda 等名稱,輸入 help 查看使用的命令,最後使用 quit 結束程式。

             #parted /dev/sda
                .....
                quit

GNU parted 命令項目

     進入 parted 程式後,執行 help 可以列出所有可用的命令項目。不過這邊使用之前需要先告知的是,parted 程式的新增刪除等等命令都是立即進行的,與傳統 fdisk 命令的設計方式不一樣,所以練習時候務必要小心以免遺失資料。這邊簡單介紹相關命令用法,詳細用法部分也可以使用 help 命令,後面傳入要查看的命令說明。比方 help print 這樣使用方式。

        select DEVICE

        可以指定目前工作使用的裝置名稱,比方傳入指定 /dev/sda 與 /dev/sdb 等項目。

        使用範例:select /dev/sdb

        print [devices|free|list,all|NUMBER]

        這是列出相關裝置相關資訊,可以給予不同項目列出不同所需要資訊。
        
        使用範例:print devices

        unit UNIT

指定顯示與處理的單位方式。後面可以傳入 kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB, GiB, TiB 等單位表示。

        使用範例:unit cyl

        rm NUMBER

 這是刪除指定的分割區項目,後面傳入要刪除的分割區編號。編號可以使用 print 先查看確認。

        使用範例:rm 1

要注意是刪除是邏輯分割區的話,結果後續的編號會往前移動遞補上。比方刪除 11 編號的分割區,原本 12 編號分割區往前為 11

        check NUMBER

    檢查指定分割區內的檔案系統是否故障。通常需要先 umount 該使用的裝置後才可以進行。

        使用範例:check 1

        cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER

        複製指定硬碟內的某個分割區內檔案系統內所有的資料到另外一個分割區內

         使用範例:cp 1 2

        resize NUMBER START END

         將指定的分割區空間縮小或是增大,包含所組成的檔案系統空間內容。

         使用範例:resize 2 100 500

         上面表示把編號 2 該分割區檔案系統大小進行調整。比方本來佔用範圍是 100-800 (700MB),調整成為 100-500 (400MB)


        set NUMBER FLAG STATE 與 toggle [NUMBER [FLAG]]

        設定指定分割區的標籤狀態資訊。FLAG 可以傳入 swap, hidden, raid, lvm, lba 等項目。

        使用範例:set 1 boot on         (把 1 該分割區設定為 active 旗標)        
        使用範例:set 2 lvm on          (把 2 該分割區設定為 linux lvm 代碼 8e 磁區)        
        使用範例:set 3 swap on        (把 3 該分割區設定為 linux swap 代碼 82 磁區)       

        move NUMBER START END

        調整分割區的位置。

        使用範例:move 2 200 500

        比方 2 該分割區檔案系統位置本來為 100MB-500MB。上面表示把編號為 2 該分割區檔案系統的位置移動到由 200MB 開始的位置,結束位置為 500MB


        mklabel,mktable LABEL-TYPE

        建立指定分割表類型。LABEL-TYPE 項目可以傳入 msdos, gpt,... 等等項目

        使用範例:mklabel msdos                (傳統的 msdos 分割表類型)
        
        使用範例:mklabel gpt                    (gpt 格式分割表類型)


        mkpart PART-TYPE [FS-TYPE] START END

        建立分割區項目

PART-TYPE 可以傳入 primary, logical, extended 項目,FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目

        使用範例:mkpart primary 100 300              (建立 primary 分割區,類型預設為 linux native,大小為 100MB 到 300MB 的範圍,共 200MB)

        使用範例:mkpart primary linux-swap 300 400(建立 primary 分割區,類型 linux swap,大小為 300MB 到 400MB 的範圍,共 100MB)

         使用範例:mkpart primary ext2 400 800         (建立 primary 分割區,類型預設為 linux native,大小為 400MB 到 800MB 的範圍,共 400MB)


        mkpartfs PART-TYPE FS-TYPE START END 
                
         建立分割區並格式化成為指定格式

          PART-TYPE 可以傳入 primary, logical, extended 項目,FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目

         使用範例:mkpartfs primary linux-swap 100 300        (建立 primary 分割區,類型 linux swap,大小為 100MB 到 300MB 的範圍,共 200MB)

         使用範例:mkpartfs primary ext2 300 800                (建立 primary 分割區,類型預設為 linux native,大小為 300MB 到 800MB 的範圍,共 500MB)


        mkfs NUMBER FS-TYPE

         將指定分割區格式化成為指定格式

         FS-TYPE 可以傳入 ext4, ext3, ext2, fat32, linux-swap,.. 等等項目

         範例:mkfs 1 ext2                (將編號為 1 分割區格式化成為 ext2 檔案系統 )

         範例:mkfs 2 linux-swap        (將編號為 2 分割區格式化成為 linux swap 格式 )

         rescue START END

         傳入指定的範圍,搜尋被刪除的分割區項目並救回

         使用範例:rescue 100 1000        (在 100M 與 1000M 空間範圍內進行搜尋是否有符合被刪除的分割磁區)


GNU parted 實際測試使用:

        目前主機上有兩顆硬碟,分別為 sda 與 sdb。其中 sda 為使用中的硬碟,sdb 為提供測試使用的新硬碟項目。

-----------------------------------------------------------------------------------------------

        [root@localhost ~]# parted /dev/sda
        GNU Parted 2.1
        Using /dev/sda
        Welcome to GNU Parted! Type 'help' to view a list of commands.
        (parted)
        (parted) print devices
        /dev/sda (8590MB)
        /dev/sdb (42.9GB)
        /dev/mapper/system-swap (1074MB)
        /dev/mapper/system-root (7407MB)

使用 print devices 可以查看目前系統所有硬碟可用的區塊裝置項目。

-----------------------------------------------------------------------------------------------
       
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sda: 8590MB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start   End     Size    Type     File system  Flags
         1      1049kB  106MB   105MB   primary  ext4         boot
         2      106MB   8590MB  8484MB  primary               lvm

        (parted)

使用單純的 print 查看目前硬碟資訊,這顆硬碟是使用傳統 msdos 分割表類型,全部大約 8G 多,共兩個分割區。

-----------------------------------------------------------------------------------------------

        (parted) unit cyl
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sda: 1044cyl
        Sector size (logical/physical): 512B/512B
        BIOS cylinder,head,sector geometry: 1044,255,63.  Each cylinder is 8225kB.
        Partition Table: msdos

        Number  Start  End      Size     Type     File system  Flags
         1      0cyl   12cyl    12cyl    primary  ext4         boot
         2      12cyl  1044cyl  1031cyl  primary               lvm

使用 unit 命令切換到傳統 cylinder 的模式顯示

-----------------------------------------------------------------------------------------------       

        (parted) select /dev/sdb
        Using /dev/sdb
        (parted)
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start  End  Size  Type  File system  Flags

       
使用 select 切換工作的硬碟,最後使用 print 查看目前硬碟沒有任何分割區建立

-----------------------------------------------------------------------------------------------

        (parted) mklabel gpt
        Warning: The existing disk label on /dev/sdb will be destroyed and all data on
        this disk will be lost. Do you want to continue? y

        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: gpt

        Number  Start  End  Size  File system  Name  Flags

        (parted)

     使用 mklabel 可以指定硬碟使用不同分割表類型,上面為指定 gpt 格式。若是硬碟超過 2TB 的儲存空間要建立適當分割區,通常需要使用 gpt 格式的分割表。不過需要有 OS 支援才可以正確存取。

-----------------------------------------------------------------------------------------------

        (parted) mklabel msdos
        Warning: The existing disk label on /dev/sdb will be destroyed and all data on
        this disk will be lost. Do you want to continue?
        Yes/No? y

        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start  End  Size  File system  Name  Flags

        (parted)

使用 mklabel 可以指定硬碟使用不同分割表類型,上面為指定傳統的 msdos 分割表格式

 -----------------------------------------------------------------------------------------------

        (parted) mkpart primary 100 200
        (parted) mkpart primary 200 300
        (parted) mkpart extended 300 -1
        (parted) mkpart logical 300 500
        (parted) mkpart logical 501 1000

        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start   End     Size    Type      File system  Flags
         1      99.6MB  200MB   101MB   primary
         2      200MB   300MB   99.6MB  primary
         3      300MB   42.9GB  42.6GB  extended               lba
         5      301MB   500MB   199MB   logical
         6      501MB   1000MB  499MB   logical

分別使用 mkpart 建立 3 個主分割區,最後空間分配建立個延伸分割區,最後再建立 2 個邏輯分割區項目。

這邊附註就是,通常建立分割區時候,空的硬碟第一個分割區建立的位置可以指定 1MB 開始的地方即可使用,上面的操作方式浪費前面快 100MB 的空間沒有使用。

-----------------------------------------------------------------------------------------------

        (parted) set 1 boot on
        (parted) set 5 lvm on
        (parted) set 6 raid on
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start   End     Size    Type      File system  Flags
         1      99.6MB  200MB   101MB   primary                boot
         2      200MB   300MB   99.6MB  primary
         3      300MB   42.9GB  42.6GB  extended               lba
         5      301MB   500MB   199MB   logical                lvm
         6      501MB   1000MB  499MB   logical                raid


        使用 set 命令,將第 1 個分割區設定 active boot flag,將第 5 個分割區改成 linux lvm 分割區項目,將第 6 個分割區改成 linux raid 分割區項目

        (parted) mkfs
        WARNING: you are attempting to use parted to operate on (mkfs) a file system.
        parted's file system manipulation code is not as robust as what you'll find in
        dedicated, file-system-specific packages like e2fsprogs.  We recommend
        you use parted only to manipulate partition tables, whenever possible.
        Support for performing most operations on most types of file systems
        will be removed in an upcoming release.
        Warning: The existing file system will be destroyed and all data on the partition
        will be lost. Do you want to continue?
        Yes/No? y
        Partition number? 1
        File system type?  [ext2]?
        (parted)

        使用 mkfs 將第 1 個分割區程式化成為 ext2fs。若是直接使用 mkfs 1 ext2 會顯示如下訊息:

        (parted) mkfs 1 ext2
        WARNING: you are attempting to use parted to operate on (mkfs) a file system.
        parted's file system manipulation code is not as robust as what you'll find in
        dedicated, file-system-specific packages like e2fsprogs.  We recommend
        you use parted only to manipulate partition tables, whenever possible.
        Support for performing most operations on most types of file systems
        will be removed in an upcoming release.
        Warning: The existing file system will be destroyed and all data on the partition
        will be lost. Do you want to continue?
        parted: invalid token: 1
        Yes/No?
所以改成 mkfs y 1 ext2 就可以正常使用了。不過畫面內來看 parted 不建議使用 mkfs 該命令直接建立檔案系統,使用 e2progfs 套件包內的 mke2fs 等命令建立會比較能夠符合目前更新現況發展。
 -----------------------------------------------------------------------------------------------
       
        (parted) rm 1
        (parted) rm 2
        (parted) rm 3
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start  End  Size  Type  File system  Flags
       
        (parted)
使用 rm 命令,就可以刪除指定分割區項目,所以目前沒有任何建立的分割區項目

-----------------------------------------------------------------------------------------------

        (parted) mkpartfs primary ext2 1 200
        (parted) mkpartfs primary linux-swap 200 300
        WARNING: you are attempting to use parted to operate on (mkpartfs) a file system.
        parted's file system manipulation code is not as robust as what you'll find in
        dedicated, file-system-specific packages like e2fsprogs.  We recommend
        you use parted only to manipulate partition tables, whenever possible.
        Support for performing most operations on most types of file systems
        will be removed in an upcoming release.
        (parted)
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start   End    Size   Type     File system  Flags
         1      1049kB  200MB  199MB  primary  ext2
         2      200MB   300MB  99.6MB  primary linux-swap(v1)


使用 mkpartfs 可以直接建立指定分割區並格式化分割區建立檔案系統。不過 parted 建議還是                            -----------------------------------------------------------------------------------------------

        (parted) rm 1
        (parted) rescue 1 300
        Information: A ext2 primary partition was found at 1049kB -> 200MB.  Do you want
        to add it to the partition table?
        Yes/No/Cancel? yes
        (parted) print
        Model: ATA VBOX HARDDISK (scsi)
        Disk /dev/sdb: 42.9GB
        Sector size (logical/physical): 512B/512B
        Partition Table: msdos

        Number  Start   End    Size    File system     Name     Flags
         1      1049kB  200MB  199MB   ext2
         2      200MB   300MB  99.6MB  linux-swap(v1)  primary

        (parted)

        最後就是刪除 1 這個分割區,然後透過 rescue 命令進行搜尋,最後有找到刪除的分割區並加以復原。最後:本篇簡單介紹了 gnu parted 程式用法,大致上提供了一些常見命令的使用方式,希望可以讓大家對 parted 有一些認識與了解。

 

延伸閱讀

聯成電腦講師專欄:linux 下使用 Exfat 檔案系統格式的儲存裝置

聯成電腦技術前線:談 Linux 系統環境快速建立大量的使用者帳號

聯成電腦分享:擁抱百萬雲端運算產業 競爭力全面升級 

, , , ,

lccnetvip 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • bambooindark
  • >
    "要注意是刪除是邏輯分割區的話,結果後續的編號未往前移動遞補上。比方刪除 11 編號的分割區,原本 12 編號分割區往成為 11 "

    這句話的
    "未往前" 應該是 "會往前"?
    "往成為" 應該是 "往前為"?

    >
    另外我想問一下, 如果現在已經有一個分割區, [/dev/sda1], 位置是 0GiB~100GiB.
    現在想要再分割一個新分割區 [/dev/sda2], 容量 200GiB.
    如果用 parted 的 mkpart 功能, 要怎麼設定起始位置剛好 "貼" 在100GiB 位置的後面呢, 然後往後加 200GiB? (因為 fdisk 可以用 + 號)
    因為我發現 parted 可以設定重疊的分割區(不符合邏輯), 不知道為什麼.
  • bambooindark 早安~~手誤部分已更正~謝謝提醒~下列為小州老師針對問題回覆:
    1. 一般談傳統硬碟組成就是三個項目來計算可用空間,其中就是 Cylinder/Head/Sector,
    把這些數字相乘可以得到全部 Sector 數量,而傳統每個 Sector 是 512Byes 的空間,
    所以再乘上 512 就是硬碟全部的可用空間。早期用 DOS 的年代系統能夠存取硬碟會用到所謂 int 13h 的 bios 呼叫中斷功能,這個存取硬碟溝通讀寫就是指定傳入要應對使用哪個
    Cylinder/Head/Sector 數值來表示要使用哪個硬碟區域,簡單來說這類硬碟存取溝通定址
    一般傳統就稱呼 C.H.S 定址,其中:

    C: 1024 (0-1023), H: 16 (0-15), S: 63(0-62)

    簡單大略算法 1024 * 16 * 63 * 512 = 528482304 = 504MB

    上面這樣定址計算最大是 504MB 上下。

    後來硬碟越來越大要解決而且要與之前相容,所以有 Extended INT 13H 的呼叫,可以讓 H
    到 256 (0-255),一般大約可以定址到 8GB 容量。

    簡單大略算法 1024 * 256 * 63 = 8455716864 = 7.875MB

    2. 受限於當初制定 int 13h 時候本身能夠指定的 Cylinder/Head/Sector 本身的大小限制,
    傳統 C.H.S 存取定址有容量上的定址限制,後來為了解決該問題採用了一個標準叫做 LBA
    存取定址模式,全名為 Logical Block Addressing,簡單說以磁區數量為存取溝通單位為主了, LBA 0 表示第一個磁區,LBA 表示第二個磁區以此類推。而最早期以當初 ATA IDE 硬碟來說用 22bit定址,後來陸續有 ATA-1 甚至到 ATA-6 發展時代,所以定址大小到 ATA-6 已經是改用48bit 來定址了,容量數量支援就可以更大,定址空間以 48bit 來說把這個數值分配直接作為 可分配的磁區數量的話那直接就是表示 2^48 磁區數量,若以 512 bytes/sector 來說就大約 可以到 131072 TB。

    3. 傳統 linux 分割程式都是使用 fdisk 來劃分,而傳統劃分的基礎是以 cylinder(磁柱)
    為單位,雖然底層早就是用 LBA 存取了,所以應對轉換下一般大硬碟來說在分割畫面內大多就是直接會把 Cylinder 數值直接讓他能夠超過 1023 來顯示表示,所以目前在 linux 使用
    fdisk 通常查看都會是上萬個 cylinder 的數值顯示。

    4. linux 環境分割工具很多,傳統 fdisk 是使用 C.H.S 定址顯示方式來分割,不過其實在比較
    晚期的 linux 系統下的 fdisk 工具也預設改用建議改用 Sector 為基礎的顯示與分割動作,
    而 GNU parted 是很早使用預設使用 compact 單位操作,可以指定用 cylinder, sector
    或是多少空間為基礎來分割劃分,底層會用 LBA 地址的磁區結果應對儲存。parted 可以用
    unit 切換預設顯示單位,比方 unit cylinder, unit s, unit compact,而劃分時候
    Start/End 可以在輸入數字之後加上單位,比方 100c, 200s, 100m 這類。

    5. 拉回到原本發問的話題來說,parted 預設應該是使用 compact 呈現單位,所以看到應該預設 會像是 100m - 900m 或是 900m - 100G 等這類顯示格式。compact 預設顯示會以大約佔用 的空間 容量來顯示分配情況,所以以你的問題來說第一個是 0GB-100GB,第二個要建立 200G 的話,一般就是指定起始 100G,結束為 300G 就可以達成需求,parted 會自動轉換好最後實際應對的磁區位置,實際上兩個分割區不會有範圍重疊這類問題,若要確認觀察可以用 unit s 切換 到磁區模式,用 print 查看一下就可以知道實際位於的磁區範圍。另外 parted 沒有辦法用 + 這類指定要增加多少容量範圍。

    6. 這邊補充的是,以 centos linux 6 來說,fdisk 程式在分割預設是使用 cylinder
    為範圍區分,不過可以輸入 u 切換到以 sector 單位來進行劃分。而在 centos 7 開始的
    fdisk 預設也都是使用這個模式了,使用 u 反而是切換到傳統 CHS 顯示模式,不過不建議
    用 CHS 傳統格式來劃分了,除非有特殊原因要不然不建議。再來 fdisk 在磁區顯示模式當下
    結束的位置可以輸入 +100M 這類,就是表示多新增容量要 100M 的分割區,這比 parted 方便。

    7. 另外前幾年開始其實實體的硬碟本身製造以 Sector 來說也不再是使用每個磁區為 512bytes 的 基本單位了,而是改成 4KB 為一個最小單位,一般稱呼 4K 對齊的進階格式,以目前的資料環境 來說也顯的更有效率,不過磁碟分割時候每個分割區劃分也要正確考慮到這個項目,若分割區劃分 沒有切齊這樣 4K 的情況,後續使用這樣分割區時候效能就會降低,所以劃分分割區的位置範圍 要以 8 倍數為基準的磁區位置當區段才能夠讓存取效能達到一般具備的水準。目前的 fdisk 與 parted 都可以自動在劃分注意處理這個議題了,比方 fdisk 預設用 sector 為處理,建立 第一個分割區時候會自動抓起始是 2048 這個磁區劃分,parted 也會自動處理這個情況,並且 若劃分分割區沒有正確對齊也會發出警告。

    提供參考。
    以上謝謝小州老師回覆和bambooindark詢問^^。

    lccnetvip 於 2015/07/03 10:13 回覆

  • bambooindark
  • 感謝 lccnetvip 的回答, 非常的詳細.

    題外話, 之後分割可能有動到什麼東西
    (parted 竟然是同步寫入天啊, 不像 fdisk 預設不會)

    結果開機有問題.
    不過 Grub 重裝又正常可以開機了.
  • 不客氣喔~~
    建議可以去上小州老師的課~可以得到更多收穫~~^^

    lccnetvip 於 2015/08/17 09:51 回覆