磁盘概念:track cylinder sector block等

磁盘概念:track cylinder sector block等

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条目

 

留下回复