快轉到主要內容

如何移動Linux的家目錄/home分區,掛載到外部磁碟

· 民國115年丙午年
·
切換繁體/簡體
分類 Linux系統 Linux使用技巧
標籤 Systemd
目錄

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. 過程
#

  1. 為了不影響到現有使用者資料,推薦使用Root帳號操作。我是用SSH遠端登入,並且不啟動任何圖形化界面。你得確認電腦不會自己進入suspend狀態中斷指令執行。

  2. 如果不想要在遷移資料的過程中間連快取和暫存檔都一併複製過去,可以先用BleachBit這類軟體清一下系統垃圾。

  3. 我這裡是預計整個外部磁碟分區都掛載到/home,而非單一目錄,因此外部磁碟不該放其他資料,不然就得用到bind mount了。

  4. lsblk列出所有磁碟。SSD代號是/dev/sdX,NVME是/dev/nvmeX。這裡以SD卡為例,代號則是/dev/mmcblk1。如果有掛載要先用umount取消掛載。

  5. fdisk格式化外部磁碟,建立一個EXT4分區,這是大部分Linux系統使用的檔案系統。

# 使用GPT分割表,建立一個新分區
fdisk /dev/mmcblk1
g
n
w

# 格式化為EXT4
sudo mkfs.ext4 /dev/mmcblk1p1
  1. 將其暫時掛載到/mnt/new_home
sudo mkdir - /mnt/new_home/

sudo mount /dev/mmcblk1p1 /mnt/new_home/
  1. 使用rysnc工具,將/home這個目錄複製/mnt/new_home/,並保留原有權限。依照檔案大小可能會花一點時間。
sudo rsync -avxHAX /home/. /mnt/new_home/
  1. 確認搬移後的目錄權限是否正確。擁有者應該屬於一般用戶
sudo ls -al /mnt/new_home
  1. 使用blkid指令列出所有硬碟分區的UUID。

  2. 編輯/etc/fstab,設定開機掛載規則,設定將遷移到外部磁碟的/home/user/在開機後自動掛載到/home

UUID="UUID" /home  ext4 defaults 0  2 
  1. 將舊有家目錄暫時重新命名
sudo mv /home/ /home_backup/
  1. 重開機,使用lsblk確認/home的掛載點,應該在外部磁碟

  2. 登入帳號確認沒問題後,刪除舊有家目錄

sudo rm -rf /home_backup/
  1. 一些程式顯示Linux系統可用空間可能還是只會回報根目錄所在分區的容量。因此用df -h指令看比較準確。

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。