LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: weixiao

RH7.3最终汉化实例与RedHat软件设置

[复制链接]
发表于 2007-8-23 18:40:56 | 显示全部楼层

==《Ext2文件系统的内部布局》阅读辅助笔记 <续> ==

===== group descriptors 块组描述符(软盘)

# hexdump /dev/fd0 -s 2048 -n 1024
0000800 0003 0000 0004 0000 0005 0000 0577 00ad
0000810 0002 0000 0000 0000 0000 0000 0000 0000
0000820 0000 0000 0000 0000 0000 0000 0000 0000
*
0000c00


笔记 group_desc structure
_ offset __ size ___ description
------ ------- ------------------
___ 0 _____ 4 bg_block_bitmap | Block Bitmap 的第一个块的块ID
___ 4 _____ 4 bg_inode_bitmap | Inode Bitmap 的第一个块的块ID
___ 8 _____ 4 bg_inode_table | Inode Table 的第一个块的块ID
___ 12 ____ 2 bg_free_blocks_count | 当前块组里未用的块的总数
___ 14 ____ 2 bg_free_inodes_count | 当前块组里未用的inode的总数
___ 16 ____ 2 bg_used_dirs_count | 当前块组分配给目录的inode 总数
___ 18 ____ 2 bg_pad
___ 20 ___ 12 bg_reserved


(bg_block_bitmap阅读例子)
# hexdump -s 2048 -n 4 /dev/fd0
0000800 0003 0000
0000804
# echo "ibase=16;00000003" | bc
3

(bg_free_blocks_count阅读例子)
# hexdump -s 2060 -n 2 /dev/fd0
000080c 0577
000080e
# echo "ibase=16;577" | bc
1399

(bg_free_inodes_count阅读例子)
# hexdump -s 2062 -n 2 /dev/fd0
000080e 00ad
0000810
# echo "ibase=16;AD" | bc
173

[ ‘当前块组’意思是当前文件系统(或理解成分区)的块组设置。 group descriptors(块组描述符)跟着 超级块。 ]

(验证例子) ‘ dumpe2fs /dev/fd0 ’显示如下:
...... ......
Group 0: (Blocks 1-1439)
Primary Superblock at 1, Group Descriptors at 2-2
Block bitmap at 3 (+2), Inode bitmap at 4 (+3)
Inode table at 5-27 (+4)
1399 free blocks, 173 free inodes, 2 directories
Free blocks: 41-1439
Free inodes: 12-184
注: 这是软盘上ext2文件系统只有一个块组的情况。Group 0 包括文件系统上块ID 1-1439,block bitmap at 3 (+2) 中的‘+2’表示当前Group 0的偏移数,‘+0’则为当前Group 0第一块。

例子:以下是硬盘上一个关联Group的情况:
Group 19: (Blocks 622592-655359)
Block bitmap at 622592 (+0), Inode bitmap at 622593 (+1)
Inode table at 622596-623106 (+4)
0 free blocks, 12437 free inodes, 70 directories
Free blocks:
Free inodes: 314294, 314297-314298, 314301-314322, 314487-314593, 314595, 314631-314635, 314639-314660, 314662, 314667-314697, 314796-327040

[ 注: 超级块结构+块组描述符结构 需要依照格式化程序合理分配到一个或多个Group里,而且是一系列关联Group的开头部分。]

====== block Bitmap

# hexdump -s 3072 -n 1024 /dev/fd0
0000c00 ffff ffff 00ff 0000 0000 0000 0000 0000
0000c10 0000 0000 0000 0000 0000 0000 0000 0000
*
0000cb0 0000 8000 ffff ffff ffff ffff ffff ffff
0000cc0 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001000


摸索→ ‘hexedit -s /dev/fd0’显示block bitmap区域,0xC00 到 0xCB3(标记值80)前包含179字节(byte)。一个字节能表示8个标记值(如‘ff’表示‘11111111’),那么已经有40块被占用。该block bitmap能表示1432块( 179x8 )。

1432块跟1439块差了7块,检查 80标记值:
# echo "ibase=16;obase=2; 80" | bc
10000000
显示7个0标记,能表示7块,例子中block bitmap应该表示1439块。 ↖ 凭估!

[ 测试过程中发现‘lost+found’目录占12块,block bitmap中占12个标记位 ]

======= inode bitmap
inode bitmap的作用类同于block bitmap,不同的是每一个位对应inode table里的一个inode而不是块。

# hexdump -s 4096 -n 1024 /dev/fd0
0001000 07ff 0000 0000 0000 0000 0000 0000 0000
0001010 0000 0000 0000 ff00 ffff ffff ffff ffff
0001020 ffff ffff ffff ffff ffff ffff ffff ffff
*
0001400


仿hexedit显示
# hexdump -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\"" -s 0x1000 -n 1024 /dev/fd0
# hexdump -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\"" -s 4096 -n 1024 /dev/fd0
00001000 FF 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001010 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF
00001020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
*


inode bitmap能表示184( 23x8 )个inode,已经占用11个inode 。
# echo "ibase=16 ; obase=2 ; 07FF" | bc
11111111111 (已经占用11个inode)

----
----
回复 支持 反对

使用道具 举报

发表于 2007-8-23 19:00:20 | 显示全部楼层

==《Ext2文件系统的内部布局》阅读辅助笔记 <续> ==

===== inode table (软盘)
用于跟踪定位每个文件,文件的位置,大小,类型和访问权限均保存在inode。然而文件名并不保存在inode里,在inode表里,是依赖文件的inode号来管理所有的文件的。

计算 1024x5=5120,1024x23=23552
# hexdump -s 5120 -n 23552 /dev/fd0
0001400 0000 0000 0000 0000 3f47 46c5 3f47 46c5
0001410 3f47 46c5 0000 0000 0000 0000 0000 0000
0001420 0000 0000 0000 0000 0000 0000 0000 0000
*
0001480 41ed 0000 0400 0000 3f47 46c5 3f47 46c5
0001490 3f47 46c5 0000 0000 0000 0003 0002 0000
00014a0 0000 0000 0000 0000 001c 0000 0000 0000
00014b0 0000 0000 0000 0000 0000 0000 0000 0000
*
0001900 41c0 0000 3000 0000 3f47 46c5 3f47 46c5
0001910 3f47 46c5 0000 0000 0000 0002 0018 0000
0001920 0000 0000 0000 0000 001d 0000 001e 0000
0001930 001f 0000 0020 0000 0021 0000 0022 0000
0001940 0023 0000 0024 0000 0025 0000 0026 0000
0001950 0027 0000 0028 0000 0000 0000 0000 0000
0001960 0000 0000 0000 0000 0000 0000 0000 0000
*
0007000


观察:示例显示‘xxxx 46c5 xxxx 46c5 xxxx 46c5’应该是时间信息,记录三部分内容:1400<>1470,1480<>14f0,1900<>1970。8行x16字节=128字节(byte),跟s_inode_size的128字长吻合。即文件系统上inode table有3个inode信息,其中1500<>18f0表示8个inode保留。

参照文档: Inode表的前面几个入口是保留的。
即1400<>1470属于‘EXT2_BAD_INO → bad blocks inode 未测试’
1480<>14f0属于‘EXT2_ROOT_INO → root directory inode ’inode号是2

示例: 下面阅读 1900<>1970 ,属于lost+found目录信息 (hexdump -s 0x1900 -n 128 /dev/fd0)。

(i_mode) # hexdump -s 0x1900 -n 2 /dev/fd0
0001900 41c0
注: 指出文件格式和访问权限。

参照‘Table 1-5. EXT2_S_I values’ 0x4000 表示文件格式是directory(目录)。0x01C0表示user access rights mask(用户访问权限掩码)。( drwx------ )

# echo " ibase=16 ; obase=2 ; 1C0 " | bc
111000000
# echo " ibase=16 ; obase=8 ; 1C0 " | bc
700

-- 例如 41ed) # echo " ibase=16 ; obase=8 ; 1ED " | bc
755

-- 例如普通文件 81a4) # echo " ibase=16 ; obase=8 ; 1A4 " | bc
644

-- 例如设置了SUID和GUID普通文件 8dc9) # echo " ibase=16 ; obase=8 ; DC9 " | bc
6711 ( -rws--s--x )

(i_uid)0 ,(i_size)12288 ,(i_atime i_ctime i_mtime)时间值
(i_dtime) 这个值总是0除非文件被删除。
(i_gid) gid 0 ,(i_links_count)2

(i_blocks) 24 > 此值表示大小为512bytes的块的个数而不是在超级块里指定大小的块的个数。所以若一个文件系统的块的大小是1024bytes,它的.i_blocks的值是2。stat命令显示Blocks值就是这个意思。

(i_flags)0x00000000,此值表示当在 此inode访问 数据时 Ext2实现的行为。
(i_osd1)32bit操作系统依赖的值。

(i_block)用于定位存贮普通文件的块的数组。每一个入口是一个32bit的块号。
# hexdump -s 6440 -n 60 /dev/fd0
0001928 001d 0000 001e 0000 001f 0000 0020 0000
0001938 0021 0000 0022 0000 0023 0000 0024 0000
0001948 0025 0000 0026 0000 0027 0000 0028 0000
0001958 0000 0000 0000 0000 0000 0000

注: 值0000001d <> 值00000028 ,十进制表示块号为 29 <> 40 ,刚刚占用了12块,属于使用直接块号。

(i_generation,i_file_acl,i_dir_acl,i_faddr,i_osd2)附置信息。

===== data Blocks
数据块(Data Block)用于存贮大量的文件的内容,包括目录表,扩展属性,符号连接,等等。

Figure 2-1. directory entry
offset ___ size description
_____ 0 _____ 4 inode
_____ 4 _____ 2 rec_len
_____ 6 _____ 1 name_len
_____ 7 _____ 1 file_type
_____ 8 ___ ... name


格式中有 1字节size内容,单字节显示方式容易观察,本版本hexdump没有‘-C’选项,使用‘hexedit /dev/fd0’打开内容,‘Enter’输入0x7000跳转到目标区(小心操作)。摘录如下:
00007000 02 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007010 0C 00 02 02 2E 2E 00 00 0B 00 00 00 E8 03 0A 02 ................
00007020 6C 6F 73 74 2B 66 6F 75 6E 64 00 00 00 00 00 00 lost+found......
00007030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................


阅读例子(0x7000)
_________________________________________________________
offset ___ size description
_____ 0 _____ 4 inode number (00 00 00 02) | inode号是 2
_____ 4 _____ 2 rec_len (00 0C) | 这条记录长度是12 bytes
_____ 6 _____ 1 name_len (01) | 文件名长度是1 ( . )
_____ 7 _____ 1 file_type (02) | EXT2_FT_DIR目录
_____ 8 ___ 1+3 name (2E) | 目录文件名是 ‘.’,并保留3字节长度

[ 注:文档中例子 ‘.’目录的 record length (9) = 4+2+1+1+1,这里有些不同 ]

(摘录) 需要注意:在一些实现里,为在主处理器上获得更好的性能而在目录入口进行填充,重要的是将使用记录长度而不使用文件名长度来查找下一条记录。

接上(0x700C)
_____ 12 _____ 4 inode number (00 00 00 02) | inode号是 2
_____ 16 _____ 2 rec_len (00 0C) | 这条记录长度是12 bytes
_____ 18 _____ 1 name_len (02) | 文件名长度是2 ( .. )
_____ 19 _____ 1 file_type (02) | EXT2_FT_DIR目录
_____ 20 ___ 2+2 name (2E2E) | 目录文件名是 ‘..’,并保留2bytes


_____ 24 _____ 4 inode number (00 00 00 0B) | inode号是 11
_____ 28 _____ 2 rec_len (03 E8) | 这条记录长度是1000 bytes
_____ 30 _____ 1 name_len (0A) | 文件名长度是10 (lost+found)
_____ 31 _____ 1 file_type (02) | EXT2_FT_DIR目录
_____ 32 10+982 name (6C 6F 73 74 2B 66 6F 75 6E 64) | 目录文件名是 lost+found

[ 注: ‘man ascii’查看各制码 ]

(1) 数据区首先提供1024byte使用,已使用记录长度状况: 12+12+1000。其中11号inode(lost+found目录)的记录长度是可变,当有新的目录或文件在文件系统上创建,lost+found目录的记录长度固定为(00 14)HEX,即20bytes,而新目录或文件的记录长度则暂定为980bytes。
示例结构的文件name只能包含255个字符。

(2)文件是Linux用来存储信息的基本结构,实际应用上,它是被命名的存储在某种介质(如磁盘、光盘和磁带等)上的一组信息的集合。文件名是文件的标识,由字母、数字、下划线和圆点等字符组成,Linux限制文件名只能包含255个字符,而文件名的长度直接影响记录的长度。

(3)Linux系统中有三种基本的文件类型:普通文件(文本文件和二进制文件)、目录文件和设备文件。

(4)用户习惯通过文件名读取文件,Ext2文件系统则面向inode号。
示例中‘.’点和‘..’点点特殊目录的inode号都是2。可以这样理解:

Linux是应用 树型目录结构 组织和管理大量的文件,一个文件系统有一个"根"(root),然后在根上分"杈"(directory),任何一个分杈上都可以再分杈,杈上也可以长出"叶子"。"根"和"杈"在Linux中被称为是"目录"或"文件夹"。而"叶子"则是一个个的文件。

在文件系统上创建目录时,都会自动为它设定两个目录文件,一个是‘.’,代表该目录自己,另一个是‘..’,代表该目录的父目录。对于根目录,‘.’和‘..’都代表其自己(示例中情况)。

继续观察hexedit显示区, 2E信息属于lost+found目录下的‘.’和‘..’目录
00007400 0B 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007410 F4 03 02 02 2E 2E 00 00 00 00 00 00 00 00 00 00 ................


0000A000 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 ................

0000A400 ↖ lost+found目录占用12块的内容

_________________________________________________________


===
回复 支持 反对

使用道具 举报

发表于 2007-8-27 18:38:38 | 显示全部楼层

==《Ext2文件系统的内部布局》笔记 -- 测试文件结构

测试准备
# fdformat /dev/fd0
# mke2fs /dev/fd0

制作测试文件
# echo 'A pickpooket twitched a purse from his pocket.' > [mountpoint]/test.file

测试目的:主要观察新建文件在Ext2文件系统的内部情况。

观察1.
超级块 0x400 (软盘)
offset __ size __ description _______ | __ old ________ new ____
12 ________ 4 ___ s_free_blocks_count | (577)1399 -- (576) 1398
16 ________ 4 ___ s_free_inodes_count | (AD)173 -- (AC)172
48 ________ 4 ___ s_wtime ___________ | 访问时间值改变


块组描述符 0x800
12 ________ 2 ___ bg_free_blocks_count | (577)1399 -- (576) 1398
14 ________ 2 ___ bg_free_inodes_count | (AD)173 -- (AC)172

[ 数值相同属于软盘只有一个Group 0 的情况 ]

block bitmap 0xC00
< 0000c00 ffff ffff 00ff 0000 0000 0000 0000 0000 (40块)
---
> 0000c00 ffff ffff 01ff 0000 0000 0000 0000 0000 (new)


# echo "ibase=16 ; obase=2 ; 01FFFFFFFFFF" | bc
11111111111111111111111111111111111111111 ← 已使用41块

inode bitmap 0x1000
< 0001000 07ff 0000 0000 0000 0000 0000 0000 0000 (11个inode)
---
> 0001000 0fff 0000 0000 0000 0000 0000 0000 0000 (new)


# echo "ibase=16 ; obase=2 ; 0FFF" | bc
111111111111 ← 已使用12个inode

inode table 0x1400
文件系统根目录下操作,则更新 根目录在inode表的记录(0x1480,128字长):
12 ________ 4 i_ctime
16 ________ 4 i_mtime


test.file新文件在inode表有他的记录
# hexdump -s 0x1980 -n 128 /dev/fd0
0001980 81a4 0000 002f 0000 864d 46cb 864d 46cb
0001990 864d 46cb 0000 0000 0000 0001 0002 0000
00019a0 0000 0000 0000 0000 0029 0000 0000 0000
00019b0 0000 0000 0000 0000 0000 0000 0000 0000
*
00019e0 0000 0000 17fd 0003 0000 0000 0000 0000
00019f0 0000 0000 0000 0000 0000 0000 0000 0000
0001a00


阅读:
(i_mod)(81A4)644 -rw-r--r--
(i_uid)0 ,(i_size)文件内容 47 bytes ,(i_atime i_ctime i_mtime)时间值
(i_dtime) 这个值总是0除非文件被删除。
(i_gid) gid 0 ,(i_links_count)1 ,(i_blocks)2 (2x512bytes)
(i_flags) ,(i_osd1)
(i_block 15x4)(29) 41入口块号
(i_generation)(0003 17fd) 文件版本(用于NFS)
(i_file_acl,i_dir_acl,i_faddr,i_osd2) 。

[注意] 这时有一种现象,cat命令能读取test.file内容,hexdump等程式则在数据区找不到新文件内容,只有以上的描述内容。这由于Linux系统中,当数据存入磁盘时,通常会先放到缓冲区内,等适当时再写入磁盘。

上述的cat命令操作是在缓冲区操作。若这时断电 内核失态,则描述内容跟文件的内容不能协调一致,e2fsck之类的软件就是尽力维护该情况。
或者 从这样的测试,开始揣测 元数据的定义!

观察2.
data blocks 0x7000
unmount 卸载文件系统观察数据区,确保数据写入软盘。

hexedit显示数据区 文件结构内容:
00007000 02 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007010 0C 00 02 02 2E 2E 00 00 0B 00 00 00 14 00 0A 02 ................
00007020 6C 6F 73 74 2B 66 6F 75 6E 64 00 00 [color="DarkRed"]0C 00 00 00
lost+found..[color="darkred"]....

00007030 [color="darkred"]D4 03 09 01 74 65 73 74 2E 66 69 6C 65 00 00 00 ....test.file...
00007040 [color="darkred"]00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

offset ___ size description 紧接根目录下lost+found目录的入口记录
_____ 44 _____ 4 inode number (00 00 00 0C) | inode号是 12
_____ 48 _____ 2 rec_len (03 D4) | 这条记录长度是 980 bytes
_____ 50 _____ 1 name_len (09) | 文件名长度是 9 ( test.file)
_____ 51 _____ 1 file_type (01) | EXT2_FT_REG_FILE 普通文件
_____ 52 _ 9+963 name (74 65 73 74 2E 66 69 6C 65) | 文件名 test.file


面向用户的文件内容(占用1024bytes)
紧接 lost+found 目录12块部分
0000A400 41 20 70 69 63 6B 70 6F 6F 6B 65 74 20 74 77 69 A pickpooket twi
0000A410 74 63 68 65 64 20 61 20 70 75 72 73 65 20 66 72 tched a purse fr
0000A420 6F 6D 20 68 69 73 20 70 6F 63 6B 65 74 2E 0A 00 om his pocket...
_________________ ( i_size ) 47 bytes
0000A800 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 ................

[ 注:标记值F6 是fdformat格式化程式留下的,表示未有 初新数据 覆盖写入。 ]

(观察结果) Ext2文件系统内部 在新建文件后,以下标记值被更新:

超级块 s_free_blocks_count,s_free_inodes_count,s_wtime
块组描述符 bg_free_blocks_count,bg_free_inodes_count

Block Bitmap 添加一个标记位
Inode Bitmap 添加一个标记位
Inode Table 添加-条128字长的inode表记录

Data Blocks 写入新的入口记录,并认领1024bytes的块Size,存储test.file内容‘A pickpooket twitched a purse from his pocket.’。

=--------------------------------------------------------------=

选择测试笔记: 模仿‘ rm test.file ’执行代码
# umount /dev/fd0
# dd if=/dev/fd0 of=/tmp/bak.img

# hexedit /dev/fd0
修改inode表中test.file文件记录(0x1980) ,(i_links_count) 0x199A-0x199B 把值1改为值0 。Crtl_X 保存 。

# e2fsck -f /dev/fd0
e2fsck 1.27 (8-Mar-2002)
Pass 1: Checking inodes, blocks, and sizes
Deleted inode 12 has zero dtime. Fix<y>? yes

Pass 2: Checking directory structure
Entry 'test.file' in / (2) has deleted/unused inode 12. Clear<y>? yes

Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences: -41
Fix<y>? yes

Free blocks count wrong for group #0 (1398, counted=1399).
Fix<y>? yes

Free blocks count wrong (1398, counted=1399).
Fix<y>? yes

Inode bitmap differences: -12
Fix<y>? yes

Free inodes count wrong for group #0 (172, counted=173).
Fix<y>? yes

Free inodes count wrong (172, counted=173).
Fix<y>? yes

/dev/fd0: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0: 11/184 files (0.0% non-contiguous), 41/1440 blocks

测试后还原
# dd if=/tmp/bak.img of=/dev/fd0

=--------------------------------------------------------------=
回复 支持 反对

使用道具 举报

发表于 2007-8-28 16:18:07 | 显示全部楼层

== 测试文件结构 &gt; 补充‘数据不一致的状况’

测试准备
# fdformat /dev/fd0
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy
# echo 'A pickpooket twitched a purse from his pocket.' > /mnt/floppy/test.file

[注意] 这时有一种现象,cat命令能读取test.file内容,hexdump等程式则在数据区找不到新文件内容,只有以上的描述内容。这由于Linux系统中,当数据存入磁盘时,通常会先放到缓冲区内,等适当时再写入磁盘。
上述的cat命令操作是在缓冲区操作。若这时断电 内核失态,则描述内容跟文件的内容不能协调一致,e2fsck之类的软件就是尽力维护该情况。

模仿这一种现象 当时磁盘状况
# umount /dev/fd0
# dd if=/dev/fd0 of=/tmp/bak.img

编辑数据区
# hexdump -s 0xa400 -n 1024 /dev/fd0 -c

# dd if=/dev/fd0 of=/tmp/a800-F6.img skip=84 bs=512 count=2
# dd if=/tmp/a800-F6.img of=/dev/fd0 seek=82 bs=512 count=2
[ 这两条命令将新文件认领的1024bytes 块Size,标记值还原为F6 ]

# hexdump -s 0xa400 -n 1024 /dev/fd0

hexedit编辑
00007000 02 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007010 0C 00 02 02 2E 2E 00 00 0B 00 00 00 E8 03 0A 02 ................
00007020 6C 6F 73 74 2B 66 6F 75 6E 64 00 00 00 00 00 00 lost+found......
00007030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Crtl_X 保存
[ 已经还原当时内核失态的状况 ]

修复Ext2fs数据不一致的状况

e2fsck程式检查文件系统
# e2fsck /dev/fd0
e2fsck 1.27 (8-Mar-2002)
/dev/fd0: clean, 12/184 files, 42/1440 blocks
注:显示‘这一种现象’没有给Ext2文件系统构成危害,只丢失test.file文件。在inode表记录作用下,留住 41块号和 12 inode号。

进一步检查
# e2fsck -f /dev/fd0

e2fsck 1.27 (8-Mar-2002)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity

Pass 4: Checking reference counts 检查参考记数
Unattached(孤立) inode 12
Connect to /lost+found<y>? no
[注 e2fsck程式对 文件系统数据结构 进行一系列的追溯评测,发现‘inode 12’脱离关联,询问用户是否重新连接并关联‘inode 12’? 回答no,继续查看其他的错误 ]

Pass 5: Checking group summary information
/dev/fd0: ********** WARNING: Filesystem still has errors **********
/dev/fd0: 12/184 files (0.0% non-contiguous), 42/1440 blocks

e2fsck修复文件系统
# e2fsck -f /dev/fd0

e2fsck 1.27 (8-Mar-2002)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Unattached inode 12
Connect to /lost+found<y>? yes
[ 注 决定进行修理 。程式在/lost+found目录结构添加一条入口记录,重新连接并关联‘inode 12’,文件名指定‘#12’,并跟据 inode表记录 接用原来的41块号。 ]

Inode 12 ref count is 2, should be 1. Fix<y>? yes
[ 注:理解这条信息必先查阅文档中‘文件属性’环节。h_refcount标记值每次属性建立一个连接时增加而取消一个连接时减少。当值为0时此属性块的空间就可以释放出开。]
[ h_refcount标记值直接作用在 inode表记录(i_links_count)。重新连接让(i_links_count)自动增加1次 ,程式询问用户是否更正(把值2修改值1) 。 ]


Pass 5: Checking group summary information
/dev/fd0: ***** FILE SYSTEM WAS MODIFIED *****
/dev/fd0: 12/184 files (0.0% non-contiguous), 42/1440 blocks

e2fsck修复后的状况

= 超级块 s_wtime,s_mnt_count和s_lastcheck标记值被修改。

= lost+found目录结构添加一条入口记录
00007400 0B 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007410 0C 00 02 02 2E 2E 00 00 0C 00 00 00 E8 03 03 01 ................
00007420
23 31 32 00 00 00 00 00 00 00 00 00 00 00 00 00 #12.............


阅读:
首先‘..’点点目录rec_len记录长度固定为 12 bytes(00 0C)。

新入口记录
inode number (00 00 00 0C) | inode号是 12
rec_len (03 E8) | 这条记录长度是1000 bytes
name_len (03) | 文件名长度是3 (#12)
file_type (01) | EXT2_FT_REG_FILE普通文件
name (23 31 32) | 文件名是 #12


尝试还原test.file文件
例 一
# mount /dev/fd0 /mnt/floppy
# mv /mnt/floppy/lost+found/#12 /mnt/floppy/test.file
# echo 'A pickpooket twitched a purse from his pocket.' > /mnt/floppy/test.file
# umount /dev/fd0
[ 注意观察0x7000和0x7400入口记录的改动 ]

例 二
# dd if=/tmp/bak.img of=/dev/fd0

======
======
回复 支持 反对

使用道具 举报

发表于 2007-8-28 16:54:56 | 显示全部楼层

==《Ext2文件系统的内部布局》笔记 -- 链接文件

# fdformat /dev/fd0
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy
# echo turn thumbs down > /mnt/floppy/onefile.txt
# umount /dev/fd0
# dd if=/dev/fd0 of=/tmp/fd0-onefile.img

测试 一 尝试添加‘入口记录’,文件名为weiokok.txt,跟onefile.txt相同inode号(12)
# hexedit /dev/fd0
----------------------
00007000 02 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007010 0C 00 02 02 2E 2E 00 00 0B 00 00 00 14 00 0A 02 ................
00007020 6C 6F 73 74 2B 66 6F 75 6E 64 00 00 0C 00 00 00 lost+found......
00007030 D4 03 0B 01 6F 6E 65 66 69 6C 65 2E 74 78 74 00 ....onefile.txt.
修改成:
00007000 02 00 00 00 0C 00 01 02 2E 00 00 00 02 00 00 00 ................
00007010 0C 00 02 02 2E 2E 00 00 0B 00 00 00 14 00 0A 02 ................
00007020 6C 6F 73 74 2B 66 6F 75 6E 64 00 00 0C 00 00 00 lost+found......
00007030 14 00 0B 01 6F 6E 65 66 69 6C 65 2E 74 78 74 00 ....onefile.txt.
00007040 0C 00 00 00 C0 03 0B 01 77 65 69 6F 6B 6F 6B 2E ........weiokok.
00007050 74 78 74 00 00 00 00 00 00 00 00 00 00 00 00 00 txt.............


修改 0x199A-0x199B(i_links_count), 把值1改为值2,如下
00001990 30 2A CE 46 00 00 00 00 00 00 02 00 02 00 00 00 0*.F............

Ctrl_X 保存
----------------------
修改(i_links_count)是符合 当 rm命令删除其中一个文件名时 自动减1的规则。

检查修改
# e2fsck -f /dev/fd0
[ 没有询问用户的提示,说明这次修改符合‘数据一致’ ]

观察:
# mount /dev/fd0 /mnt/floppy
# ls -li /mnt/floppy
total 14
11 drwx------ 2 root root 12288 8 24 08:43 lost+found
12 -rw-r--r-- 2 root root 17 8 24 08:45 onefile.txt
12 -rw-r--r-- 2 root root 17 8 24 08:45 weiokok.txt


# cat /mnt/floppy/onefile.txt ; echo '-----' ; cat /mnt/floppy/weiokok.txt
turn thumbs down
-----
turn thumbs down

[ 注:两个文件名连接相同inode号(12),共同指向‘turn thumbs down’内容块 ]

现在修改其中一命名文件的内容,则联动另一命名文件
# date >> /mnt/floppy/weiokok.txt
# cat /mnt/floppy/onefile.txt ; echo '-----' ; cat /mnt/floppy/weiokok.txt
turn thumbs down
五 8月 24 09:24:41 CST 2007
-----
turn thumbs down
五 8月 24 09:24:41 CST 2007


删除测试
# hexdump -s 0x199A -n 2 /dev/fd0
000199a 0002 (i_links_count)

# rm /mnt/floppy/weiokok.txt

# hexdump -s 0x199A -n 2 /dev/fd0
000199a 0001

# ls -li /mnt/floppy
[ 查看有没有错误提示 ]

# umount /dev/fd0
[ 注:用户删除文件后,(i_links_count)自动减1,并把weiokok.txt入口记录的inode号(0C)设置成(00) ]

=--=-----------------------------------------------------=--=
二 硬链接与符号链接

1. 硬链接 (hard link)
以上‘测试 一’,效果跟‘ln onefile.txt weiokok.txt’一样。

ln命令 硬链接语法:
ln 目标参数 [ 链接名参数 ]


ln命令创建硬链接 设置的参数必须在同一文件系统上,而且目标参数不能是‘目录’。但链接名参数可以是目录:
# mkdir bak-dir
# ln onefile.txt weiokok.txt bak-dir

(从‘测试 一’中摸索) ln命令创建硬链接是在Ext2fs数据区写入 新的入口记录,包括创建新的文件名,连接并关联 目标文件的inode号,并共同指向实际的‘内容块’。

当目标文件被删除,只在其入口记录的inode号设置成0,正规脱离‘inode号12’的连接。没有干预到另一链接文件指向‘内容块’。

‘测试 一’中 链接实现 只在文件系统的数据区(Data Blocks),证明硬链接应用只局限于同一文件系统上。
其实创建任何文件,最低程度含有一个‘链接’。

2. 符号链接 (symbolic link)

ln -s 目标参数 [ 链接名参数 ]
注:符号链接文件能在当前文件系统,指向以外的文件系统上的文件(包括目录)。它耗用一个新inodes存储目标文件路径信息。

测试准备:
# dd if=/tmp/fd0-onefile.img of=/dev/fd0
# mount /dev/fd0 /mnt/floppy
# cd /mnt/floppy
# ln -s onefile.txt s2
# ls -li
total 13
11 drwx------ 2 root root 12288 8 24 08:43 lost+found
12 -rw-r--r-- 1 root root 17 8 24 08:45 onefile.txt
13 lrwxrwxrwx 1 root root 11 8 24 14:10 s2 -> onefile.txt


# cd
# umount /dev/fd0

观察文件系统内部:
除了时间值和mount次数等,受到影响的标记值如下:

超级块 s_free_inodes_count (AC)172 --> (AB)171
块组描述符 bg_free_inodes_count (AC)172 --> (AB)171

block bitmap (没有修改)
inode bitmap 添加1个标记位
注:以上信息说明 符号链接文件耗用1个inodes,但不使用‘内容块’。

inode表中记录(0x1a00) :
# hexdump -s 0x1a00 -n 128 /dev/fd0
0001a00 a1ff 0000 000b 0000 80d8 46ce 763f 46ce
0001a10 763f 46ce 0000 0000 0000 0001 0000 0000
0001a20 0000 0000 0000 0000 6e6f 6665 6c69 2e65
0001a30 7874 0074 0000 0000 0000 0000 0000 0000
0001a40 0000 0000 0000 0000 0000 0000 0000 0000
*
0001a60 0000 0000 8f7e 0003 0000 0000 0000 0000
0001a70 0000 0000 0000 0000 0000 0000 0000 0000
0001a80


阅读 ---------------------------------->
(i_mod)文件格式是symbolic link ,权限位是 777,即 lrwxrwxrwx
(i_uid)0 ,(i_size)文件内容 11 bytes ,(i_atime i_ctime i_mtime)时间值
(i_dtime) 这个值总是0除非文件被删除。
(i_gid) gid 0 ,(i_links_count)1 ,(i_blocks)0
(i_flags) ,(i_osd1)

(i_block 15x4) 符号链接文件这里不表示入口块号:
# hexdump -s 6696 -n 60 /dev/fd0
0001a28 6e6f 6665 6c69 2e65 7874 0074 0000 0000
0001a38 0000 0000 0000 0000 0000 0000 0000 0000
*
0001a58


# hexdump -s 6696 -n 11 /dev/fd0 -c
0001a28 o n e f i l e . t x t
[ 注 11bytes表示路径名称长度(i_size),存储 指向目标文件 的路径信息 ]

(i_generation)(0003 17fd) 文件版本(用于NFS)
(i_file_acl,i_dir_acl,i_faddr,i_osd2) 。

Data Blocks 数据区(hexedit显示界面),符号链接文件的入口记录
00007040 0D 00 00 00 C0 03 02 07 73 32 00 00 00 00 00 00 ........s2......

inode number (00 00 00 0D) | inode号是 13
__________ rec_len (03 C0) | 这条记录长度是 960 bytes
____________ name_len (02) | 文件名长度是 2 ( s2)
___________ file_type (07) | EXT2_FT_SYMLINK 符号连接
_____________ name (73 32) | 文件名是 s2
---- ---------------------------------->

摸索符号链接,不能用 区分硬链接 来理解。它是一个文件,在当前文件系统上,耗用一个新inodes存储目标文件路径信息。

以上例子 符号链接文件是耗用1个inodes,但不使用‘内容块’。这情况有些文档称‘Fast symlink’,路径信息存储在inode表记录中。影响这情况的关键是 路径名称的长度:

当 i_size 小于或等于(3B) 59bytes,属于‘Fast symlink’。
[ 注 (i_block 15x4)容纳60bytes,参考以下例子:
# echo 'Good' | wc -c
5
# echo 'Good' | hexdump -c
0000000 G o o d \n
说明 59bytes只包括 可打印字符,60bytes是指容纳60个字符编码 ]

当 i_size 超过59bytes,(i_block 15x4)象普通文件一样写入 DataBlocks的入口块号,路径信息则存储在 认领的‘内容块’中。这情况称‘Slow symlink’。

还有,假如目标文件移除、删除和重命名,则符号链接文件成为坏链接,影响系统性能。file命令‘ broken symbolic link ’提示信息能验证。

=--=-----------------------------------------------------=--=

选择继续测试
Hexedit 编辑:将路径信息 onefile.txt 修改成 /etc/shadow

=======
=======
回复 支持 反对

使用道具 举报

发表于 2007-8-29 16:28:47 | 显示全部楼层

《Ext2文件系统的内部布局》笔记 -- 链接文件(补充)

symlinks软件

符号链接有时会影响系统性能,通过相关的软件应用能清楚该情况。
RH7.3 附带symlinks-1.2-13.i386.rpm ,symlinks是维护符号链接的实用工具,附置man手册。

扫描检测的例子:
# symlinks /etc
# symlinks -v -r /etc

# symlinks -v /etc
....................
....................
relative: /etc/grub.conf -> ../boot/grub/grub.conf


扫描整个系统
# symlinks -r -v /
# symlinks -r -v / > /tmp/sys-symlink.txt

# grep messy /tmp/sys-symlink.txt
messy: /boot/grub/menu.lst -> ./grub.conf


symlinks程式提出 涉及各种符号链接的情况。‘messy links’提示信息 说明内核不喜欢‘./’路径标识。

=========
回复 支持 反对

使用道具 举报

发表于 2007-10-6 14:52:15 | 显示全部楼层

标题: 制作一张软盘linux系统实例与应用(补充)

依照第62帖子内容制作成的 boot/root软盘,在VMware虚拟机不能启动时的修正方法:

更换内核
kernel-BOOT-2.4.18-3.i386.rpm套件包抓取 vmlinuz-2.4.18-3BOOT内核,然后
# cp vmlinuz-2.4.18-3BOOT /mnt/floppy/boot/vmlinuz

= ------------------------------------- =
制作成的boot/root启动盘,以下称 DIY-fd0-linux.flp ,启动VMware虚拟机,暂时遇到操作情况:

情况1. BOOT核 设置 /dev/ram0 只读(ro)挂载
启动时 编辑GRUB引导菜单,添加‘rw’,或在grub.conf中修改
例如 kernel /boot/vmlinuz root=/dev/ram0 rw

情况2. VMware虚拟机内有SCSI磁盘,不能 mount

RH7.3操作记录
创建虚拟软盘 BOOT-modules.flp,格式化ext2文件系统
# mount /dev/fd0 /mnt/floppy/
# mkdir /mnt/floppy/{lib,bin}

lib目录放置模块 BusLogic.o ,scsi_mod.o 和 sd_mod.o
[ 可以选择从kernel-BOOT-2.4.18-3.i386.rpm 抓取 ]

bin目录放置一些程式:
# locate static | grep bin

# ldd /sbin/insmod.static
not a dynamic executable

# cp /sbin/insmod.static /mnt/floppy/bin/insmod
# umount /dev/fd0

实况:
DIY-fd0-linux.flp启动VMware虚拟机
# df
# cp bin/init bin/busybox
# busybox --help
# busybox free

软盘更换成BOOT-modules.flp,然后
# mount /dev/fd0 /mnt/floppy
# ls /mnt/floppy -R

# cp /mnt/floppy/bin/insmod bin/

# insmod /mnt/floppy/lib/scsi_mod.o
# insmod /mnt/floppy/lib/sd_mod.o
# insmod /mnt/floppy/lib/BusLogic.o
# lsmod

挂载SCSI磁盘
# mount /dev/sda1 /mnt/linux/
# mount (显示挂载信息)
# umount /mnt/linux

情况3. [添加操作例子] 尝试挂载 CD-ROM

内核内置CD-ROM设备驱动代码,用户想与内核该部份环节交流,需要使用系统设备文件,触发专用连接。
内核源码文档 /usr/src/linux/Documentation/devices.txt 维护着 系统设备定义的一致性,如:

22 block Second IDE hard disk/CD-ROM interface
________________ 0 = /dev/hdc Master: whole disk (or CD-ROM)

操作: 参考 major number 和 minor number,创建设备专用文件
# busybox mknod /tmp/wei-cdrom-hdc b 22 0

挂载CD-ROM
# busybox mkdir /mnt/cdrom
# mount -r -t iso9660 /tmp/wei-cdrom-hdc /mnt/cdrom
# mount
# ls /mnt/cdrom
# umount /mnt/cdrom

==--== 注 RH7.3系统设备文件,例如/dev/hdc 尽可能不要理解成 设备实体, 理解成专用连接比较恰当。‘文件’的意思是说明 属于用户可操作。

<参阅资讯> http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs4/index.html

==--== 摘录:内核通过一个所谓的接口访问设备。接口提供了适用于所有硬件的一个抽象功能集,比如收发数据报。
接口的识别是通过接口名进行的。接口名是在内核内部定义的,而不是/dev目录下的设备文件。常见的接口名用于以太网接口的eth0、eth1等等。


= ------------------------------------- =

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2007-10-8 15:49:22 | 显示全部楼层

使用vmlinuz-2.4.18-3BOOT内核(跟帖‘rdev命令应用’)

vmlinuz-2.4.18-3BOOT内核 称 可引导(bootable)内核。
参考第62贴‘制作一张软盘linux系统实例与应用’,制作两张软盘boot盘和root盘。
参考第64贴‘rdev 命令文档’。

[color="Navy"]制作boot盘
# fdformat /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done

# dd if=vmlinuz-2.4.18-3BOOT of=/dev/fd0
1567+1 records in
1567+1 records out

[color="navy"]参考 rdev 命令文档
# hexdump -s 498 -n 14 /dev/fd0 -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\""
000001f2 01 00 97 C2 00 00 00 00 FF FF 00 09 55 AA

# rdev /dev/fd0 /dev/fd0
[ root_device 参数‘/dev/fd0’,意味root根文件系统在软盘上,需要操作更换软盘 ]

# hexdump -s 498 -n 14 /dev/fd0 -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\""
000001f2 01 00 97 C2 00 00 00 00 FF FF [color="DarkRed"]00 02 55 AA      

# ls -l /dev/fd0
brw-rw----    1 wei      floppy     [color="DarkRed"]2,   0  xx xx xxxx /dev/fd0
[ 若使用命令行‘ rdev /dev/fd0 2,0 ’效果一样 ]

[color="Navy"]设置内核用 读写模式 挂载root文件系统
# rdev -R /dev/fd0 0

# hexdump -s 498 -n 14 /dev/fd0 -e "\"%.8_ax \" 16/1 \"%02X \"\"\\n\""
000001f2 [color="darkred"]00 00 97 C2 00 00 00 00 FF FF 00 02 55 AA      


[color="Navy"]使用另外一张软盘制作root盘

[color="navy"]参考第62贴‘制作一张软盘linux系统实例与应用’,不压缩直接复制内容:
# mke2fs /dev/fd0
# mount /dev/fd0 /mnt/floppy

# du -sh flolinux/
1004k        flolinux

# cp -a /tmp/flolinux/* /mnt/floppy/
# umount /dev/fd0

[color="navy"]测试过程:
  boot盘启动机器,提示‘VFS: Insert root floppy and press ENTER’
  更换成root盘,‘ENTER’
则显示‘VFS: Mounted root (ext2 filesystem).’

[color="navy"]进入操作环境
# mount
rootfs on / type rootfs (rw)
/dev/fdd0 on / type ext2 (rw)
proc on /proc type proc (rw)

[color="navy"]重启或关机前 正规操作:
# umount /

[color="DarkGreen"]== 注: 若想用boot盘引导机器上的linux系统,例如‘ rdev /dev/fd0 /dev/sda1 ’,则中途停止引导,其中一个原因是vmlinuz-2.4.18-3BOOT内核没有内置SCSI相关驱动代码,这时需要使用Grub程序帮助。

GRUB 是引导装入器,负责装入内核并引导系统。

[color="darkgreen"]=====
<参阅资讯>
[color="DarkRed"]Linux Magazine 的文章“Kernel Configuration: dealing with the unexpected

:mad:
回复 支持 反对

使用道具 举报

发表于 2007-10-13 15:07:39 | 显示全部楼层

‘紧急bash shell’实例,尝试fsck命令操作

1. 启用‘紧急bash shell’
RH7.3系统引导过程中,内核必须调用/sbin/init程序,协调余下的引导过程。下面实例是要求内核调用/bin/bash程序,引导至小型的操作环境。

Grub引导菜单,编辑,启动
lock
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/sda1 init=/bin/bash
initrd /boot/initrd-2.4.18-3.img

以/bin/bash而不是通常的/sbin/init作为第一个进程启动,bash 提示符:
init-2.05a#

2. 简单检查‘紧急bash shell’当前状况

验证当前文件系统的挂载模式
‘ls -l /etc/mtab’与‘date’比较,mtab刷新时间有区别,则‘mount’显示信息失效。
‘touch /tmp/testfile’错误信息"touch: creating '/tmp/testfile': Read-only file system"
‘ps’提示 /proc文件系统没有挂载。
[ 纯属操作笔记 ]

3. 尝试fsck命令操作
fsck系统程序检测系统时,需要读取/etc/fstab 第六域值(fs_passno)。当某一文件系统的fs_passno值为0,跳过检测。fs_passno值为1,依照顺序 首先执行检测,通常设置在 / 文件系统。当fs_passno值为2,次顺序执行检测工作。

挂载 /proc文件系统
# mount -t proc /proc /proc

fsck检测 根文件系统
fsck程序对日志文件系统采用相应的检测方法。否则调用 其他的文件系统检测器(如e2fsck) 进行操作。

# /sbin/fsck /

注:‘紧急bash shell’环境中,fsck程序启用成功,说明检测对象属于日志文件系统,如ext3 。因为若是ext2文件系统,e2fsck程序启用失败,提示 当前操作环境欠缺 交互操作 依赖的服务程序。
有些文档介绍‘ /sbin/fsck -a / ’,使用‘-a’选项其中一个原因是不需要交互操作。

举例检测其他的文件系统(软盘)
软盘在/etc/fstab中的设置:
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 2
尝试操作
# /sbin/fsck -R -A
fsck 1.27 (8-Mar-2002)
e2fsck 1.27 (8-Mar-2002)
e2fsck: need terminal for interactive repairs

# /sbin/fsck -R -A -T -a
/dev/fd0: clean, 84/184 files, 979/1440 blocks

# /sbin/fsck /mnt/floppy
[ 参数是"/mnt/floppy/",则提示错误信息 ]

# /sbin/fsck /dev/fd0
# /sbin/e2fsck /dev/fd0

==------- 添加‘紧急bash shell’一些操作 -------==

读写模式重新挂载根文件系统
# mount -o remount,rw /
EXT3 FS 2.4-0.9.17, 10 Jan 2002 on sd(8,1), internal journal


# /sbin/swapon -a

==----------------------------------------------==

4. 重新引导

# /sbin/reboot (或 /sbin/reboot -nfi )

注 ‘reboot’
-n 重新启动计算机前 不先执行sync指令。
-f 直接重新开机,同时不调用‘shutdown’关闭系统。
-i 重新启动计算机前 先关闭全部网络界面。

→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
==
‘fsck’笔记

-a 不询问任何问题,自动修复文件系统。
-R 与 -A 选项搭配时,检测所有文件系统时,跳过根文件系统。

上例 fsck操作是模拟 RH7.3启动时检测文件系统的动作。/etc/rc.d/rc.sysinit脚本中是这样:

程式一般要求文件系统 ro模式 挂载,并参照/etc/fstab
首先检测根文件系统 fsck -T -a -f -C /
其次其他文件系统 fsck -T -R -A -a -f -C

-T 不显示fsck程式的标题信息。
-f 文件系统没有错误迹象,也要强制执行检测操作。
-C 显示 检测进度条。

==
协调的内核参数


‘紧急bash shell’实例中‘init=/bin/bash’作为一个内核引导参数传递给内核,启用小型的操作环境。

而类似该情况,redhat文档中介绍用‘emergency’内核引导参数,启用紧急模式(emergency mode),需要
root密码验证,提示符是:
[root@(none) root]#
‘emergency’环境选择重新启动时,/sbin/reboot命令需要 -f选项,例如 /sbin/reboot -nfi

使用‘single’内核引导参数,启用单用户(single-user)模式,内核调用/sbin/init,并以‘运行级别 1’引导系统 。该模式特点不激活网络服务。

==
‘Rescue mode’启用 用于修复系统 独立的小型Linux系统,起初寄生在RH安装光盘。而类似功能的LiveCD和boot/root软盘,都能理解成‘Rescue mode’或‘Rescue系统’。

→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
回复 支持 反对

使用道具 举报

发表于 2007-10-18 18:29:08 | 显示全部楼层

RH7.3系统操作笔记 -- 时间显示

例1 ‘Fri Jun 30 08:42:38 2006’对应 Inode信息‘1151628158’? 阅读第70帖(跟帖)

A 创建样品文件,直观查询
==-------------------------==
# man touch
# touch -t 200606300842.38 /tmp/touch.note

# stat /tmp/touch.note | grep Modify
Modify: Fri Jun 30 08:42:38 2006

# stat -t /tmp/touch.note
/tmp/touch.note 0 0 81a4 0 0 801 199753 1 16 0 1151628158 1151628158 1152233084 13835051526931877888
==-------------------------==
时间值(1151628158)是距离1970年1月1日的秒数。

B ‘date’工具查询
$ date -d "20060630 08:42:38" +%s
1151628158

例2 显示当前时间
$ awk 'BEGIN{now=strftime("%c" " %Z",systime());print now}'
$ date

例3 hexedit程式阅读文件系统的内部数据,inode表中某一目录记录的时间值数据‘B3 3D 32 3B’

0x3B323DB3 转换为十进制表示方式
$ echo "ibase=16;3B323DB3" | bc
993148339

$ b=0x3B323DB3 ; awk 'BEGIN{printf "%d\n" , '"$b"' }' ; unset b
993148339

$ b=0x3B323DB3 ; awk 'BEGIN{print '"$b"' }' ; unset b
993148339

转换成 可读的时间格式
$ b=993148339 ; awk 'BEGIN{s='"$b"' ; wei=strftime("%c" , s) ; print wei}' ; unset b
Fri Jun 22 02:32:19 2001

或不操作 进制转换,显示时间格式
$ b=0x3B323DB3 ; awk 'BEGIN{s='"$b"' ; wei=strftime("%c" , s) ; print wei}' ; unset b
Fri Jun 22 02:32:19 2001

转回主题,利用时间信息猜目录名称
$ date -d "Fri Jun 22 02:32:19 2001" -R
Fri, 22 Jun 2001 02:32:19 +0800

$ date -d "Fri Jun 22 02:32:19 2001"
五 6月 22 02:32:19 CST 2001

$ date -d "Fri Jun 22 02:32:19 2001" +%s
993148339
[ 时间值(993148339)不包括当前时区(CST)内容 ]

了解RH7.3系统套件
$ tar -tzvf filesystem-2.1.6.tar.gz | grep '32:19'
drwxr-xr-x notting/notting 0 2001-06-22 02:32:19 initrd/

$ date -d "Fri Jun 22 02:32:19 2001" --iso-8601="seconds"
2001-06-22T02:32:19+0800

inode表中的目录记录属于 ‘ /initrd ’
[ 用该方法条件是 发现与当前时间有一定差距。 ]

=== 注:还有一个问题,RH7.3系统套件(安装光盘里的软件),是在什么‘时区设置’的系统上包装?

例子: 在设置UTC的系统操作,则有一个可能:
Thu Jun 21 18:32:19 UTC 2001 <---> 993148339

这只能说,RH7.3系统套件是在设置成CST的系统上包装。

===
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表