用慘痛教訓換來經驗
常常使用Linux做為系統的工程師應該都不陌生ln這個指令
ln是對資料夾建立超連結的指令
以下範例
root@David-MacBook: $ cd /tmp
root@David-MacBook: tmp $ ln -s /opt/web/home/
第一行cd切換目錄到/tmp
第二行是建立超連結到當前目錄(/tmp)並指向/opt/web/home
會得到結果
root@David-MacBook: tmp $ ll
total 0
lrwxr-xr-x 1 root wheel 14 Jan 25 22:59 home $ /opt/web/home
可以看到我們將home這個資料夾成功建立超連結到/tmp
那什麼是超連結?
所謂超連結就是類似windows作業系統的"捷徑",可以藉由超連結的資料夾讀取與原資料夾資料同步的資料
很難理解嗎? 其實就是資料夾的影分身這麼簡單而已,主體是同一個。
那ln這麼簡單的指令會出現哪些問題? 問題可大了
魔鬼藏在細節裡
當你要解除超連結,你會怎麼下指令? rm吧
對 就是rm,反正直接移除超連結跟windows移除捷徑一樣,真正的資料夾是不會影響的吧
錯! 大錯特錯!!
root@David-MacBook: tmp $ ll home/
total 0
-rw-r--r-- 1 root whell 0 Jan 25 23:13 test
root@David-MacBook: tmp $ rm -rf home/
root@David-MacBook: tmp $ ll
total 0
lrwxr-xr-x 1 root wheel 14 Jan 25 22:59 home $ /opt/web/home
root@David-MacBook: tmp $ ll home/
ls: home/: No such file or directory
發現了嗎?
當你下rm -rf home/ 超連結的資料夾並未真正被刪除
但是,裡面的資料卻全部都被刪除了
這是為什麼? 因為超連結被linux視為檔案的一種
而你參數-r 代表遞迴,所以他會將你資料夾內檔案遞迴刪除,但資料夾本身不會被刪除。
這很嚴重,而且難以發現。
那正確的指令下法呢?
root@David-MacBook: tmp $ ll home/
total 0
-rw-r--r-- 1 root wheel 0 Jan 25 23:18 test
root@David-MacBook: tmp $ rm -rf home
root@David-MacBook: tmp $ ll
看出差別了嗎?
只差了一個/
如果你下rm -rf 目錄/ ,便會遞迴刪除裡面的檔案
但如果是rm -rf 目錄 ,便可以成功移除超連結
或是使用unlink也可以成功移除超連結
今天上班就不小心犯了這個很低級的失誤,幸好資料有備份,不然這個年大概不太好過了。
重點整理:
我使用的環境是CentOS
ln -s 目錄 是建立超連結
移除超連結請務必將/去掉,不然會變成遞迴刪除資料夾裡檔案
CentOS 5的版本如果你加上/會提示你無法刪除
但CentOS 6 如果你加上斜線/就真的都把檔案刪除了
使用上請務必小心,或是改用unlink也較為安全
慘痛的教訓。