国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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-01-21 09:15:05

Linux嵌入式文件系

2010-11-01 05:50:46

分布式文件系統

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-25 09:58:46

linux劃分文件系統

2009-12-22 15:12:33

Linux擴展文件系統

2019-09-20 10:04:45

Linux系統虛擬文件

2018-08-24 10:10:25

Linux文件系統技術

2011-01-13 13:18:38

Linux網絡文件
點贊
收藏

51CTO技術棧公眾號

色狠狠色噜噜噜综合网| 成人3d动漫一区二区三区| 老熟妇仑乱视频一区二区| 三年中国国语在线播放免费| av在线资源网| 牛牛影视久久网| 今天的高清视频免费播放成人| 99re国产精品| 色综合一区二区| 在线电影中文日韩| 视频一区视频二区视频| 日本欧洲国产一区二区| 日本免费一二区| 欧美在线一区二区三区四区| 性欧美大战久久久久久久久| 金瓶狂野欧美性猛交xxxx| 国产欧亚日韩视频| 中文字幕一区二区三区四区| 国产精品久久亚洲不卡| 亚洲精品中文字幕乱码三区不卡| 欧美男生操女生| 91影院成人| 国产第一页视频| 色哟哟一区二区在线观看| 国产一区二区久久久久| 国产偷久久久精品专区| 中文字幕欧美国产| cao在线视频| 国产91aaa| 欧美性20hd另类| 日本一区二区乱| 日韩欧美三级一区二区| 亚洲精品视频免费观看| 亚洲综合电影| 岛国视频一区免费观看| 狠狠狠色丁香婷婷综合激情| 伊人色综合影院| 奇米四色…亚洲| 国产又粗又爽又黄的视频| 欧美激情亚洲自拍| 日韩av在线一区二区| 在线观看免费成人| 亚洲精品日韩综合观看成人91| jizz国产| 亚洲男女av一区二区| 欧美日韩中字一区| 国产一区二区网| 丝袜亚洲精品中文字幕一区| 日日噜噜噜夜夜爽爽狠狠| 欧美一级片网址| 视频一区中文字幕国产| 欧美浪妇xxxx高跟鞋交| 四虎免费在线观看视频| 久久中文字幕一区二区三区| 欧美精品123| 亚洲小说欧美另类婷婷| 91网站免费看| 极品尤物久久久av免费看| 精品处破学生在线二十三| av777777| 91美女视频网站| 97超碰在线人人| 国产精品1区2区3区在线观看| 欧洲视频一区二区三区| 免费在线欧美视频| 亚洲电影一二三区| 麻豆精品在线播放| 亚洲 日韩 国产第一区| 精品制服美女丁香| 日韩视频免费播放| 久久久精品综合| 盗摄牛牛av影视一区二区| 久久精品视频观看| 性一爱一乱一交一视频| 搞黄视频免费在线观看| 三年片观看免费观看大全视频下载| 欧美多人乱p欧美4p久久| 免费观看30秒视频久久| 亚洲男同gay网站| 亚洲日本一区二区三区在线不卡| 亚洲黄色免费电影| 日韩欧美ww| 日本私人网站在线观看| 精品视频—区二区三区免费| 国产欧美日韩精品高清二区综合区| 无罩大乳的熟妇正在播放| 精品久久久久一区| 国产欧美欧美| 欧美r级在线| 内射国产内射夫妻免费频道| 欧美成人免费大片| 国产精品高潮久久久久无| 日本另类视频| 久久99热这里只有精品国产| 国产99久久久久| 视频国产一区| 美丽的姑娘在线观看免费动漫| 99视频网站| 日韩你懂的在线观看| av在线视屏| 91精品国产综合久久男男| 久久视频免费在线播放| 亚洲精品乱码久久久久久黑人| 国产麻豆精品久久| 麻豆mv在线看| www.成年人视频| 久热精品视频在线观看一区| 欧美日韩国产一区在线| 国产精品女主播在线观看| 色欧美乱欧美15图片| 国产视频一区在线| 久久久精品国产网站| 久久色在线播放| 亚洲欧美综合另类中字| 国产精品护士白丝一区av| 国产宾馆实践打屁股91| 亚洲清纯自拍| 亚洲人成网站在线在线观看| 另类图片综合电影| 国产男女爽爽爽| a级国产乱理论片在线观看99| 欧美大片国产精品| 久久亚洲精品国产精品紫薇| 伊人成综合网| 日本精品视频| 女同一区二区免费aⅴ| 成人影院在线看| 丁香婷婷在线| 91专区在线观看| 一二三在线视频| 欧美亚洲另类在线一区二区三区| 日韩欧美黄色大片| 97成人资源| 久久婷婷影院| 五月婷婷激情综合| 欧美三日本三级三级在线播放| 天天综合色天天综合色h| 99视频一区二区| 久久夜色精品| 老鸭窝亚洲一区二区三区| 视频在线不卡免费观看| 黄色成人美女网站| 黄色免费网站在线| 粉嫩tv在线播放| 免费免费啪视频在线观看| 国产精品第12页| 亚洲成人动漫在线| 一区二区视频在线播放| 亚洲精品第一区二区三区| 999香蕉视频| 白天操夜夜操| 亚洲污视频在线观看| 国产无套内射久久久国产| 日韩a∨精品日韩在线观看| 2019中文字幕免费视频| 日韩中文字幕亚洲一区二区va在线| 日本综合在线| 日韩精品欧美在线| 亚洲区免费影片| 久久夜色精品国产噜噜av| 91深夜福利视频| 亚洲欧美99| 亚洲成人第一| 久久久久久久久久久亚洲| 91美女蜜桃在线| 中文字幕精品影院| 欧美色综合一区二区三区| 国产区二精品视| 伊人伊成久久人综合网站 | 一本到不卡免费一区二区| 国产精品综合久久久| 欧美性xxxx69| 亚洲精品无人区| 奇米影视四色在线| 在线免费观看av的网站| 欧美1819sex性处18免费| 色黄视频在线| 91麻豆国产精品| 亚洲第一中文字幕在线观看| www.日韩av| 久久久综合色| 无码小电影在线观看网站免费| 国内外免费激情视频| 国产一区欧美二区三区| 亚洲美女又黄又爽在线观看| 亚洲久本草在线中文字幕| 久久久久国产精品午夜一区| 久久九九精品视频| 免费在线你懂的| 色综合天天色综合| 欧美成人在线免费观看| 久久久久久尹人网香蕉| 欧美日韩亚洲丝袜制服| 久久久久久99久久久精品网站| 99久久婷婷国产综合精品电影√| 国模私拍一区二区国模曼安| 两个人看的免费完整在线观看| 久久久99精品视频| 不卡日韩av| 欧美激情在线观看|