一、块读取和文件读取
在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东西可能只有我们这些无聊的geek会关心考虑这个问题,事实上没有人这么使用。但是作为一种现象,我还是想验证一下这个不一致,所谓“光说不练假把式”就是这个意思。
二、通过文件修改之后看块设备未更新
这里的方法就是首先先各自通过文件和块设备访问设备中的某一个块,从而迫使内核将这个块的内容读入各自的页面缓冲中,然后通过文件系统修改这个文件的内容,之后再通过块设备来读取相同块,由于块设备和文件使用的是独立的页面缓冲,所以块设备访问的是没有更新的内容。
[root@Harry boot]# cat incon.txt
hello
[root@Harry boot]# stat incon.txt
File: `incon.txt'
Size: 6 Blocks: 4 IO Block: 1024 regular file ext2文件系统中每个块大小为1024字节
Device: 801h/2049d Inode: 34 Links: 1 该文件分配的inode编号为34
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-01-16 22:03:04.000000000 +0800
Modify: 2012-01-16 21:59:20.000000000 +0800
Change: 2012-01-16 21:59:20.000000000 +0800
[root@Harry boot]# debugfs -R 'bmap <34> 0' /dev/sda1 通过debugfs查看34号inode使用的块编号为11782
debugfs 1.41.9 (22-Aug-2009)
11782
[root@Harry boot]# echo tsecer>>incon.txt 向文件中追加内容。
[root@Harry boot]# debugfs -R 'bmap <34> 0' /dev/sda1 inode使用的块编号没有变化
debugfs 1.41.9 (22-Aug-2009)
11782
[root@Harry boot]# echo world>>incon.txt 再次追加内容
[root@Harry boot]# hexdump -Cvs 12064768 /dev/sda1 | more 通过块设备查看文件内容没有变化,这里的参数12064768=11782×1024
00b81800 68 65 6c 6c 6f 0a 74 73 65 63 65 72 0a 00 00 00 |hello.tsecer....|
[root@Harry boot]# cat incon.txt 通过文件系统查看文件内容已经变化。
hello
tsecer
world
[root@Harry boot]# hexdump -Cvs 12064768 /dev/sda1 | more 经过一段时间再次查看这个块设备的数据,可以看到其内容已经变化。
00b81800 68 65 6c 6c 6f 0a 74 73 65 63 65 72 0a 77 6f 72 |hello.tsecer.wor|
00b81810 6c 64 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |ld..............|
三、扯淡
这个现象感觉好像有问题,但是文件系统当时设计的时候就没有准备让用户态程序通过块设备来准确的获得其中的数据,而是主要为了让文件系统进行自己的元数据操作?总之,非到不得已的时候,还是应该乖乖的用文件操作,直接操作块设备的扇区可能会出现不一致的问题,但是这个时间应该不会太久,等内核把脏页面定期冲刷到设备上就好了。
在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东西可能只有我们这些无聊的geek会关心考虑这个问题,事实上没有人这么使用。但是作为一种现象,我还是想验证一下这个不一致,所谓“光说不练假把式”就是这个意思。
二、通过文件修改之后看块设备未更新
这里的方法就是首先先各自通过文件和块设备访问设备中的某一个块,从而迫使内核将这个块的内容读入各自的页面缓冲中,然后通过文件系统修改这个文件的内容,之后再通过块设备来读取相同块,由于块设备和文件使用的是独立的页面缓冲,所以块设备访问的是没有更新的内容。
[root@Harry boot]# cat incon.txt
hello
[root@Harry boot]# stat incon.txt
File: `incon.txt'
Size: 6 Blocks: 4 IO Block: 1024 regular file ext2文件系统中每个块大小为1024字节
Device: 801h/2049d Inode: 34 Links: 1 该文件分配的inode编号为34
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-01-16 22:03:04.000000000 +0800
Modify: 2012-01-16 21:59:20.000000000 +0800
Change: 2012-01-16 21:59:20.000000000 +0800
[root@Harry boot]# debugfs -R 'bmap <34> 0' /dev/sda1 通过debugfs查看34号inode使用的块编号为11782
debugfs 1.41.9 (22-Aug-2009)
11782
[root@Harry boot]# echo tsecer>>incon.txt 向文件中追加内容。
[root@Harry boot]# debugfs -R 'bmap <34> 0' /dev/sda1 inode使用的块编号没有变化
debugfs 1.41.9 (22-Aug-2009)
11782
[root@Harry boot]# echo world>>incon.txt 再次追加内容
[root@Harry boot]# hexdump -Cvs 12064768 /dev/sda1 | more 通过块设备查看文件内容没有变化,这里的参数12064768=11782×1024
00b81800 68 65 6c 6c 6f 0a 74 73 65 63 65 72 0a 00 00 00 |hello.tsecer....|
[root@Harry boot]# cat incon.txt 通过文件系统查看文件内容已经变化。
hello
tsecer
world
[root@Harry boot]# hexdump -Cvs 12064768 /dev/sda1 | more 经过一段时间再次查看这个块设备的数据,可以看到其内容已经变化。
00b81800 68 65 6c 6c 6f 0a 74 73 65 63 65 72 0a 77 6f 72 |hello.tsecer.wor|
00b81810 6c 64 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 |ld..............|
三、扯淡
这个现象感觉好像有问题,但是文件系统当时设计的时候就没有准备让用户态程序通过块设备来准确的获得其中的数据,而是主要为了让文件系统进行自己的元数据操作?总之,非到不得已的时候,还是应该乖乖的用文件操作,直接操作块设备的扇区可能会出现不一致的问题,但是这个时间应该不会太久,等内核把脏页面定期冲刷到设备上就好了。