成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux 式套娃,把“文件系統”安裝在一個“文件”上?

系統 Linux
Linux 的套娃還遠不止這些。舉個例子,loop 設備綁定的文件,它可能也是抽象出來的一個文件,比如是一個網絡文件系統抽象出來的文件。那這條 I/O 鏈路就更長了。只要你敢想,在 Linux 中,存在無限套娃的可能。

圖片


背景

“文件”在文件系統之中,這是人人理解的概念。但“文件”之上還有一個文件系統?那豈不是成套娃了。但這個其實是可以的。這個就涉及到今天我們要講的 loop 設備。

很多童鞋在學習 Linux 的文件系統時,涉及到對磁盤設備的格式化,掛載等操作,但苦于沒有一個真實的硬盤,一時不知道如何實踐。這種時候就可以使用一個文件來模擬塊設備。這就是 loop 設備的作用。我們借助 loop 設備,可以讓一個文件被當做一個塊設備來訪問。

舉個例子,我們在 ext4 的文件系統目錄下創建了一個 minix_test.img 文件,把它當作一個塊設備,在上面格式化 minix 的文件系統,并掛載到 /mnt/minix 上。示意圖如下:

圖片圖片

這種方式有兩個很明顯好處:

不需要真實的硬盤,就可以格式化、掛載、測試文件系統。

可以近距離的觀察文件系統對塊設備的使用,比如如何劃分 inode 區域、數據區域、位圖區域等。這些都將反饋到文件上。

如何使用 loop 設備?

接下來看下如何使用 loop 設備。我們將會用一個普通文件上格式化成 minix 文件系統,然后掛載到 Linux 目錄樹上。我們使用 loop 設備有兩種方式:

  1. 一種是直接 mount 帶上 -o loop 的參數。這種省去了顯式創建 loop 設備的過程,步驟簡單。
  2. 另一種方式是先顯式的創建 loop 設備,該 loop 設備綁定一個文件,并提供了塊設備的對外接口。我們就可以把這個 loop 設備當作一個普通的塊設備文件,進行格式化,然后掛載到目錄上。

方式一:mount -o loop

用 mount 掛載文件系統的時候,指定某個文件以 loop 設備的方式進行掛載。具體操作如下:

首先,我們創建一個 1GiB 的文件:

dd if=/dev/zero of=./minix_test.img bs=1M count=1024

然后,我們在這個文件上進行 minix 文件系統的格式化:

mkfs.minix ./minix_test.img

最后,我們用 loop 設備的方式進行掛載:

mount -o loop ./minix_test.img /mnt/minix/

這樣掛載成功之后,就可以在 /mnt/minix 下進行操作了。該目錄掛載的是 minix 類型的文件系統。minix 文件系統是一個磁盤類型的文件系統,它的數據是會寫到磁盤進行持久化。所以,我們在這個 /mnt/minix 目錄下做的任何操作,這些都會反映到 ./minix_test.img 這個文件上。這個文件就像磁盤一樣,在這個上面承載了一個文件系統的數據。

可以嘗試在 /mnt/minix 目錄下創建一個文件,然后用 hexdump 工具查看 minix_test.img 的內容變化。如下:

# 在 minix 文件系統之上創建一個文件,并寫入一個字符串
echo "hello world" >> /mnt/minix/hello.txt

# 查看 minix_test.img 的內容
hexdump -C ./minix_test.img

如果你對 minix 文件系統的分區熟悉的話,就可以明顯看到 minix 是如何在 minix_test.img 文件上劃分的 inode 區域、數據區域、位圖區域等。

方式二:先創建 loop 設備,再掛載使用

這種方式稍微步驟多一點,但其實更容易讓人理解其中原理。實際的效果和方式一是等價的。我們可以使用 losetup 命令來管理 loop 設備。

首先,我們創建一個 1GiB 的文件:

dd if=/dev/zero of=./minix_test.img bs=1M count=1024

然后,我們在這個文件上進行 minix 文件系統的格式化:

mkfs.minix ./minix_test.img

再然后,創建和使用 loop 設備:

# 方式一:假定 /dev/loop5 是空閑可用的 loop 設備,下面把 /dev/loop5 和 minix_test.img 關聯起來
losetup /dev/loop5 ./minix_test.img

# 方式二:可以簡單一點,讓 losetup 命令自動找到一個空閑的 loop 設備,然后進行關聯
losetup --find --show ./minix_test.img

創建完 loop 設備之后,可以用 losetup 命令列舉當前所有的 loop 設備,和它們關聯的文件。

最后,把 loop 設備掛載到目錄上:

# 假設上一個步驟創建的是 /dev/loop5 
mount /dev/loop5 /mnt/minix

這種方式掛載的文件系統和方式一本質上是一樣的。

mount 和 losetup 等命令的源代碼都在 util-linux 開源庫中,感興趣的童鞋們可以自行查看。

什么是 loop 設備?

本質上來講,loop 設備是塊設備的一種特殊的驅動實現。接下來我們來簡單看下 loop 設備的基本原理。

loop 設備的原理

loop 就是一種特殊的塊設備驅動。loop 設備是一種 Linux 虛擬的偽設備,它和真實的塊設備不同,它并不代表一種特定的硬件設備,而僅僅是滿足 Linux 塊設備接口的一個虛擬設備。它的作用就是把一個文件模擬成一個塊設備。

loop 設備它是怎么模擬的塊設備?

loop 設備的代碼位于 Linux 的 drivers/block/loop.c 中。在這個文件中,它定義了塊設備驅動的接口。

塊設備驅動的編程范式:

  1. 首先,要分配并初始化一個 gendisk 結構體,這是內核代表塊設備的核心結構體。它包含了與磁盤相關的信息,loop 設備作為一種特殊的塊設備驅動,這個自然是不能少的。
  2. 然后,初始化一個請求隊列。塊設備使用請求隊列來管理對設備的 I/O 請求。文件系統調用 submit_bio 的調用時,最終就是把請求投遞到驅動的隊列中。
  3. 然后,請求處理函數。這個很容易理解,隊列里的請求總是要處理的,每個塊設備驅動都可以自定義處理方式。
  4. 最后,塊設備操作表(block_device_operations),這個將包含對設備的操作方法,比如打開,讀寫控制等。

loop 設備如何關聯到后端“文件” ?

用戶態的處理( losetup 或 mount )

  • 打開后端“文件”,拿到文件描述符。
  • 打開 loop 設備文件,拿到 loop 設備的描述符。
  • 調用 ioctl 把這兩個關聯起來ioctl(dev_fd, LOOP_CONFIGURE, &lc->config)

內核的處理

  • ioctl 的系統調用對應調用 loop 中的 lo_ioctl 函數。

對應了 block_device_operations 的 ioctl 方法。

  • 當設置參數為 LOOP_CONFIGURE 的時候,會調用 loop_configure 來分配和初始化 loop 設備。
  • loop_configure
  • 獲取到后端“文件”的句柄,也就是 struct file* 結構。獲取到之后,會做一些校驗工作。然后初始化 loop 設備相關的結構體,隊列等。

  • 最關鍵的當然還是把 loop 設備和后端“文件”的句柄關聯起來:lo->lo_backing_file = file; 這樣的話,等到讀寫 loop 設備的時候,就可以把請求轉發過去。

loop 設備的請求來自于哪里?

loop 設備它對外就是一個塊設備,如果在這個之上創建了文件系統,并被當作塊設備掛載到目錄上之后,那么它的請求來自于它之上的文件系統。

文件系統調用 submit_bio ,把請求投遞到塊層的隊列中。每一個塊層的設備它都需要實現一個入隊的處理,以供 submit_bio 的流程中調用。

static const struct blk_mq_ops loop_mq_ops = {
   .queue_rq       = loop_queue_rq,
   .complete = lo_complete_rq,
};

loop 設備實現的入隊方法就是 loop_queue_rq 。文件系統調用 submit_bio 之后最終就會調用到 loop_queue_rq 這個函數。

> loop_queue_rq
    > loop_queue_work

loop_queue_work 函數會把請求放到一個 lo->workqueue 隊列中,每一個 loop 設備都對應有這么一個隊列。在創建設備文件的時候會同步生成。

loop 設備如何把請求傳遞給后端文件?

loop 設備還有一個名為 loop_workfn 的函數,是專門用來處理投遞到該設備的請求。

> loop_workfn
    > loop_handle_cmd
        > do_req_filebacked

在 do_req_filebacked 函數中,會按照不同的命令類型來處理請求,比如,寫請求會調用 lo_write_simple ,讀請求會調用 lo_read_simple 等。

在這個 lo_write_simple  函數中,就會調用 lo_write_bvec ,把寫請求寫入關聯的“文件”中。

static int lo_write_simple(struct loop_device *lo, struct request *rq,
  loff_t pos)
{
    // lo_backing_file 代表當前 loop 設備關聯的文件
    ret = lo_write_bvec(lo->lo_backing_file, &bvec, &pos);
}

在 lo_write_bvec 中,調用的是 vfs_iter_write 函數來進行寫入。這個函數其實是 VFS 層的一個封裝函數,所以相當于就是從頂層調用后端文件的寫操作。

在 lo_write_bvec 中,最關鍵的是 lo->lo_backing_file 這個文件句柄的獲取。它的類型是 struct file* ,代表了一個內核打開的文件。即該 loop 設備關聯的文件。它的賦值就是在 loop 設備創建的時候。

Linux 套娃之后,I/O 鏈路是什么樣的?

現在來看下,當我們使用 loop 設備,來掛載一個 minix 文件系統,它的 I/O 路徑又會是怎么樣的呢?

假定創建的 minix_test.img 位于一個 ext4 文件系統。

應用程序 -> 系統調用 -> vfs -> minix 文件系統 -> 塊層 -> loop 設備 -> 綁定的文件 ->  vfs -> ext4 -> ...

示意圖如下:

圖片圖片

loop 設備的典型應用有哪些?

其實,loop 設備在很多場景下我們都用過。以下是比較典型的例子:

  • 系統模擬和測試:可以使用 loop 設備來模擬不同的存儲配置,無需使用物理硬件,就可以進行軟件測試或系統配置實驗。
  • 文件系統開發:開發者可以使用 loop 設備來掛載文件系統,從而方便地測試和調試新的文件系統。
  • ISO 映像掛載:Loop 設備還常用于掛載 ISO 文件,無需刻錄到物理介質上,使其內容可直接訪問。
  • 加密磁盤:loop 設備還能和一些加密技術(如dm-crypt)結合,因為 loop 設備可以綁定幾乎任意類型的文件,這就給了人們無限的想象空間。我們可以創建一個加密的磁盤鏡像,增強數據安全。

其實,Linux 的套娃還遠不止這些。舉個例子,loop 設備綁定的文件,它可能也是抽象出來的一個文件,比如是一個網絡文件系統抽象出來的文件。那這條 I/O 鏈路就更長了。只要你敢想,在 Linux 中,存在無限套娃的可能。

總結

  • 沒有磁盤也想玩磁盤類文件系統?可以,用 loop 設備。只要你有文件,Linux 的 loop 設備都可以把文件變成一個“塊設備”。
  • loop 設備就是一種特殊的塊設備驅動。
  • 文件之上的的文件系統的增、刪、改、查的 I/O 請求,它都將落到文件上。這個可以讓我們近距離的觀察到文件系統是如何管理磁盤的。
  • hexdump 是個好工具,可以用來查看文件上的二進制內容。
責任編輯:武曉燕 來源: 奇伢云存儲
相關推薦

2014-04-02 09:39:15

Ceph分布式文件系統

2021-05-31 07:50:59

Linux文件系統

2011-01-13 14:10:30

Linux文件系統

2015-09-11 14:59:41

bcachefs文件系統Linux

2020-07-22 14:53:06

Linux系統虛擬文件

2011-03-07 09:11:23

2010-01-14 09:52:27

linux文件系統

2010-11-01 05:50:46

分布式文件系統

2010-01-21 09:15:05

Linux嵌入式文件系

2010-12-20 10:42:59

Linux文件系統

2021-06-06 16:55:22

Linux文件系統

2021-04-12 05:44:44

Linux文件系統

2013-05-27 14:46:06

文件系統分布式文件系統

2020-07-14 18:00:33

樹莓派網絡文件系統Linux

2009-10-28 13:29:14

Linux文件系統安裝

2009-12-22 15:12:33

Linux擴展文件系統

2009-12-25 09:58:46

linux劃分文件系統

2019-09-20 10:04:45

Linux系統虛擬文件

2018-08-24 10:10:25

Linux文件系統技術

2009-12-14 13:14:57

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久久久午夜片 | 精品一区二区免费视频 | 激情小视频 | 欧美久久久电影 | 亚洲欧洲激情 | 日本黄色高清视频 | 免费国产一区二区 | 1区2区3区视频 | 美女爽到呻吟久久久久 | 伊人看片| 欧美1区2区 | 国产精品美女久久久免费 | 91在线视频一区 | 国产一区二区在线免费观看 | 中文字幕亚洲欧美日韩在线不卡 | 国产成人精品免高潮在线观看 | 美女天堂 | 国产美女网站 | 古装三级在线播放 | 99精品一区二区三区 | 国产色片 | 日韩精品一区二区在线观看 | 久久精品中文字幕 | 99国产精品久久久 | 高清视频一区二区三区 | 国产精品久久国产精品 | av一级久久| 日日夜夜天天干 | 五月激情婷婷在线 | 日韩在线看片 | 欧美精品日韩精品国产精品 | 99亚洲精品 | 亚洲综合天堂 | 日韩a在线 | 国产精品v | 91一区二区三区 | 嫩草一区二区三区 | 欧美v免费| 久久精品一区二区视频 | 亚洲成人免费视频 | 久久成人精品视频 |