1. 程式人生 > >linux 不改變目錄結構移動 home 目錄到新分割槽

linux 不改變目錄結構移動 home 目錄到新分割槽

問題提出

公司的開發測試伺服器部署在阿里雲, 阿里雲給出的例項一般都是隻有一個分割槽, 20G到40G的樣子, 然後再買儲存掛載到其他目錄.
而 home 目錄是在這個 20G 的跟目錄分割槽下的. 隨著開發人員增多, 根目錄分割槽很快被大家填滿了.
因為是多地研發, 因此需要一個無感知的給大家的 home 搬家的方案.

基本原理

接到這個任務, 首先想到的就是 bind mount 方式:

mount --bind /some/where /else/where

可以實現無感知搬家 home.

感覺搜尋中文沒有對這個命令解釋太清楚的. 這篇問答 講的比較清楚, 英文好的同學可以參考下.
當然, 也可以問”男人”: man mount

具體操作

首先選個夜深人靜的時候, 使用 who 命令檢視還有那些小朋友賴在伺服器不肯走, 打電話一一清場:

$ who
Frodo    pts/0        2017-04-17 09:07 (xx.xxx.xxx.xx)
Sam      pts/1        2017-04-18 08:45 (xx.xxx.xxx.xx)
Pippin   pts/3        2017-04-18 09:06 (xx.xxx.xxx.xx)
Merry    pts/4        2017-04-18 09:07 (xx.xxx.xxx.xx)

確定四下無人後, 開始搬家(複製). 使用 cp 命令複製時, 記得帶上 -p 引數, 保留檔案許可權設定. 使用 root 許可權, 假設目標分割槽為 /new_disk :

# cp -p -r /home /new_disk/

新家已經建好, 我們先給老家弄個另外的門牌號, 以免把門牌號給新家後, 找不到老家了. 利用 mount –bind 把原 home 目錄掛載到一個新目錄:

# mkdir /home_bkp
# mount --bind /home /home_bkp

這時我們就可以在 /home_bkp 這個目錄下找到老家的所有檔案. 可以把 /home 這個門牌給新家了:

# mount --bind /new_disk/home /home

搬家完成! 可以通知小夥伴們愉快的工作了. 事實上, 可以不通知大家, 搬家這個事情對大家其實是無感知的.
當然有同學會問, 新家老家門牌一樣, 都是 /home, 我怎麼知道搬家是否成功? 可以使用 df 命令確認:

# cd /home_bkp
# df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G   17G  2.1G  90% /
# cd /home
# df -h .
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb1      296G   42G  240G  15% /new_disk

-h 為 human-readable, 不加的話也可以, 那列出的就是”反人類”的塊為單位了.
上面的命令, 先去老家看看, 掛載點是 /; 再去新家看看, 掛載點是 /new_disk. 這下可以放心了.

持久化

工作還沒完. 上面的工作只是保證了當前新家換地址. 但重啟後, 這個資訊會丟失, 家地址會換回去. 我們需要想辦法保留這個資訊.
修改 /etc/fstab 檔案即可. 開啟這個檔案, 在最後面加入下面兩行:

/home            /home_bkp  none  bind  0 0
/new_disk/home   /home      none  bind  0 0

這樣整個 home 切換分割槽工作就完成了.

後記

這個方案是心血來潮想出來的, 並沒有找到前車之鑑. 目前看還沒出現啥問題, 大家工作的都很愉快, 甚至很多人都不知道有這件事情.
有高手路過發現問題的話, 也請留言指點一二.

又後記: 在此方案下已工作半年, 未出現問題.