Mount Linux home directory on another partition or disk.
讓Linux系統與使用者家目錄在開機時於不同磁碟掛載。
1. 情境#
我有一台Surface Go 2,安裝Debian Linux,內部磁碟空間只有64GB,我額外插了一張128GB的SD卡擴充空間,想說可以分擔一下系統內部的磁碟空間壓力。雖說如此,大部分程式的資料還是預設倒在家目錄,少部份程式如Steam手動允許使用者指定外部目錄存放資料。長此以往,SD卡的存放資料目錄會顯的很混亂呀。
考慮到我大部分最佔空間的程式都是以User模式安裝,包括Flatpak和Waydroid的資料,因此我就想直接把Linux的家目錄/home遷移到SD卡上的磁碟分區,讓SD卡成為新的/home。
雖然我知道SD卡速度比eMMC和SSD慢很多,但是依照過往使用Raspberry Pi的經驗,Linux程式放在SD卡啟動其實也沒有慢到不能接受的地步。
2. 讓/home位於不同分區可行嗎?#
這其實是一種安裝Linux系統的常見分區策略。只是現在許多桌面Linux發行版為了簡化操作,都把/與/home放在同一個分區罷了。
將Linux的家目錄/home獨立為一個分區,或者另外一個磁碟上的分區,開機後與系統分區分開掛載。
從原本是這樣:
/ ( /dev/sda1 )
├── bin
├── boot
├── dev
├── etc
├── home
│ └── user
├── lib
├── root
├── usr
└── var變成這樣:
/dev/sda1
└── /
├── bin
├── boot
├── dev
├── etc
├── home --> /dev/sda2/home/user/(掛載點,指向外部磁碟)
├── lib
└── ...
/dev/sda2
└── /
└── user 如果想要的話,甚至可以整個根目錄/分區都放在外部磁碟,但這樣主機就變成一個開機後只有/boot分區下的kernel載入的空殼了!/home無法掛載不打緊,但系統不應該放在外部磁碟。
照理說應該是在系統剛安裝,分割硬碟分區的時候就決定要這樣做。不過如果系統裝完了,也是可以將/home目錄遷移過去再掛載。
這樣做的好處是/home所在的磁碟可以任意擴充儲存空間。重灌系統的時候可迅速恢復資料。
因為我們這裡只是將家目錄掛載到外部硬碟,實際路徑沒有變化,因此不會影響到/etc/passwd檔案對使用者家目錄位置的判定。
壞處就是/home目錄所在的磁碟掛了就不能開機了。可能得進入Emergency Mode修復。
此外,為了使用者的體驗,系統磁碟和家目錄所在的磁碟速度不宜差距過大,否則程式載入速度會受影響。
順便提一下Systemd-homed。傳統上Linux系統是透過useradd指令新增使用者家目錄,例如我現在操作的Debian 13。我沒有用systemd-homed來建立使用者家目錄,將其保存為映像檔。理論上現有使用者資料是能夠轉交給systemd-homed管理的。縱然systemd-homed的homectl --image-path擁有任意指定使用者家目錄掛載位置的能力,但是將現有的/home轉為systemd-homed的這個過程有點複雜。我這裡還是維持手動複製家目錄的方式。而非將現有/home轉為systemd-homed去管理。
3. 過程#
為了不影響到現有使用者資料,推薦使用Root帳號操作。我是用SSH遠端登入,並且不啟動任何圖形化界面。你得確認電腦不會自己進入suspend狀態中斷指令執行。
如果不想要在遷移資料的過程中間連快取和暫存檔都一併複製過去,可以先用BleachBit這類軟體清一下系統垃圾。
我這裡是預計整個外部磁碟分區都掛載到
/home,而非單一目錄,因此外部磁碟不該放其他資料,不然就得用到bind mount了。用
lsblk列出所有磁碟。SSD代號是/dev/sdX,NVME是/dev/nvmeX。這裡以SD卡為例,代號則是/dev/mmcblk1。如果有掛載要先用umount取消掛載。用
fdisk格式化外部磁碟,建立一個EXT4分區,這是大部分Linux系統使用的檔案系統。
# 使用GPT分割表,建立一個新分區
fdisk /dev/mmcblk1
g
n
w
# 格式化為EXT4
sudo mkfs.ext4 /dev/mmcblk1p1- 將其暫時掛載到
/mnt/new_home
sudo mkdir - /mnt/new_home/
sudo mount /dev/mmcblk1p1 /mnt/new_home/- 使用
rysnc工具,將/home這個目錄複製/mnt/new_home/,並保留原有權限。依照檔案大小可能會花一點時間。
sudo rsync -avxHAX /home/. /mnt/new_home/- 確認搬移後的目錄權限是否正確。擁有者應該屬於一般用戶
sudo ls -al /mnt/new_home使用
blkid指令列出所有硬碟分區的UUID。編輯
/etc/fstab,設定開機掛載規則,設定將遷移到外部磁碟的/home/user/在開機後自動掛載到/home。
UUID="UUID" /home ext4 defaults 0 2 - 將舊有家目錄暫時重新命名
sudo mv /home/ /home_backup/重開機,使用
lsblk確認/home的掛載點,應該在外部磁碟登入帳號確認沒問題後,刪除舊有家目錄
sudo rm -rf /home_backup/- 一些程式顯示Linux系統可用空間可能還是只會回報根目錄所在分區的容量。因此用
df -h指令看比較準確。


