1 认识 Linux 文件系统
Linux 最传统的磁盘文件系统 (filesystem) 使用的是 EXT2,而文件系统是建立在磁盘上的,因此我们得了解磁盘的物理组成。
1.1 磁盘组成与分区
磁盘物理组成:
圆形的磁盘盘(主要记录数据的部分);
机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);
主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读取数据。
磁盘盘上物理组成:
扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有 512bytes 与 4K 两种格式;
将扇区组成一个圆,那就是磁柱(Cylinder);
早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位(每个扇区都有其号码,就好像座位一样);
磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表;
MBR 分区表中,第一个扇区最重要,里面有:(1)主要开机区(Master boot record,MBR)及分区表(partition table),其中 MBR 占有 446bytes,而 partition table 则占有 64bytes;
GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
磁盘文件名格式:
/dev/sd[a-p][1-128]:为实体磁盘的磁盘文件名;
/dev/vd[a-d][1-128]:为虚拟磁盘的磁盘文件名。
1.2 文件系统特性
Linux 的正统文件系统为 EXT2(Linux second extended file system,ext2fs)
文件系统通常会将文件权限(rwx)与文件属性(拥有者、群组、时间参数等)这两部分的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
inode :记录文件的属性,一个文件占用一个 inode ,同时记录此文件的数据所在的 block 号码;
block :实际记录文件的内容,若文件太大时,会占用多个 block。
1.3 Linux 的 EXT2 文件系统(inode)
文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等指令变更文件系统大小),否则 inode 与 block 固定后就不再变动。
文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序。
1.3.1 data block(资料区块)
data block 是用来放置文件内容数据的地方,在 EXT2 文件系统中所支持的 block 大小有 1K,2K 及4K 三种。
block 大小 | 1KB | 2KB | 4KB |
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统总容量 | 2TB | 8TB | 16TB |
block 基本限制:
原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
每个 block 内最多只能够放置一个文件的数据;
承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
承上,若文件小于 block ,则该 block 的剩余容量就不能够被使用了(磁盘空间会浪费)。
1.3.2 inode table(inode 表格)
inode 记录的文件数据内容:
该文件的存取模式(read/write/excute);
该文件的拥有者与群组(owner/group);
该文件的容量;
该文件建立或状态改变时间(ctime);
最近一次的读取时间(atime);
最近修改的时间(mtime);
定义文件特性的旗标(flag),如 SetUID ...;
该文件真正内容的指向(pointer)。
inode 特色:
每个 inode 大小均固定为 128 bytes(新的 ext4 与 xfs 可设定到 256 bytes);
每个文件都仅会占用一个 inode 而已;
承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
系统读取文件时需要先找到 inode ,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
1.3.3 Superblock(超级区块)
Superblock 是记录整个 filesystem 相关信息的地方,记录的信息主要有:
block 与 inode 的总量;
未使用与已使用的 inode/block 数量;
block 与 inode 的大小(block 为 1,2,4K,inode 为 128bytes 或 256bytes);
filesystem 的挂载时间,最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;
一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0,若未被挂载,则 valid bit 为 1。
1.3.4 Filesystem Description(文件系统描述说明)
这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪一个 block 号码之间。
1.3.5 block bitmap(区块对照表)
从 block bitmap 当中可以知道哪些 block 是空的。
1.3.6 inode bitmap(inode 对照表)
记录使用与未使用的 inode 号码。
1.3.7 dumpe2fs:查询 Ext 家族 superblock 信息的指令
dumpe2fs [-bh] 装置文件名
选项与参数:
-b:列出保留为坏轨的部分(一般用不到)
-h:仅列出 superblock 的数据,不会列出其他的区毁内容
blkid 列出目前系统有被格式化的装置
2 文件系统的简单操作
2.1 磁盘与目录的容量
df [-ahikHTm] [目录或文件名] 列出文件系统的整体磁盘使用量
选项与参数:
-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k:以 KBytes 的容量显示各文件系统;
-m:以 MBytes 的容量显示各文件系统;
-h:以人们较易阅读的 GBytes,MBytes,KBytes 等格式自行显示;
-H:以 M=1000K 取代 M=1024K 的进位方式;
-T:连同该 partition 的 filesystem 名称(例如 xfs)也列出;
-i :不同磁盘容量,而以 inode 的数量来显示
du [-ahskmS] 文件或目录名 评估文件系统的磁盘使用量
选项与参数:
-a:列出所有文件与目录容量,因为默认仅统计目录底下的文件量而已;
-h:以人们较易读的容量格式(G/M)显示;
-s列出总量,而不列出每个各别的目录占用容量;
-S:不包括子目录下的总计;
-k:以 KBytes 列出容量显示;
-m:以 MBytes 列出容量显示。
2.2 实体链接与符号链接:ln
ln [-sf] 来源文件 目标文件
选项与参数:
-s:如果不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link;
-f :如果 目标文件 存在时,就主动将目标文件直接移除后再建立。
Hard Link(实体链接,硬式连结或实际连结)只是在某个目录下新增一笔档名链接到某 inode 号码的关联记录而已。
Symbolic Link(符号链接,亦即是快捷方式)就是在建立一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!
3 磁盘的分区、格式化、检验与挂载
磁盘操作:
1、对磁盘进行分区,以建立可用的 partition;
2、对该 partition 进行格式化 (format),以建立系统可用的 filesystem;
3、若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验;
4、在 Linux 系统上,需要建立挂载点(亦即是目录),并将他挂载上来。
3.1 观察磁盘分区状态
lsblk [-dfimpt] [device] 列出系统上的所有磁盘列表
选项与参数:
-d:仅列出磁盘本身,并不会列出该磁盘的分区数据
-f :同时列出该磁盘内的文件系统名称
-i :使用 ASCII 的线段输出,不要使用复杂的编码
-m:同时输出该装置在 /dev 底下的权限数据(rwx 的数据)
-p:列出该装置的完整文件名!而不是仅列出最后的名字而已
-t :列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等
blkid 列出装置的 UUID 等参数
parted device_name print 列出磁盘的分区表类型与分区信息
3.2 磁盘分区:gdisk/fdisk
MBR 分区表请使用 fdisk 分区,GPT 分区表情使用 gdisk 分区!
gdisk 装置名称:只要离开 gdisk 时按下【q】,那么所有的动作【都不会生效】相反的,按下【w】就是动作生效的意思。
gdisk 内部指令:
p:查询当前磁盘状态
?:查询指令
n:增加分区
d:删除分区
partprobe [-s] 更新 Linux 核心的分区表信息
cat /proc/partitions 查看核心分区记录
3.3 磁盘格式化(建置文件系统)
mkfs.xfs [-b bsize] [-d params] [-i params] [-l params] [-L label] [-f] [-r params] 装置名称
选项与参数:
关于单位:底下只要谈到【数值】,没有加单位则为 bytes 值,可以用 k,m,g,t,p(小写)来解释。比较特殊的是 s 这个单位,它指的是 sector 的个数。
-b:后面借的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k!
-d:后面接的是 data section 的相关参数值,主要值有:
agcount=数值:设定需要几个储存群组的意思(AG),通常与 CPU 有关
agsize=数值 :每个 AG 设定为多少容量的意思,通常 agcount/agsize 只选一个设定即可
file :指的是【格式化的装置是个文件而不是个装置】!(例如虚拟磁盘)
size=数值 :data section 的容量,亦即你可以不将全部的装置容量用完
su=数值 :当有 RAID 时,那个 stripe 数值的意思,与底下的 sw 搭配使用
sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)
sunit=数值 :与 su 相当,不过单位使用的是【几个 sector(512bytes 大小)】
swidth=数值 :就是 su*sw 的数值,但是以【几个 sector(512bytes 大小)】来设定
-f :如果装置内已经有文件系统,则需要使用这个 -f 来强制格式化
-i :与 inode 有较相关的设定,主要的设定值有:
size=数值 :最小是 256bytes 最大是 2k,一般保留 256 就足够使用了
internal=[0|1] :log 装置是否为内建,预设为 1 内建,如果要用外部装置,使用底下设定
logdev=device:log 装置为后面接的那个装置上头的意思,需设定 internal=0 才可
size=数值 :指定这块登录区的容量,通常最小得有 512 个 block,大约 2M 以上才行!
-L:后面接这个文件系统的标头名称 Label name 的意思!
-r :指定 realtime section 的相关设定值,常见的有:
extsize=数值 :就是那个重要的 extent 数值,一般不须设定,但有 RAID 时,最好设定与 swidth 的数值相同较佳!最小为 4K 最大为 1G。
mkfs.ext4 [-b size] [-L label] 装置名称 EXT4 文件系统格式化
选项与参数:
-b:设定 block 的大小,有 1K,2K,4K 的容量
-L:后面接这个装置的标头名称
3.4 文件系统检验
xfs_repair [-fnd] 装置名称 xfs 文件系统错乱使用这个指令
选项与参数:
-f :后面的装置其实是个文件而不是实体装置
-n:单纯检查并不修改文件系统的任何数据(检查而已)
-d:通常用在单人维护模式底下,针对跟目录(/)进行检查与修复的动作!不要随便使用
fsck.ext4 [-pf] [-b superblock] 装置名称 处理 EXT4 文件系统
选项与参数:
-p:当文件系统在修复时,若有需要回复 y 的动作时,自动回复 y 来继续进行修复动作。
-f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入细部检查,如果你想要强制 fsck 进入细部检查,就得加上 -f 旗标!
-D:针对文件系统下的目录进行优化配置
-b:后面接 superblock 的位置!一般来说这个选项用不到。但是如果你的 superblcok 因故损毁时,透过这个参数即可利用文件系统内备份的 superblcok 来尝试救援。一般来说, superblock 备份在:1K block 放在 8193,2K block 放在 16384,4K block 放在 32768。
3.5 文件系统挂载与卸除
挂载前注意事项:
1)单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
2)单一目录不应该重复挂载多个文件系统;
3)要作为挂载点的目录,理论上应该都是空目录才是。
mount -a
mount [-l]
mount [-t 文件系统] LABEL=' ' 挂载点
mount [-t 文件系统] UUID=' ' 挂载点
mount [-t 文件系统] 装置文件名 挂载点
选项与参数:
-a:依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来
-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称!
-t :可以加上文件系统种类类指定欲挂载的类型。常见的 Linux 支持类型有:xfs,ext3,ext4,reiserfs,vfat,iso9660(光盘格式),nfs,cifs,smbfs(后三种为网络文件系统类型)
-n:在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利其他程序的运作。但在某些情况下(例如单人维护模式)为了避免问题会刻意不写入。此时就要使用 -n 选项。
-o:后面可以接一些挂载时额外加上的参数!比方说账号、密码、读写权限等
umount [-fn] 装置文件名或挂载点
选项与参数:
-f:强制卸除!可用在类似网络文件系统(NFS)无法读取的情况下;
-l :立刻卸除文件系统,比 -f 还强!
-n:不更新 /etc/mtab 情况下卸除。
3.6 磁盘/文件系统参数修订
mknod 装置文件名 [bcp] [Major] [Minor] 通过文件的 major 与 minor 数值来修订
选项与参数:
装置种类:
b:设定装置名称成为一个周边储存设备文件,例如磁盘等;
c:设定装置名称成为一个周边输入设备文件,例如鼠标/键盘等;
p:设定装置名称成为一个 FIFO 文件;
Major:主要装置代码
Minor:次要装置代码
磁盘文件名 | Major | Minor |
/dev/sda | 8 | 0-15 |
/dev/sdb | 8 | 16-31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |