【-1】Before
for specific info , please visit http://wiki.osdev.org/Loopback_Device
##**【0】我們先上干貨,看到效果后,我們再說明每個步驟的緣由;** 
【1】進入掛載目錄,添加相關文件(依個人意願)
Attention):要知道,以上文件和文件目錄往 /tmp 的寫入 就相當於寫入到 floppy.img 文件夾了,我們再看看掛載信息:
【2】卸載塊設備/dev/loop1
【3】以vim 命令打開 floppy.img 文件,並輸入 :%!xxd 以16進制查看該虛擬軟盤的內容;
Attention) FAT12文件系統用到扇區格式參見:http://blog.csdn.net/pacosonswjtu/article/details/48391467的“【2.1】FAT12的引導扇區格式:”
(糾錯1) 非常抱歉,上圖3.BPB_RootEntCnt=00e0=14 而不是15;
(補充):
4. BPB_FATSz16= 每 FAT 扇區數= offset(22) + length(2) = 0x0009 = 9(即每個FAT占用9個扇區)
【4】將為什么 RIVER.TXT 要從0x0002600這個字節開始呢?
從1.44大小的格式,我們知道,FAT12文件系統下的軟盤結構的第19個字節才是根目錄區,而每個扇區=512字節,所以19 * 512 =9728 = 0x2600處,Bingo!
而根目錄區的格式為:
-
4.1) 找出river.txt的 在根目錄區的屬性值
-
4.1.a)將 river.txt 的條目的32 個 字節復制下來,如下:
0002600: 5249 5645 5220 2020 5458 5420 0000 0000 RIVER TXT .... 0002610: 0000 0000 0000 f4b6 2c47 0300 1000 0000 ........,G......
-
4.1.b)則 該文件的屬性如下表所示:
-
4.2)在FAT中 尋找出 river.txt 的所有簇號
Attention):由上圖的軟盤結構圖,我們知道FAT從第1個扇區開始,一個扇區512個字節,所以FAT從地址0x0200開始;
-
4.2.a)0000200: f0 ff ff 00 f0 ff ff ff ff ff ff ff ff 0f 0000 ................
FAT表結構是怎樣的?參見 http://blog.csdn.net/pacosonswjtu/article/details/48391467 -
4.2.a.1)我們看到,0-ff0、1-fff、2-000、3-fff、3-fff表示這個簇就是最后一個簇了,所以river.txt文件對應 的就是 簇3。
(Attention):這里由於river.txt 只有15個字符,3個river strings 因此一個扇區就可以裝下了; 如果readers 有 interst, 不妨可以建立一個超過512字節(一個扇區)的文件,然后就可以演示出從FAT中找出該文件的所有簇號,不過你也可以參見 http://blog.csdn.net/pacosonswjtu/article/details/48391467中“【2.2】文件分配表-FAT”中的“看個荔枝”; -
4.2.a.2) 我們轉到數據區,看第3個簇內容;(前面已經提到,一個簇==一個或多個扇區)
-
4.2.a.3)算數據區開始扇區號:
step1) 通過文件系統的用到扇區數據結構找出 根目錄區條目數 BPB_RootEntCnt = 14 和 BPB_BytesPerSec = 512,(參見模塊3的第一張圖);
step2) 所以算數據區開始扇區 =1 + 9 + 9 + 14 = 33 ,第33扇區的偏移量為 33*512 = 16896B, 16896/16=1056行,所以數據區的開始字節數為:16896B 。。。。(怎么計算出來的? 參見http://blog.csdn.net/pacosonswjtu/article/details/48391467 中的 “【2.3】根目錄區-root dir sector(如何計算根目錄區的扇區數量?)”)
step3) 因為river.txt 的開始簇號為3,由於第1、2個FAT項不用,即簇0和簇1不用,所以簇號從2起算,即數據區的第一個扇區對應簇號2,所以簇號3對應第2個扇區,所以river.txt 的 起始地址為 16896 + 512 = 17408B,而17408 / 16 = 1088,正好與下圖匹配上。
(Bingo!)對, filesystem 就應該這么玩。
**(Attention)**以上演示效果完畢,下面,我們將制作FAT12虛擬軟盤並掛載到/tmp下的每一步的緣由;
##**【Reasons of precedure manufacturing virtual floppy with FAT12 file system】** 
-
R1)dd if=/dev/zero of=floppy.img bs=512 count=2880 創建空虛擬軟盤
/dev/zero : 在類UNIX 操作系統中, /dev/zero 是一個特殊的文件,當你讀它的時候,它會提供無限的空字符(NULL, ASCII NUL, 0x00)。其中的一個典型用法是用它提供的字符流來覆蓋信息,另一個常見用法是產生一個特定大小的空白文件。 -
R2)sudo losetup /dev/loop1 floppy.img 給該軟盤文件關聯一個塊設備 /dev/loop1
轉自: http://itlab.idcquan.com/linux/set/942370.html-
loop設備介紹: loop 設備是一種偽設備(pseudo-device),或者也可以說是仿真設備。它能使我們像塊設備一樣訪問一個文件。在使用之前,一個loop設備必須要和一個文件進行連接。這種結合方式給用戶提供了一個替代塊特殊文件的接口。因此,如果這個文件包含有一個完整的文件系統,那么這個文件就可以像一個磁盤設備一樣被 mount 起來。
-
losetup 指令: 此命令用來設置循環設備。循環設備可把文件虛擬成塊設備,籍此來模擬整個文件系統,讓用戶得以將其視為硬盤驅動器,光驅或軟驅等設備,並掛入當作目錄來使用。
losetup [ -e encryption ] [ -o offset ] loop_device file losetup [ -d ] loop_device -e 表示加密的方式 -o 設置數據偏移量 -d 卸載設備 loop_device 循環設備名,在 linux 下如 /dev/loop0 , /dev/loop1 等。 file 要與循環設備相關聯的文件名,這個往往是一個磁盤鏡象文件,如 *.img
-
Bingo!