首頁 > 軟體

Linux中建立回環裝置(loopback device)的方法

2020-06-16 16:56:20

你有沒有想過在Linux的檔案管理系統中再建立一個檔案系統,就像在Windows中建立一個新的磁碟分割區那樣(但其實並不必非得直接那麼做)。這時你就需要用到回環裝置(loop device)。

在Linux中,回環裝置允許使用者以一個普通磁碟檔案虛擬一個塊裝置。設想一個磁碟裝置,對它的所有讀寫操作都將被重定向到讀寫一個名為 virtualfs 的普通檔案而非操作實際磁碟或分割區的軌道和磁區。

當然,virtualfs這個名字你可以任意取,但這個檔案必須存在於一個實際的磁碟上,而這個實際的磁碟必須比虛擬的磁碟(virtualfs)容量更大。回環裝置允許你這樣使用一個普通檔案。With a loopback device in Linux, one can easily create a Linux loopback file system on a regular disk file, and not directly using a disk partition!

回環裝置的使用與其它任何塊裝置相同。特別是,你可以在這個裝置上建立檔案系統並像普通的磁碟一樣將它掛載在系統中。這樣的一個將全部內容儲存在一個普通檔案中的檔案系統,被稱為虛擬檔案系統(virtual file system)。

下面就來演示用一個regular磁碟檔案建立一個Linux回環檔案系統的步驟。

【Step1】 建立一個用於承載虛擬檔案系統的空檔案。這個檔案的大小將成為掛載後檔案系統的大小。建立指定大小檔案的簡單方法是通過 dd 命令。這個命令以塊為單位(通常為 512 位元組,或者你也可以自定義塊大小)從一個檔案向另一個檔案複製資料。/dev/zero 檔案則是一個很好的資料來源。

要在根目錄下(root directory)建立一個 30 MB 大小(zero-filled)的名為 virtualfs 的檔案可以通過以下命令:

$sudo dd if=/dev/zero of=/virtualfs bs=1024 count=30720

你可以使用下面的命令來檢視剛建立之檔案的情況:

$ls -l /virtualfs

【Step2】 回環裝置以 /dev/loop0、/dev/loop1 等命名。每個裝置可虛擬一個塊裝置。為了確認當前系統是否有在使用回環裝置,你需要使用下面的語句

$losetup /dev/loop0

如果 /dev/loop0 已經存在,你會得到類似下面的結果。然後你就需要把 /dev/loop0 替換成 /dev/loop1, 或者再把 /dev/loop1替換成/dev/loop2, 並以此類推,直到找到一個空的回環裝置為止。

現在假設 /dev/loop0 並沒有被佔用,如下圖所示:

【Step3】 接下來使用losetup命令來把常規檔案或塊裝置(/dev/loop0)關聯到一個loop檔案(virtualfs)上。注意只有超級使用者才有許可權設定回環裝置。

$sudo losetup /dev/loop0 /virtualfs

到這一步,你可以在命令列中輸入echo $? 來確認 the previous step is completed successfully without error。在進行原始碼編譯,或者執行命令無法確認所執行的命令是否成功執行的情況下,我們都會使用 echo $? 來進行測試。如果返回值是0,就是執行成功;如果是返回值是0以外的值,就是失敗。

這裡面其實利用了“進程生命週期”的原理:當一個進程執行完畢時,該進程會呼叫一個名為 _exit 的例程來通知核心它已經做好“消亡”的準備了。該進程會提供一個退出碼(一個整數)表明它準備退出的原因。按照慣例,0用來表示正常的或者說“成功”的終止。也就是說我們在執行 echo $? 時反回的值就是進程的退出碼。而且,這個退出碼是由剛剛執行完的進程提供給系統核心的。

【Step4】 接下來需要在回環裝置上建立一個 Linux EXT3 檔案系統(with 1% reserved block count),而該檔案當前已經被關聯到一個普通的磁碟檔案上了。為此輸入:

$sudo mkfs -t ext3 -m 1 -v /dev/loop0

如下圖所示:

這樣一來,我們就在已有的檔案系統中又建立了一個檔案系統,而這個過程並非採用對磁碟進行直接分割區的方式。

【Step5】 然後我們在需要在 /mnt 中建立一個資料夾來作為掛載點(mount point),於是輸入

$sudo mkdir /mnt/vfs

接下來就是把回環檔案系統(其實就是一個普通的磁碟檔案)掛載(mount)到上面剛剛建立的目錄上(/mnt/vfs),這樣就算完成了一個“regular” Linux EXT3檔案系統的建立。為此,需要輸入

$sudo mount -t ext3 /dev/loop0 /mnt/vfs

如下圖所示:

所謂的『掛載』就是利用一個目錄當成進入點,將磁碟分割區槽的資料放置在該目錄下;也就是說,進入該目錄就可以讀取該分割槽(partition)的意思。這個動作我們稱為『掛載』,那個進入點的目錄我們稱為『掛載點』。由於整個Linux系統最重要的是根目錄,因此根目錄一定需要掛載到某個分割槽的。至於其他的目錄則可依使用者自己的需求來給予掛載到不同的分割槽。

現在,所有的 Linux 檔案系統相關的命令就都可以在上面建立的這個檔案系統中使用了。例如,你可以輸入 df -h來確認其 “disk usage”,或者輸入 tune2fs -l /dev/loop0 來輸出它的檔案系統設定,等等。例如下面的例子中,我們在其中建立了一個資料夾tmp_dir,然後用ls來列出這個磁碟中的內容。請注意 lost+found 是一個由 mkfs 自動建立的資料夾一旦檔案系統被破壞,部分資料被回復但沒有與任何檔案關聯起來,將被放置在這個資料夾中。

注意,輸入sudo echo 'hello world!'>test.txt是不可以的,這會導致Permission denied。因為The redirection(>) is done by the shell before sudo is even started. 所以你要使用上面圖中所示的指令。另外,使用nano來建立或編輯檔案,也要使用超級使用者許可權,即sudo nano test.txt,否則就可能無法儲存。

【Step6】 最後在結束使用後,需要解除安裝這個檔案系統。事實上,你可以刪除檔案,或者之後再次掛載並使用其中的檔案。你甚至可以將這個檔案複製到遠端主機並在那裡掛載、使用——檔案系統的內容完全不會受到影響。

前面我們提過,losetup被用來建立和控制loop檔案,把常規檔案或塊裝置關聯到一個loop檔案上。但是當使用 -d 時就表示刪除關聯到loop裝置的檔案檔案或裝置。所以我們首先輸入

$sudo losetup -d /dev/loop0

然後再使用下面的命令

$sudo umount /mnt/vfs

便可以將已經掛載的回環檔案系統解除安裝了。

本文永久更新連結地址http://www.linuxidc.com/Linux/2018-01/150455.htm


IT145.com E-mail:sddin#qq.com