David Lin

David Lin

一個軟體工程師的隨意筆記

11 Sep 2021

Loop Device 筆記

因為最近都在修改 Raspberry Pi 的 boot 磁區,準備練習寫 bare metal 程式,所以需要一個有效率的方法去操作 SD card image files。

方法1: fdisk + mount

先用 fdisk 指令去查看 img 檔案裡面有哪些分割區,而且分割區的範圍有哪些。

$ fdisk -lu 2021-05-07-raspios-buster-armhf-lite.img

跑出來結果如下:

Disk 2021-05-07-raspios-buster-armhf-lite.img: 1.75 GiB, 1874853888 bytes, 3661824 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9730496b

Device                                    Boot  Start     End Sectors  Size Id Type
2021-05-07-raspios-buster-armhf-lite.img1        8192  532479  524288  256M  c W95 FAT32 (LBA)
2021-05-07-raspios-buster-armhf-lite.img2      532480 3661823 3129344  1.5G 83 Linux

上面可以看得出來,這個 Raspberry Pi OS 的 img file 有兩個分割區,一個是開機用的,另一個則是 Linux 系統。

在這裡我先掛上第一分割區試試看。在掛載之前,還需要先弄清楚這個分割區在 img 檔案的開始位置:

# 由 fdisk 顯示可知,sector 大小是 512 bytes
sector_size = 512 bytes
# 而且第一分割區的開始 sector 為 8192
offset = 512 * 8192 = 4194304

計算完 offset 之後,就可以用 mount 指令掛載了:

$ mkdir -p rootfs
$ sudo mount -o loop,offset=$((512 * 8192)) 2021-05-07-raspios-buster-armhf-lite.img rootfs

df 指令來看,可以看到這個裝置有掛載成功:

# 上面怒刪
/dev/loop0        258095    48781    209315  19% /home/davll/projects/raspi/research/rootfs

要解除掛載,只要用 umount 指令就可以了

$ sudo umount rootfs

方法2: losetup 管理 loop device

但是,上面的方法雖然很簡單,但是很囉唆,而且很難直接用 /dev 方式去工作(例如 fdisk, ddmkfs)。 所以要用 losetup 去增加新的 loop device 到 /dev 底下,當作真正的 device 去處理。

呼叫 losetup 去把 img 檔案掛上去:

$ sudo losetup --show -f -P 2021-05-07-raspios-buster-armhf-lite.img

執行成功後,他會顯示掛到哪一個 loop device:

/dev/loop0

ls 指令看看:

$ ls /dev/loop0*
/dev/loop0  /dev/loop0p1  /dev/loop0p2

可見有順便把兩個分割區也掛上到 /dev 下了。之後就可以用 mountumount/dev/loop0p0/dev/loop0p1 操作了。

不用時候,要用 losetup 把 loop device 關掉:

$ sudo losetup -d /dev/loop0

參考資料

comments powered by Disqus