[LINUX] Arch Linux 硬碟拷貝式裝系統+新增 home 分割槽

beautifulzzzz發表於2021-11-10


前言

公司發的電腦是 128G SSD + 512G 機械硬碟,我當時直接將 Arch Linux 裝在了 SSD 上,分割槽形式如下:

➜  ~ lsblk -f           
NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                         
├─sda1
│    swap   1           ee4a2a29-3f56-4f87-b905-93039bd54e66                [SWAP]
└─sda2
     ext4   1.0         68d3f420-6e49-4e45-9bdd-a83575de198e   118.1G   99% /

整個電腦只剩下 8G 左右的 SSD,經常用一段時間就得想辦法清一清,實在忍受不了了,決定搞一個 256G 的 SSD,將老的換掉!!!

本文介紹該操作的詳細過程,涉及到:

1)硬碟整個拷貝技術
2)新建 home 分割槽技術
3)修改 fstab 實現自動掛載


1. 實操

1.1 整個磁碟拷貝

  • 將 SSD 插入原電腦,被識別為 /dev/sdb
  • 利用 sudo fdisk /dev/sdb 將其現有分割槽全部刪除
  • 利用 sudo mkfs.ext4 /dev/sdb 將其格式化
  • 利用 sudo dd if=/dev/nvme0n1 of=/dev/sdb 將原硬碟拷貝到新硬碟(會2個小時左右,時間較長)

1.2 建立 home 分割槽

  • 此時將新 SSD 安裝到主機板上,配置電腦從該新硬碟啟動,會發現我們已經複製了一個一模一樣的系統(假設新硬碟被識別為 /dev/sda

  • 利用 sudo fdisk /dev/sda 將新硬碟剩下的 100G 左右的空間建立一個主分割槽:/dev/sda3

  • 利用下列命令,將 /dev/sda3 掛載到 /mnt/home 下(拷貝過程中有些 cache 檔案報錯,可以不管)

    cd /mnt
    sudo mkdir home
    sudo mount /dev/sda3 /mnt/home
    
  • 利用 sudo cp -ra /home/* /mnt/home 將現在的 home 下的內容拷貝到 /mnt/home 下

  • 利用下列命令,將 /dev/sda3 重新掛載到 /home

    sudo umount /dev/sda3
    cd /
    mv home home_bk
    sudo mkidr home
    sudo mount /dev/sda3 /home
    

1.3 修改 fstab 實現自動掛載

  • 檢視當前的 fstab:

    ➜  /mnt cat /etc/fstab 
    # Static information about the filesystems.
    # See fstab(5) for details.
    
    # <file system> <dir> <type> <options> <dump> <pass>
    # /dev/nvme0n1p2
    UUID=68d3f420-6e49-4e45-9bdd-a83575de198e	/         	ext4      	rw,relatime	0 1
    
    # /dev/nvme0n1p1
    UUID=ee4a2a29-3f56-4f87-b905-93039bd54e66	none      	swap      	defaults,pri=-2	0 0
    
  • 檢視當前 /dev/sda 分割槽情況:

    ➜  ~ lsblk -f           
    NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
    sda                                                                         
    ├─sda1
    │    swap   1           ee4a2a29-3f56-4f87-b905-93039bd54e66                [SWAP]
    ├─sda2
    │    ext4   1.0         68d3f420-6e49-4e45-9bdd-a83575de198e   69.1G    31% /
    └─sda3
         ext4   1.0         b8f27505-9096-4717-84ae-eb23dd3a7cd6   35.9G    60% /home
    
  • 對比上面兩步的資訊,我們只需要將 sda3 的掛載資訊寫入 fstab 中,最終 fstab 如下:

    ➜  /mnt cat /etc/fstab 
    # Static information about the filesystems.
    # See fstab(5) for details.
    
    # <file system> <dir> <type> <options> <dump> <pass>
    # /dev/nvme0n1p2
    UUID=68d3f420-6e49-4e45-9bdd-a83575de198e	/         	ext4      	rw,relatime	0 1
    
    # /dev/nvme0n1p1
    UUID=ee4a2a29-3f56-4f87-b905-93039bd54e66	none      	swap      	defaults,pri=-2	0 0
    
    UUID=b8f27505-9096-4717-84ae-eb23dd3a7cd6	/home		ext4		defaults	0 0
    
  • 刪除 home_bk,重啟系統,系統會檢查 sda3,可能會報一些 cache 檔案的錯誤,到時候按照說明,將這些 cache 檔案忽略或刪除即可。


2. 涉及到的知識點

2.1 fstab

fstab 檔案可用於定義磁碟分割槽,各種其他塊裝置或遠端檔案系統應如何裝入檔案系統。系統啟動會根據該檔案呼叫 mount 命令,將相應分割槽掛載到合適地方。如何讀懂修改該檔案,只需要看參考連結[1]即可獲得詳細資訊。


2.2 dd 命令

dd:用指定大小的塊拷貝一個檔案,並在拷貝的同時進行指定的轉換。常用來硬碟/分割槽拷貝、備份,例如:

1.將本地的/dev/hdb整盤備份到/dev/hdd

dd if=/dev/hdb of=/dev/hdd

2.將/dev/hdb全盤資料備份到指定路徑的image檔案

dd if=/dev/hdb of=/root/image

3.將備份檔案恢復到指定盤

dd if=/root/image of=/dev/hdb

4.備份/dev/hdb全盤資料,並利用gzip工具進行壓縮,儲存到指定路徑

dd if=/dev/hdb | gzip > /root/image.gz

5.將壓縮的備份檔案恢復到指定盤

gzip -dc /root/image.gz | dd of=/dev/hdb

......

更多,請看參考連結[2]


2.3 fdisk 命令

1)fdisk -l 可用於檢視硬碟和分割槽情況

➜  ~ sudo fdisk -l
[sudo] password for btfz: 
Disk /dev/sda: 223.57 GiB, 240057409536 bytes, 468862128 sectors
Disk model: KINGSTON SV300S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdbdddf59

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1            2048  16779263  16777216     8G 83 Linux
/dev/sda2        16779264 250069679 233290416 111.2G 83 Linux
/dev/sda3       250071040 468862127 218791088 104.3G 83 Linux


Disk /dev/sdb: 111.79 GiB, 120034123776 bytes, 234441648 sectors
Disk model: KINGSTON SA400S3
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xd863d634

Device     Boot Start       End   Sectors   Size Id Type
/dev/sdb1        2048 234441647 234439600 111.8G 83 Linux


Disk /dev/sdc: 14.84 GiB, 15931539456 bytes, 31116288 sectors
Disk model: Storage Device  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x044a6a07

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdc1  *     2048 31116287 31114240 14.8G  c W95 FAT32 (LBA)

2)fdisk /dev/sda 可用於建立和刪除分割槽(該例子摘抄參考連結[3]

fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p        #檢視分割槽表資訊

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005210c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1301    10240000   83  Linux
/dev/sda3            1301        1497     1572864   82  Linux swap / Solaris
/dev/sda4            1497        2611     8952832   83  Linux

Command (m for help): d           #刪除分割槽
Partition number (1-4): 4         #刪除第四個

Command (m for help): p       #再次檢視分割槽資訊,/dev/sda4已被刪除

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005210c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1301    10240000   83  Linux
/dev/sda3            1301        1497     1572864   82  Linux swap / Solaris

Command (m for help): n      #建立新的分割槽
Command action
   e   extended
   p   primary partition (1-4)
p             #建立為主分割槽
Selected partition 4
First cylinder (1497-3916, default 1497):          #經對比,正好和上一個磁碟柱一致,預設即可
Using default value 1497
Last cylinder, +cylinders or +size{K,M,G} (1497-3916, default 3916): 
Using default value 3916              #直接預設就可以

Command (m for help): p               #檢視分割槽表資訊

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0005210c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1301    10240000   83  Linux
/dev/sda3            1301        1497     1572864   82  Linux swap / Solaris
/dev/sda4            1497        3916    19436582   83  Linux

Command (m for help): wp       #儲存並退出,如果建立有誤,直接退出不要儲存即可
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

2.4 lsblk 命令

lsblk(列出塊裝置)命令用於列出所有可用塊裝置的資訊,但是,它不會列出RAM盤的資訊。塊裝置有硬碟,快閃記憶體盤,CD-ROM等等。

➜  /mnt lsblk -f
NAME   FSTYPE FSVER LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                 
├─sda1 swap   1                 ee4a2a29-3f56-4f87-b905-93039bd54e66                [SWAP]
├─sda2 ext4   1.0               68d3f420-6e49-4e45-9bdd-a83575de198e   69.1G    31% /
└─sda3 ext4   1.0               b8f27505-9096-4717-84ae-eb23dd3a7cd6   35.8G    60% /home
sdb                                                                                 
└─sdb1 ext4   1.0               3107bb63-4029-433b-9131-5536ab2f3664                
sdc                                                                                 
└─sdc1 vfat   FAT32 ARCH_202110 E01F-1B25                                 

後記

這篇文章記錄了,如何拷貝並擴容一個 Arch Linux 系統,樓主這樣操作後終於不用再擔心硬碟資源不夠的問題了~,希望其他人遇到相同問題時可以幫助快速解決問題。


連結

[1]. fstab arch doc
[2]. linux命令總結dd命令詳解-琴酒網路
[3]. Linux下使用fdisk擴充套件分割槽容量
[4]. 1、virtualbox中安裝archlinux+i3桌面,並做簡單美化
[5]. ARCH LINUX 常見問題及實用工具彙總



: 陸續更新中...

相關文章