linux系统之磁盘存储
问题
- ls的size表示什么,与du查看大小的区别是什么?
- 为什么目录占空间大小为4096?
- 分区是按盘面还是柱面?
- 软连接和硬连接有什么区别?
- 文件名存储在inode还是文件对应的block中?
磁盘结构
盘片、盘面、磁头
硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。
磁道、扇区
- 磁道
- 上图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道
- 扇区
- 从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)
- 扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)
- 扇区是真实的东西。磁盘驱动器操作磁盘数据,每次都按照扇为最小单位操作
- 这是物理结构。磁盘定下来的结构就是没法修改的
磁头 和 柱面
- 硬盘通常由重叠的一组盘片构成
- 每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面
- 磁盘的柱面数与一个盘面上的磁道数是相等的。
- 由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。
- 柱面是分区的最小单位
- 数据的读写是按照柱面进行的,而非按照盘面进行
存储容量
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
每个磁道的扇区数一样是说的老的硬盘,外圈的密度小,内圈的密度大,每圈可存储的数据量是一样的。新的硬盘数据的密度都一致,这样磁道的周长越长,扇区就越多,存储的数据量就越大。
分区
硬盘分区有三种,主磁盘分区、扩展磁盘分区、逻辑分区
磁盘分区,CentOS6之前按整柱面形式划分,CentOS6开始按扇区划分
主磁盘分区、扩展磁盘分区、逻辑分区
磁盘可划分为主磁盘分区+扩展磁盘分区,两者数量之和最大为4个,其中扩展磁盘分区可划分为多个逻辑分区
格式化-ext4
块
- 磁盘块是个虚拟出来的概念,是操作系统中的,表示操作系统与磁盘打交道的最小单位;
- 块的大小为扇区的整数倍,默认为4096,可在格式化时设定
inode
inode包含文件的元信息,具体来说有以下内容:
- 文件的字节数
- 文件拥有者的User ID
- 文件的Group ID
- 文件的读、写、执行权限
- 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个inode
- 文件数据block的位置
- 每个文件对应一个inode,i为index,即为该文件对应到磁盘的存储块
- inode 里面有文件的读写权限 i_mode,属于哪个用户 i_uid,哪个组 i_gid,大小是多少 i_size_io,占用多少个块 i_blocks_io等等
block bitmap
保存block使用状态,每个组中只会存在一个block bitmap,如果block size 过小,磁盘较大,则会分为多个组。
比如当格式化block size大小为1024k时,每个group的块的数量是8192个
inode bitmap
保存inode的使用状态,每个组中只会存在一个inode bitmap,如果一个inode bitmap无法存储所有的inode table,则会分组
inode table
inode 列表
目录存储
- 元数据
即文件的本身的基本信息,也叫Inode信息,包含文件的大小,权限 ,属主,属组,时间戳,数据块指针,Inode号、连接数等 - 目录下的文件名
包含目录下的文件名、及文件名的inode号码 - 根本身
根是自引用的,引内核挂载根文件系统,并记录了根的位置,并且将信息缓存至内存中 - 文件名是记录在上级目录中
相关命令
-
ls: 该命令用于列出目录下的文件,当通过
ls -all
查看文件详情时,从inode中获取数据信息并打印 -
du: 查看某文件占用磁盘的大小
-
stat: 查看某文件inode 信息
-
fdisk -l: 查看磁盘及分区情况
-
tune2fs -l: 查看ext文件系统参数
-
dumpe2fs: 查看分区详细信息
-
mkfs.ext4: ext文件系统格式化
-
mount: 挂载
连接
硬连接
ln 原文件 目标文件
- 硬连接和源文件没有什么区别,与源文件共用一个inode节点,通过访问同一个inode,实现获取文件数据
- 硬连接只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的
- 文件的文件名并未保存在inode中,文件名保存到虚拟文件系统的dentry结构中
- 在Linux中,多个文件名指向同一索引节点是存在的,一般这种连接就是硬连接
软连接
ln -s 原文件 目标文件
- 软连接,一个独立的文件,文件数据block中保存的是源文件路径,通过路径访问源文件
- 软连接是专门用来指向源文件,注意是源文件,非源文件的inode,或 block。
- 值得注意的是硬连接是指向的inode和原文件无关,而软连接指向的是原文件,所以原文件删除后即无效
- 通过ls -all发现软连接与硬连接不同
-rwxr-xr-x 2 root root 54 11月 2 04:26 mkdir.sh
-rwxr-xr-x 2 root root 54 11月 2 04:26 m.sh
lrwxrwxrwx 1 root root 8 11月 2 04:35 soft.sh -> mkdir.sh
问题
分区可使用空间充足,提示无空间
mkfs.ext4 -b 4096 /dev/sdb1 -N 50
通过上述命令格式化后,使用批量生成目录脚本创建目录,发现失败
附
- 理解inode
- 批量生成目录
#!/bin/bash
for((i=0;i<=55;i++));
do
mkdir t$i;
done