最近在调PowerPC机器, 其间要修改文件系统, 这套系统使用的是内核自带的文件系统.
研究了一下才知道, 原来文件系统就在内核里,如下:
$ ls -l arch/ppc/boot/images/
total 11344
lrwxrwxrwx 1 xxha xxha 29 May 2 17:37 gunzip -> /workspace/tools/busybox-1.00
-rw-rw-r-- 1 xxha xxha 1000 May 2 17:37 Makefile
-rwxrwxr-x 1 xxha xxha 4194304 May 14 17:04 ramdisk.image.gz
-rw-rw-r-- 1 xxha xxha 1063289 May 14 17:04 vmlinux.gz
-rwxrwxr-x 1 xxha xxha 1161898 May 13 11:06 zImage.elf
-rwxrwxr-x 1 xxha xxha 5356202 May 14 17:04 zImage.initrd.elf
从上图中各文件的大小,可以得出一个结论:
zImage.initrd.elf = zImage.elf + ramdisk.image.gz
zImage.elf 就是内核image。
ramdisk.image.gz 就是内核文件系统。
这里 ramdisk.image.gz 都是内核自带的文件系统,怎么修改它呢?
这就需要用到mount -o loop了.
$ sudo mount -o loop arch/ppc/boot/images/ramdisk.image.gz /tmp/test/
$ ls -l /tmp/test/
total 31
drwxr-xr-x 2 1001 users 2048 Mar 21 2011 bin
drwxr-xr-x 5 xxha users 1024 Oct 27 2006 builtin_usr
-rw-r--r-- 1 root root 29 May 29 2008 datecode.txt
drwxr-xr-x 4 1001 users 3072 Aug 29 2007 dev
drwxr-xr-x 8 1001 users 1024 Oct 29 2012 etc
drwxr-xr-x 4 root root 1024 Mar 18 2011 home
drwxr-xr-x 3 1001 users 2048 Aug 11 2007 lib
drwx------ 2 root root 12288 Jul 28 2007 lost+found
drwxr-xr-x 6 1001 users 1024 Nov 17 2006 mnt
drwxr-xr-x 2 1001 users 1024 Feb 20 2008 proc
drwxr-xr-x 4 1001 users 1024 Aug 29 2007 root
drwxr-xr-x 2 1001 users 1024 Mar 21 2011 sbin
drwxr-xr-x 2 1001 users 1024 Nov 17 2006 sys
drwxrwxrwx 4 xxha users 1024 Nov 12 2006 trgt_root
drwxr-xr-x 5 1001 users 1024 Aug 7 2007 usr
-rw-r--r-- 1 root root 15 Dec 7 14:17 version.txt
访问 /tmp/test/目录下的文件系统,就等于修改了ramdisk.image.gz 文件,最后umount就行了。
在类 UNIX 系统里,loop设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件,把文件mount 出来,然后访问mount了的文件系统,就等于修改文件了,umount之后,文件就已经被修改了。
在使用之前,一个 loop设备必须要和一个文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。
因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被mount。