2015-11-02

[20151224 updated]CentOS 軟捷徑的使用…mount --bind or ln -s

最近因為案子的關係遇到一個問題…就是「捷徑」

windows 上的先不管,反正 vista 以後就有所謂的 hard/soft link 的分別…

在 linux 上會比較常用…在此介紹比較常用的 (對我個人而言)

ln -s src_directory_or_file_path dst_directory_or_file_path
-s: soft link
src_directory_or_file_path: 來源(目標)目錄或檔案的路徑
dst_directory_or_file_path: 目的目錄或檔案的路徑
ln 可以做軟跟硬的連結,但我比較常做的是符號連結 (symbolic link) ,是軟連結的一種,這個觀念就比較是「捷徑」的概念。

例:ln -s /var/log /home/user/a
這指的就是將 /var/log 做蟲洞放在 /home/user/ 改名叫 a



但 ln -s 做完的 symbolic link 其實是一個蟲洞檔案,因為如此,當你使用 ftp 連上去之後,你會看到你做的這個 a 是一個「捷徑檔」,這個觀念跟我們在 windows 系統上右鍵→新增→捷徑時你會看到做完的結果是一個「xxx.lnk」是一樣的…

所以,當無論你 symbolic link 的對象是「目錄」還是「檔案」,目的的那一個東西,它還是一個「檔案」…所以當你建立了 /var/log 到 a 時,雖然我們知道「cd a」會「跳到」 /var/log ,但使用 ftp 連上 user 後,這個「a」就是等同是一個「a.lnk」,是一個檔案…只是屬性是一個「捷徑」。當你在 ftp 中想進入 a 時,並不會 change directory 的,而是 download file 的動作…(當然,還有關係到 chroot ,只是不要講的那麼複雜)…可是,這個狀況要怎麼變成 a 是一個目錄,而且可以實際 change to /var/log ???

這時候,我們可以用 mount

mount 我們比較常拿來掛載 iso-image、cd/dvd rom、usb 等…但使用 --bind 之後,就有軟連結的效果,但這種軟連結不是 symbolic link 。

mount --bind src_target dst_target
--bind: 對應
src_target: 來源(目標)目錄的路徑
dst_target: 目的目錄的路徑
例:mount --bind /var/log /home/user/a
把 /home/user/a 對應到 /var/log ,操作和切換在使用上跟其他無異,只是… mount 所用的 dst_target 一定要是一個已存在的「空目錄」,所以「a」需要先 mkdir 出來;然後做完 bind 指令後,「a」的這個目錄屬性就會承接「/var/log」的目錄屬性…所以在 bind 時要先考量 src_target 自己有沒有權限。

之後再用 ftp ,就會看到「a」的屬性就是一個目錄而不是檔案,只要你有權限,你就可以切換目錄進去了。

***** 2015/12/24 update *****

mount --bind 會遇到重開機之後 mount 消失的狀況,不過基本 mount 的這個動作「本來」就是重開機之後就會失效,不過其實是可以讓它在 boot 後就自動 mount 的,請修改 /etc/fstab …你會發現現在的 linux 會寫著 sata 或 pata 的硬碟 mount 在上面,這樣才會有目前我們系統現行的結構…

所以要留意,我們 mount --bind 是 mount 在 sata 成功 mount 之後的目錄,所以我們接下來要寫的東西最好是放在放著我們目錄的硬碟被 mount 之後…

比如,/dev/sda1 是我們的一顆 250G 的 SATA 硬碟,但這顆硬碟在 linux 的磁區是 /new_sda1,這硬碟中有一個 /ABC 的目錄,這個目錄我們要對應到 /home/user/a 中…我們可以這樣寫

/etc/fstab
......
......
......
(上面省略)
/dev/sda1 ................. (這邊我不細寫,反正就是 /dev/sda1 被 mount 到目前一個位置 /new_sda1 )
/new_sda1/ABC /home/user/a none bind 0 0

「/new_sda1/ABC /home/user/a none bind 0 0」要記得放在「/dev/sda1 /new_sda1 ext3 defaults ? ?」之後,因為 /dev/sda1 要被 mount 成 /new_sda1 之後,我們才找得到 /new_sda1 的位置,如果放在之前,可能會有問題。

指令格式請閱:https://www.freebsd.org/doc/zh_TW/books/handbook/mount-unmount.html

沒有留言: