问题

  • ls的size表示什么,与du查看大小的区别是什么?
  • 为什么目录占空间大小为4096?
  • 分区是按盘面还是柱面?
  • 软连接和硬连接有什么区别?
  • 文件名存储在inode还是文件对应的block中?

磁盘结构

盘片、盘面、磁头

2843224-46fb935cd31addbd

硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。

磁道、扇区

2843224-56f2056f0b36009f

  • 磁道
    • 上图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道
  • 扇区
    • 从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)
    • 扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)
    • 扇区是真实的东西。磁盘驱动器操作磁盘数据,每次都按照扇为最小单位操作
    • 这是物理结构。磁盘定下来的结构就是没法修改的

磁头 和 柱面

2843224-e0854f19c817c83c

  • 硬盘通常由重叠的一组盘片构成
  • 每个盘面都被划分为数目相等的磁道,并从外缘的“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

通过上述命令格式化后,使用批量生成目录脚本创建目录,发现失败

#!/bin/bash

for((i=0;i<=55;i++));
do
mkdir t$i;
done