Chinaunix首页 | 论坛 | 博客
  • 博客访问: 739081
  • 博文数量: 235
  • 博客积分: 4309
  • 博客等级: 中校
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-17 11:25
个人简介

If you don\\\\\\\\\\\\\\\'t wanna do it, you find an EXCUSE; if you do, you\\\\\\\\\\\\\\\'ll find a WAY :-)

文章分类

全部博文(235)

文章存档

2014年(3)

2013年(2)

2012年(31)

2011年(199)

分类: LINUX

2011-02-16 10:29:10

side/ head
  •  硬盘一般是由一片或几片圆形薄膜叠加而成。每个圆形薄膜都有两个"面"(Side),这两个面都是用来存储数据的。
  • 依次称为0面、1面、2面……由于每个面都专有一个读写磁头,也常用0头(head)、1头……称之。
  • 硬盘面数(或头数),少的只有2面,多的可达数十面。


    track------磁道——一个圈
    读写硬盘时,磁头不动,磁盘是旋转的,则连续写入的数据是排列在一个 圆周上的。
我们称这样的圆周为一个磁道(Track)。
  •     磁头不动,就是在一个磁道上读写
  •     磁头移动,就会在不同磁道上读写
    根据硬盘规格的不同,磁道数可以从几百到数千不等
    一个磁道上可以容纳数KB的数据(一个track包含数个sector


  cylinder----柱面---------外观象象 一个圆筒子
    各面磁道号相同的 磁道合起来,称为一个柱面(cylinder)
距轴的距离相同的一组track
磁盘概念
 

   cylinder也是磁盘分区时的最小单位,分区是按磁道和柱面连续分布的(即每个分区,都是粗细不同的筒子)
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-524, default 1):  


   Sector
    一个track上可以容纳数KB的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被按512字节划分成若干段,每段称为一个扇区(Sector)。
    一个扇区size是固定的512字节

    计算机对硬盘的读写,是以扇区为最小单位
即使只读某一个字节,也必须一次把这个字节所在的扇区中的512字节 全部读入内存


    交叉因子
  •  扇区号并不是连续紧挨着的,而是按照某个间隔跳跃着编排的。 这个间隔就是交叉因子。
举个例子:在某个硬盘上,以实际存储位置而论,2号扇区并不是1号扇区后的第一个,而是第5个,3号扇区又是2号扇区后的第5个,以此类推。
这个"5"就是我们说的交叉因子。
2,10,7,21,3,11,8,22,4
  • 选择适当的交叉因子,可使 硬盘读写速度与硬盘的旋转速度相匹配,提高存储数据的速度

   block---文件系统(FS)的最小存取 空间
  •     一个 Block 最多仅能容纳一个文件(即不存在多个文件同一个block的情况)
如果一个文件比block小,他也会占用一个block,因而block中空余的空间会浪费掉
  •     一个大文件,可以占多个甚至数十个成百上千的block
# df
/                  (/dev/dsk/c0t3d0s0 ):  573548 blocks   226057 files
/proc              (/proc             ):       0 blocks     3854 files
/var               (/dev/dsk/c0t3d0s1 ): 1897206 blocks   250028 files
/var/run           (swap              ):  611424 blocks    26300 files
/tmp               (swap              ):  611424 blocks    26300 files
  

    sector 和block的分别
  •    sector 是硬盘存取的最小单位,是512Bytes
  •    block是fs 存取的最小单位很单个文件的最小单位,可以随意设定, fs有自己缺省的block大小。
          如ext2 fs的block缺省是4k(即8 sector)


    block大小是固定的,但可以设置
缺省是4096, 最大设置到8192(一般针对大文件系统)
所以应该根据自己系统应用的特点,合理规划block size
  •     若block太大,则存取小文件时,有空间浪费的问题
  •     若block太小,则硬盘的 Block 数目会大增,而造成 inode 在指向 block 时候的一些搜寻时间的增加,又会造成大文件读写方面的效率较差


    以sun的ultra为例:不同磁分区盘 (slice)或mount point, block size不同,一般是8192,显然是对大文件存取的
# df -g
/                  (/dev/dsk/c0t3d0s0 ):        8192 block size          1024 frag size 
 2031084 total blocks     573548 free blocks   451684 available         253760 total files
  226057 free files     35651584 filesys id 
     ufs fstype       0x00000004 flag             255 filename length

/proc              (/proc             ):          512 block size           512 frag size 
       0 total blocks          0 free blocks        0 available           3900 total files
    3854 free files     66584576 filesys id  /proc
    proc fstype         00000000 flag              64 filename length

/etc/mnttab        (mnttab            ):          512 block size           512 frag size 
       0 total blocks          0 free blocks        0 available              1 total files
       0 free files     68419584 filesys id  /mnttab
   mntfs fstype         00000000 flag              64 filename length



   Superblock---------文件系统FS的 第一个blcok
  •     superblock即每个分区上所建立的fs的第一个 block,就称做superblock
  •     super block 是从 分区头的第1024byte以后开始
  •     super block也一共有 1024 bytes 那么大
  •     superblock 上的内容,主要是描述文件系统FS的大小、空的和填满的block(s_blocks_count,s_r_blocks_count,s_free_blocks_count), 以及他各自的总数和其他统计值
 

    ext3 的super block
struct ext3_super_block {
__u32 s_inodes_count;     
       __u32 s_blocks_count;     
       __u32 s_r_blocks_count;   
       __u32 s_free_blocks_count;
__u32 s_free_inodes_count;
       __u32 s_first_data_block; 
       __u32 s_log_block_size;   
                                    
       __s32 s_log_frag_size;    

__u32 s_blocks_per_group; 
                              block size和block group size都是固定的,都可定义
       __u32 s_frags_per_group;  
       __u32 s_inodes_per_group; 
       __u32 s_mtime;            
__u32 s_wtime;            
       __u16 s_mnt_count;        
       __s16 s_max_mnt_count;    
       __u16 s_magic;            
                                        magic 签名,对于 ext2 和 ext3 文件系统来说,这个字段
                                       的值应该正好都等于 0xEF53
                                        显然,ext2 和 ext3 的兼容性一定是很强的
       __u16 s_state;            
       __u16 s_errors;           
       __u16 s_minor_rev_level;  
__u32 s_lastcheck;        
       __u32 s_checkinterval;    
       __u32 s_creator_os;       
       __u32 s_rev_level;        
__u16 s_def_resuid;       
       __u16 s_def_resgid;       
       __u32 s_first_ino;        
       __u16 s_inode_size;       
       __u16 s_block_group_nr;   
       __u32 s_feature_compat;   
__u32 s_feature_incompat; 
       __u32 s_feature_ro_compat;
__u8  s_uuid[16];         
char  s_volume_name[16];  
char  s_last_mounted[64]; 
__u32 s_algorithm_usage_bitmap;
       __u8  s_prealloc_blocks;       
       __u8  s_prealloc_dir_blocks;   
       __u16 s_padding1;              
__u8  s_journal_uuid[16];
__u32 s_journal_inum;    
       __u32 s_journal_dev;     
       __u32 s_last_orphan;     
__u32 s_reserved[197];   
};



    block group
blocks 被聚在一起分成几个大的 block group。

    block group descriptor
    block group descriptor只占一个block
    硬盘分区的开头部分,在 super block 的后面,第二个block就是group descriptor table
    block group descriptor内一条block group记录32bytes大,它代表一个block group(注 意不是block,而是block group,一 条block group decriptor内的32字节记录,描述一个block group)


    block group descriptor中的block group记录的三个 block 指针
struct ext3_group_desc
{
 __u32 bg_block_bitmap;     
 __u32 bg_inode_bitmap;     
 __u32 bg_inode_table;      
 __u16 bg_free_blocks_count;
 __u16 bg_free_inodes_count;
 __u16 bg_used_dirs_count;  
 __u16 bg_pad;              
 __u32 bg_reserved[3];      
};
    block bitmap指针
    指向该block group 的block bitmap
    (
    block bitmap介绍:
    block bitmap 中的每个 bit 表示一个 block,如果该 bit 为 0,表示该 block 中有数据,如果 bit 为 1,则表示该 block 是空闲的
    这个 block bitmap 本身也正好只有一个 block 那么大小
    )
    inode bitmap指针
    指向该block group 的 inode bitmap
    (
    inode bitmap介绍:
    inode bitmap里面的每一个 bit 相对应一个 inode
    这个 inode bitmap 同样也是正好有一个 block 那么大
     )

    inode table指针
    指向该block group 的inode table。
    (
     inode table介绍:
     inode table 不止一个 block 那么大了。
     inode table 是 block group 中所聚集到的全部 inode 放在一起形成的。
     {



   什么是inode?
  •     inode就指 block group  中inode table中的条目.
          它不象block那样并不真实存在,inode只是在inode tables 的一个条目
  •     inode 条目描述一个文件,对应着文件系统上的一个文件或者目录,指出了件的名称、大小、连接数量,block指针等
  •     inode 条目通过一系列的 block 指针,指向block group内的具体的 block,里面就存放了文件的具体数据
  •     读取文件的内容,只要把相应的 inode 指向的block的内容全部读出来就行了

    inode table
    inode table 位于一个block group 的第二block之后,描述这个block group内的所有inode
    inode table 内的一个条目就是一个 inode,就代表一个文件


    一个inode 代表一个文件,但inode struct里不包括文件名,文件名在哪里?
struct ext3_inode {
 __u16 i_mode;   
 __u16 i_uid;    
 __u32 i_size;   
 __u32 i_atime;  
 __u32 i_ctime;  
 __u32 i_mtime;  
 __u32 i_dtime;  
 __u16 i_gid;    
 __u16 i_links_count;         
 __u32 i_blocks;              
 __u32 i_flags;               
 __u32 l_i_reserved1;         
 __u32 i_block[EXT3_N_BLOCKS];
                      inode 里面可以存放 EXT3_N_BLOCKS(= 15)这么多个 block 指针。用户数据就从这些 block 里面获得
                      15 个 blocks 不一定放得下全部的用户数据
                     前 12 个是所谓的 direct blocks,里面直接存放的就是用户数据。
                     第 13 个 block 是 indirect block,里面存放的全是 block 指针,这些 block 指针指向的 block 存放用户后面的数据
                     第 14 个 block 是 double indirect block,里面存放的全是 block 指针,这些 block 指针指向的 block被用来存放用户数据
                     第 15 个 block 是 triple indirect block,比上面说的 double indirect block 有多了一层 block 指针。
                    
 __u32 i_generation;          
 __u32 i_file_acl;            
 __u32 i_dir_acl;             
 __u32 i_faddr;               
 __u8  l_i_frag;              
 __u8  l_i_fsize;             
 __u16 i_pad1;                
 __u16 l_i_uid_high;          
 __u16 l_i_gid_high;          
 __u32 l_i_reserved2;         
};



    真正的文件名不存在于文件inode中,而 是在目录文件inode中
  • 目录本身以文件形式存在
  • 目录文件也是一个表,这个文件中也包含很多条目,每个条目都代表一个目录中 的文件,指向一个inode
struct ext3_dir_entry_2 {
 __u32 inode;   
 __u16 rec_len; 
 __u8  name_len;
 __u8  file_type;
 char  name[EXT3_NAME_LEN];
};
这个目录文件的条目指向inode table中的inode条目
阅读(906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~