我目前堅持使用限制性分割區方案,這使得我的分割區被填滿。它看起來像這樣:
/dev/sda7 870G 315G 511G 39% /
/dev/sda6 2.0G 271M 1.6G 15% /tmp
/dev/sda3 15G 13G 1.5G 90% /usr
/dev/sda2 15G 8.6G 5.0G 64% /var
/dev/sda1 99M 36M 58M 39% /boot
tmpfs 7.9G 0 7.9G 0% /dev/shm
我想將資料移入/usr
(也/var
可能)移至根分區。我並不真正關心分區本身,因此不需要合併。
這樣做的最佳方法是什麼?目前,我的計劃是這樣的:
cp -R /usr /newusr
umount /usr
mv /newusr /usr
難道真的這麼簡單,還是我忽略了一些事情?
答案1
你的做法是正確的。在根分區上建立目錄,將資料複製到那裡,卸載usr
分區並將新目錄移動到usr
.不要忘記/etc/fstab
事後編輯您的內容。
答案2
首先,您應該始終檢查是否有足夠的可用空間。這一次,你做到了。
關於副本:
沒那麼簡單。有些特殊文件的特殊屬性並不總是正確複製。而不是cp -R
,使用
cp -vfa /usr /newusr
如果您想查看目前正在執行的操作,可以使用“-v”標誌來實現。
- 不要忘記編輯
/etc/fstab
更改。 - 警告:重新分區後,核心不能總是重新讀取新的分區表,因此它有可能會進一步使用舊的分區表!這是非常危險的!目前分割區表的核心版本可以在 中找到
/proc/partitions
,磁碟上的分割表可以用fdisk -l /dev/sda
.如果您目前要變更的分割區不匹配,最好重新啟動。
答案3
為了實現這一點,需要在單一使用者模式下或使用 LiveCD(您可以在網路上找到)來完成此操作。
此外,可以在運行時執行此操作(當然有點冒險),但我認為這種方式僅適用於 /var 而不是/usr,一些運行時庫依賴此資料夾。如果確實有效,您可以先在測試機上嘗試。
首先你必須檢查是否有任何進程/服務正在使用/寫入您要移動的目錄。
lsof | grep -E '/usr|/var'
一般來說 /var 仍然用於 pid 和 sock 文件,/usr以及任何庫都需要它。
因此,停止/終止出現的服務和進程。
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
cupsd 723 root 5u REG 8,1 0 8651393 /var/log/cups/error_log
cupsd 723 root 6u REG 8,1 0 8651908 /var/log/cups/page_log
cupsd 723 root 12u unix 0xffff88020d97d780 0t0 9958 /var/run/cups/cups.sock
在這個簡短的範例中,cups 守護程式正在運行並使用這些目錄。如果停止它們,它們將不會出現在 lsof 輸出中。
之後,您需要當前資料的副本,我建議使用 rsync 而不是 cp (為了保留所有內容、權限、符號連結等)
mkdir /mnt/var
mkdir /mnt/usr
做好備份
rsync -avz /var/* /mnt/var
rsync -avz /usr/* /mnt/usr
解除安裝資料夾
umount /var
umount /usr
恢復數據
rsync -avz /mnt/var/* /var
rsync -avz /mnt/usr/* /usr
編輯你的/etc/fstab文件並評論/刪除其中的條目/var和/usr應該安裝在哪裡。
然後您可以啟動所有已停止的服務或重新啟動電腦。如果對於/usr不起作用,你無法停止守護程序(也許你無法殺死它,因為取決於 init pid),唯一的方法是使用 LiveCD。
儘管您沒有提及機器是什麼類型(您的個人電腦、辦公室機器、伺服器等),但它將依賴於此來執行正式的方式。