磁盘的物理组成:
- 圆形的碟片,主要记录数据的部分
- 机械手臂,与在机械手臂上的磁头(可以擦写碟片上的数据)
- 主轴马达,可以转动碟片,让机械手臂的磁头在碟片上读写数据
- 扇区,为最小的物理存储单位,且依据磁盘设计的不同,目前主要有512B和4KB两种格式
- 将扇区组成一个圆,也就是柱面
- 早期分区主要以柱面为最小分区单位,现在分区通常使用扇区为最小分区单位,且每个扇区都有其号码
- 磁盘分区表主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GPT分区表
- MBR分区表中,第一个扇区最重要,主引导记录(MBR)和分区表,其中MBR占446B,分区表占64B
- GPT分区表除了分区数量扩充较多之外,支持的磁盘容量也可超过2TB
磁盘文件名:
- 物理磁盘文件名:/dev/sd[a-p][1-128]
- 虚拟磁盘文件名:/dev/vd/[a-d][1-128]
文件系统特性:
- 因为每种操作系统所设置的文件属性/权限不同,所以在将磁盘分区完毕后,还需要进行格式化,以成为操作系统能够利用的文件系统格式后,操作系统才能使用这个文件系统。
- Linux 文件系统为 ext2;默认情况下,Windows 不支持 Linux 的 ext2 文件系统。
- 传统的磁盘与文件系统的应用中,一个分区就只能够被格式化为一个文件系统;但是由于新技术的应用,这些技术可以将一个分区格式化为多个文件系统(如LVM),也能将多个分区合并为一个文件系统(LVM,RAID),所以目前的格式化不再说成是针对硬盘分区格式化。通常我们可以称一个可被挂载的数据为一个文件系统而不是一个分区
- 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式和其他相关信息
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件数据所在的区块号码
- 数据区块:实际记录文件的内容,若文件太大会占用多个区块
- 碎片整理:当文件写入的区块太过离散,此时文件的读取性能变得很差;这时就可以通过碎片整理将同一个文件所属的区块集合到一起。
数据区块
- ext2 文件系统中所支持的区块大小有1K、2K、4K三种;
- 原则上区块的大小和数量在格式化后就不能再修改(除非重新格式化);
- 每个区块最多只能放一个文件的数据;
- 承上,如果文件大小大于区块的大小,那么一个文件将会占用多个区块数量;
- 承上,如果文件大小小于区块的大小,那么该区块的剩余容量就会被闲置,造成磁盘空间的浪费;
inode表:
inode记录的数据至少有以下:
- 该文件的读、写、执行属性(read、wirte、excute)
- 该文件的拥有者与用户组(owner、group)
- 该文件的大小
- 该文件建立或状态改变的时间(ctime)
- 该文件最近一次读取的时间(atime)
- 该文件最近修改的时间(mtime)
- 定义文件特性的标识,如SetUID
- 该文件真正内容的指向
超级区块:
超级区块记录的数据至少有以下:
- 数据区块与inode的总量
- 未使用和已使用的inode与数据区块数量
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息
- 一个有效位数值,若此文件系统已被挂载,则有效位为0,若未被挂载,有效位为1
新建文件时,文件系统的操作:
- 先确定用户对欲新增文件的目录有无 w 和 x 权限,有才能进行新增;
- 根据inode对照表找到没有使用的inode号码,并将新文件的权限 / 属性写入;
- 根据区块对照表找到没有被使用的区块号码,并将实际的数据写入区块中,且更新inode的区块指向数据;
- 将刚刚写入的inode与区块数据同步更新inode对照表和区块对照表,并更新超级区块的内容;
XFS文件系统
df:列出文件系统的整体磁盘使用量
- 指令格式:df [-可选参数] [文件 / 目录]
参数或选项 | 含义 |
---|
-a | 列出所有的文件系统,包括系统特有的 /proc 等文件系统 |
-k | 以KBytes容量显示各文件系统 |
-m | 以MBytes容量显示各文件系统 |
-h | 以人类较易读的GBytes、MBytes、KBytes等格式自行显示 |
-H | 以M=1000K替换M=1024K的进位方式 |
-T | 连同该硬盘分区的文件系统名称也列出 |
-i | 不用磁盘容量,而以inode的数量来显示 |
- 当 df 后边加上目录或是文件时,df 会自动分析该目录或文件所在的硬盘分区,并将该硬盘分区的容量显示出来
du:查看文件系统的磁盘使用量(常用在查看目录所占磁盘空间)
参数或选项 | 含义 |
---|
-a | 列出所有的文件与目录容量,默认仅统计目录下面的文件量 |
-h | 以人类较易读的GBytes、MBytes、KBytes等格式自行显示 |
-s | 仅列出总量,而不列出每个别的目录占用容量 |
-S | 不包括子目录下的总计 |
-k | 以KBytes容量显示 |
-m | 以MBytes容量显示 |
- 只输入 du 指令而不加任何选项时,du 会分析【目前所在目录】的文件与目录所占用的磁盘空间;但实际仅会显示目录容量,不含文件。
硬链接与符号链接:ln
- 指令格式:ln [-参数] 源文件 目标文件
- -s:不加任何参数为硬链接,加上这个参数为符号链接
- -f:若目标文件存在,则将目标文件删除后再建立
硬链接:
- 通过文件系统的inode来产生新文件名,而不是新文件
- 硬链接只是在某个目录下新增一条文件名链接到某inode号码的关联记录而已;指向的是同一个inode号码
- 使用硬链接设置链接文件时,磁盘的空间与inode数目都不会发生改变
- 硬链接的限制:不能跨文件系统、不能链接目录
符号链接:
- 建立一个独立的文件,这个文件会让数据的读取指向它链接的那个文件的文件名
- 当源文件被删除后,符号链接的文件会打不开
- 两个文件指向的是不同的 inode
- 符号链接可以与 Windows 的快捷方式划上等号,由符号链接创建的文件为一个独立的新文件,所以它会占用 inode 与区块
lsblk:列出系统上所有的磁盘列表
- 指令格式:lsblk [-可选参数] [device]
参数与选项 | 含义 |
---|
-d | 仅列出磁盘本身,不列出该磁盘的分区数据 |
-f | 同时列出该磁盘的文件系统名称 |
-i | 使用ASCII字符输出 |
-m | 同时输出该设备在 /dev 下的权限信息 |
-d | 仅列出磁盘本身,不列出该磁盘的分区数据 |
-p | 列出设备的完整文件名 |
-t | 列出该磁盘设备的详细数据,包括磁盘阵列机制,预读写的数据量大小 |
blkid:列出设备的UUID等参数
- UUID是全局唯一标识符,这个标识符可以拿来作为挂载或是使用这个设备或文件系统
parted:列出磁盘的分区表类型与分区信息
磁盘分区:
- MBR分区表使用 fdisk 分区
- GPD分区表使用 gdisk 分区
gdisk
- 指令格式:gdisk 设备名称
- 可以输入命令来对目前查看的磁盘分区进行操作,按问号可以查看到具体的命令对应的操作
- 常见命令操作如下:
命令 | 操作 |
---|
b | 备份GPT数据到文件 |
c | 修改分区名称 |
d | 删除一个分区 |
i | 显示分区详细信息 |
l | 列出已知的分区类型 |
n | 增加一个分区 |
o | 创建一个新的GPT |
p | 打印出分区表 |
q | 不保存分区,直接离开 gdisk |
w | 保存操作分区后离开 gdisk |
- 注意:使用的设备文件名不要加上数字,因为磁盘分区是针对整个磁盘,而不是某一个分区
fdisk
命令 | 操作 |
---|
d | 删除一个此磁盘分区 |
n | 新增一个磁盘分区 |
p | 打印出分区表 |
q | 不保存分区,直接离开 gdisk |
w | 保存操作分区后离开 gdisk |
磁盘格式化(即创建文件系统)
mkfs.xfs
- 指令格式:mkfs.xfs [ 可选参数 ] 设备名称
参数 | 含义 |
---|
-b | 后边跟区块容量,512B至4K |
-d | 后边跟data section 参数值,主要的参数值有:agcount=数值:设置需要几个存储群组的意思;agsize=数值:设置AG为多大容量; |
-f | 如果设备内已有文件系统,需要使用该参数来进行强制格式化 |
-L | 后边跟这个文件系统的标头名称的意思 |
-r | 指定 realtime section设置值,常见的有 extsize=数值 |
文件系统校验
xfs_repair 处理xfs文件系统
- 当有xfs文件系统发生错乱时才需要使用这个命令
- 指令格式:xfs_repair [-可选参数] 设备名称
参数 | 含义 |
---|
-f | 后边的其实是文件而不是实体设备 |
-n | 单纯检查而不修改文件系统的任何数据 |
-d | 用在单人模式下,针对根目录进行检查与修复,谨慎使用 |
- 修复时文件不能被挂载,否则会报错;可以卸载后再进行处理
fsk.ext4 处理 ext4 文件系统
-指令格式:fsk.ext4 [ -pf ][ -b 超级区块 ] 设备名称
参数 | 含义 |
---|
-p | 当文件系统在修复时,若有需要回覆 y 的操作时,自动回覆 y 来继续进行操作 |
-f | 强制检查 |
-D | 针对文件系统下的目录进行最优配置 |
-b | 其后跟超级区块,一般来说用不上这个选项,但当超级区块因故损坏时,通过这个参数即可利用文件系统内备份的超级区块来尝试修复 |
注意:无论是xfs_repair还是fsk.ext4,通常只有身为Root且你的文件系统有问题时才能使用这两个命令,否则在正常情况下使用该命令,可能会造成对系统的危害。
文件系统的挂载与卸载
挂载点是目录,而这个目录是进入磁盘分区(也就是文件系统)的入口。在进行挂载前,需要确定几件事:
- 单一文件系统不应被重复挂载在不同的挂载点(目录)中
- 单一目录不应该重复挂载多个文件系统
- 要做为挂载点的目录,理论上应该是空目录才行
- 如果用来挂载的目录并不是空的,那么挂载了文件系统后,原本目录下的东西会暂时消失;注意:并非是目录原来的文件被覆盖,而是暂时被隐藏,当你把新挂载的文件系统卸载后,隐藏的文件就会出现。
mount:将文件系统挂载到Linux上
- mount -a
- mount [ -l ]
- mount [ -t 文件系统 ] LABEL=‘ ’ 挂载点
- mount [ -t 文件系统 ] UUID=‘ ’ 挂载点
- mount [ -t 文件系统 ] 设备文件名 挂载点
参数 | 含义 |
---|
-a | 依照配置文件 /tec/fstab 的数据将所有未挂载的磁盘都挂载上 |
-l | 单纯的输入 mount 会显示目前的挂载信息,加上 -l 可以加上列 Lable 名称 |
-t | 可以加上文件系统种类来指定预挂载的类型 |
-n | 默认情况下,系统会将实际挂载的情况写入 /etc/mtab 中,以利其他程序的运行 |
-o | 其后可以跟一些挂载时额外加上的参数 |
umount:将设备文件卸载
- 指令格式:umount [ -参数 ] 设备文件名或挂载点
参数 | 含义 |
---|
-f | 强制卸载,可用在类似网络系统(NFS)无法读取到的情况下 |
-l | 立即卸载文件系统 |
-n | 不更新 /etc/mtab 情况下卸载 |
磁盘/文件系统参数自定义
mknod
- 文件通过其 major 与 minor 数值来代表设备
- 常见磁盘文件名 /dev/sda 与 /dev/loop0 的设备代码如下所示:
磁盘文件名 | major | minor |
---|
/dev/sda | 8 | 0~15 |
/dev/sdb | 8 | 16~31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |
- 指令格式:mknod 设备文件名 [bcp] [Major] [Minor]
选项与参数 | 设备种类 |
---|
b | 设置设备名称成为一个外接存储设备文件,如磁盘等 |
c | 设置设备名称成为一个外接输入设备文件,如鼠标、键盘等 |
p | 设置设备名称成为一个FIFO文件 |
Major | 主要设备代码 |
Minor | 次要设备代码 |
xfs_admin:修改XFS文件系统的UUID与Label name
- 如果当初格式化的时候忘记加上标头名称,后来想要加上时,无需重复格式化,使用 xfs_admin 就可以设置 Label name 和 UUID
- 指令格式:xfs_admin [ -lu ] [ -L label ] [ -U uuid ]
选项与参数 | 含义 |
---|
-l | 列出这个设备的 lable name |
-u | 列出这个设备的 UUID |
-L | 设置这个设备的 label name |
-U | 设置这个设备的UUID |
tune2fs:修改etx4的UUID与Label name
- tune2fs [ -l ] [ -L label ] [ -U uuid ]
选项与参数 | 含义 |
---|
-l | 将 superblock 内的数据读出来 |
-L | 修改 label name |
-U | 修改 UUID |
设置启动挂载
系统挂载的限制:
- 根目录 / 是必须挂载的,且一定要先于其他挂载点被挂载进来
- 其他挂载点必须为已建立的目录,可以任意指定,但一定要遵守必需的系统目录架构原则
- 所有挂载点,在同一时间之内之内挂载一次
- 所有硬盘分区在同一时间之内,只能挂载一次
- 若要进行卸载,必须先将工作目录及其子目录移到挂载点之外
/etc/fstab 文件字段
- 第一栏设备 / UUID 等:磁盘设备文件名,填写的数据主要有:文件系统或磁盘的设备文件名;文件系统的UUID名称;文件系统的LABEL名称
- 第二栏挂载点(mount point):挂载点一定是目录
- 第三栏磁盘分区的文件系统:在手动挂载时可以让系统自动测试挂载
- 第四栏文件系统参数:在手动挂载时可以让系统自动测试挂载
参数 | 内容意义 |
---|
async / sync 异步 / 同步 | 设置磁盘是否以异步方式运行,默认async(性能较佳) |
auto / noauto 自动 / 非自动 | 当执行 mount -a 时,此文件系统是否会被主动测试挂载,默认为 auto |
rw / ro 可擦写 / 只读 | 让该分区以可读性或只读的状态挂载上来,如果想要分享的数据是不愿给用户随意变更,这里也只能够设置为只读,则不论在此文件系统中的文件是否设置 w 权限,都无法写入 |
exec / noexec 可执行 / 不可执行 | 限制在此文件系统内是否可以进行【执行】的工作;如果是纯粹用来存储数据的目录,设置为 noexec 会更加安全。但不能乱用该参数,因为你不知道该目录下是否默认会有执行文件 |
user / nouser 允许 / 不允许用户挂载 | 是否允许用户使用 mount 命令来挂载,为了更加安全,一般设置为 nouser |
suid / nosuid 具有 / 不具有 suid 权限 | 该文件系统是否允许 SUID 的存在,如果不是执行文件放置目录,也可以设置为 nosuid 来取消这个功能 |
defaults 默认值 | 同时具有 rw、suid、dev、exec、auto、nouser、async等参数,基本上,默认情况使用 defaults 设置即可 |
- 第五栏能否被 dump 备份命令作用
- 第六栏是否为 fsck 检验扇区