李守中

Linux 硬盘及文件系统操作

Table of Contents

1 EXT4 文件系统踩坑

1.1 df -h 命令报告 Size > Used + Avail

创建文件系统时,ext 系列文件系统默认保留 5% 的空间仅供 root 用户使用。目的是在极端情况下为 root 用户提供操作空间。

执行 sudo tune2fs -l <device-partition> 查看设备分区的信息。其中 Reserved block count 记录了为 root 用户保留的 block 的数量。

执行 sudo tune2fs -m 0 <device-partition> 可以释放分区所有的保留空间。

注: mdadm raid 设备 ( 比如 /dev/md0 ) 按分区处理。

2 磁盘命名

软盘驱动器命名:

  • 第一个软盘驱动器被命名为 /dev/fd0
  • 第二个软盘驱动器被命名为 /dev/fd1

SCSI 驱动器命名:

  • 第一个 SCSI 驱动器被命名为 /dev/sda
  • 第二个 SCSI 驱动器被命名为 /dev/sdb
  • 第一个 SCSI 光盘驱动器被命名为 /dev/scd0 ( 也叫 /dev/sr0 )

IDE 驱动器命名:

  • 主 IDE 控制器下的主磁盘被命名为 /dev/hda
  • 主 IDE 控制器的从盘命名为 /dev/hdb
  • 第二个 IDE 控制器的主磁盘和从磁盘分别被叫做 /dev/hdc 和 /dev/hdd
  • 较新的 IDE 控制器实际上有两个通道扮演着两个控制器的角色

磁盘分区通过在磁盘名称后面附加一个十进制数字来表示: sda1 和 sda2 代表系统里的第一个 SCSI 磁盘驱动器的第一个和第二个分区。

给一个例子。假设系统有两个 SCSI 磁盘,一个 SCSI 地址是 2,另外一个地址是 4。第一个磁盘 ( 在 2 上 ) 会被命名为 sda,第二个 ( 在 4 上 ) 会被命名为 sdb。如果 sda 驱动器有 3 个分区,它们将被命名为 sda1, sda2 和 sda3。这个规律同样适用于 sdb 及其分区。

注意: 如果有两个 SCSI 主机总线适配器 ( 控制器 ),设备的顺序可能会比较混乱。最好的解决方案是观察引导信息。如果能知道驱动器型号和/或者容量,也能容易地分辨设备。

3 磁盘分区

3.1 硬盘容量小于 2T

debian 系统中,root 以外的用户没有把 /usr/sbin 加入环境变量,所以用 fdisk 命令时要自己补全路径。

查看磁盘信息 sudo /usr/sbin/fdisk -l ,确定要分区的硬盘设备后,执行 sudo /usr/sbin/fdisk /dev/<device> 后进入命令行。按需输入命令:

  • m 查看帮助信息。
  • p 显示现有分区信息。
  • n 创建新分区。
  • d 删除现有分区。
  • t 修改分区类型。
  • l 查看所有分区类型。
  • w 保存并退出。

执行 cat /proc/partitions 查看目前分区情况。

3.2 硬盘容量大于 2T

fdisk 工具只能处理 2T 容量及以下的硬盘,如果用它处理 2T 以上的盘,硬盘将只有 2T 可用。

执行 sudo apt install parted 使用 parted 可以管理容量大于 2T 的磁盘。

执行 sudo parted /dev/<device> 进入命令交互模式,开始分区:

  1. (parted) mklabel gpt 创建 GPT 分区表。
  2. (parted) mkpart <primary | logical | extended> [ext4 | xfs |...] <[0% 100%] | [1K,M,G,T 5K,M,G,T]> 创建分区。
  3. (parted) name <partition number> <name> 重命名分区。
  4. (parted) print 查看硬盘分区。
  5. (parted) quit 退出。

3.3 让内核重新读取分区表

  • debian:
    • sudo partprobe /dev/sdb 重读分区表。
    • sudo partprobe 强制重读所有设备。
  • centos 6 / 7:
    • sudo kpartx -a /dev/sdbsudo kpartx -af /dev/sdb 重读分区表。
    • sudo kpartx -asudo kpartx -af 强制重读所有设备。

注: 一次执行不成功可执行多次。

4 磁盘分区上的文件系统

注 1: 如果硬盘以前在 VMware 全家桶上使用,现在要将其加入 PVE 或者 Ceph 系统。如果硬盘没有做全盘写 0 这种彻底的数据擦除,那么在硬盘初始化阶段中,系统会在硬盘中找到 VMFS_volume_member 信息导致初始化失败。解决这个问题需要手动清理残留信息。

VMFS volume memberVMFS filesystem 的超级块分别位于距离分区起始位置的 1024 KiB2048 KiB 偏移量处,因此可以擦除硬盘前 4 MiB 的块来清除残留数据。比如,执行 dd if=/dev/zero of=/dev/<disk-device> bs=4M count=1 擦除设备。

最后可执行 lsblk -f 确认文件系统的类型。

注 2: linux 内核在 4.1 之后支持了 xfs 文件系统,使用 xfs 需要系统内有 xfsprogs 工具包。

注 3: ext 系列文件系统在生态上比 xfs 要好很多,远没有过时,所以下文主要以 ext 系列文件系统为例子。

4.1 为分区创建文件系统

执行 sudo /usr/sbin/mkfs.ext4 /dev/<disk-partition> Linux 默认 ext4 文件系统。

格式化分区的命令还可以使用 /usr/sbin/mke2fs [OPTION] <device>:

  • -t {ext2 | ext3 | ext4} 指明要创建的文件系统的类型。
    • mke2fs -t ext4 /dev/<device-partition> = mkfs -t ext4 /dev/<device-partition> = mkfs.ext4 /dev/<device-partition>
  • -b {1024 | 2048 | 4096} 文件系统的块大小。
  • -l <label> 指明卷标。卷标可以在 /usr/sbin/blkid <device> 命令的输出中查看。
  • -j 创建有日志功能的文件系统 ( 就是创建 ext3 系统 )。
    • mke2fs -j /dev/<device-partition> = mkfs -t ext3 /dev/<device-partition> = mkfs.ext3 /dev/<device-partition>
  • -i <number> 指明多大字节的数据块创建一个 inode。
  • -N <number> 指明要给文件系统创建的 inode 的数量。
  • -m <number> 指定预留空间,数字为百分比。默认 5%。
  • -O <feature> 以指定的特性创建文件系统。

注: mkfs 和 mke2fs 不支持 xfs 文件系统。

4.2 调整分区属性

ext 系列文件系统的卷标:

  • 执行 sudo /usr/sbin/e2label /dev/<device-partition> 可以查看设备分区的卷标。
  • 执行 sudo /usr/sbin/e2label /dev/<device-partition> <label-name> 可将设备分区的卷标设置为 <label-name> 指定的值。

xfs 文件系统的卷标:

  • e2label 命令无法读取 xfs 文件系统,所以要用 sudo xfs_admin -l /dev/<device-partition> 查看卷标。
  • 执行 sudo xfs_admin -L <label-name> /dev/<device-partition> 可以将指定的设备分区的卷标设置为 <label-name> 指定的值。

sudo /usr/sbin/tune2fs [OPTION] <device> 可以查看或调整文件系统的某些属性:

  • -l 列出超级块中的内容:
    • Filesystem features 已经启用的特性。
    • Filesystem magic number 文件系统类型。
    • Default mount options 默认的挂载选项。
    • Filesystem state: clean 文件系统处于一致状态显示为 cleandirty 表示不一致:
      • 意外断电关机一定会有文件不完整,此时文件系统处于 dirty 状态。
  • 修改指定文件系统的属性:
    • -j 将 ext2 升级为 ext3。
    • -L <label> 修改卷标为 <label> 指定的值。
    • -m <number> 不格式化分区的情况下,调整预留给 root 用户的空间的百分比。
    • -O <feature> 开启或关闭某种特性。
    • -o <mount-option> 调整默认挂载属性。

注意: 块大小无法修改。

sudo /usr/sbin/dumpe2fs -h <device-partition> 显示 ext 系列文件系统的属性信息。

sudo /usr/sbin/blkid 查找文件系统:

  • <device-or-device-partition> 查看设备或分区上的文件系统的信息。
  • -L <label> 根据 <label> 定位设备。
  • -U <uuid> 根据 <uuid> 定位设备。

4.3 文件系统检测与修复

因进程意外终止或系统崩溃等原因导致文件写入操作非正常中止,可能造成文件损坏。此时应检测并修复文件系统,建议离线进行。

xfs 文件系统:

  • 检测文件系统: sudo xfs_ncheck /dev/<device-partition>
  • 修复文件系统: sudo xfs_repair -v /dev/<device-partition>
  • 碎片整理:
    • 检查碎片程度: sudo xfs_db -c frag -r /dev/<device-partition>
    • 进行碎片整理: sudo xfs_fsr /dev/<device-partition>

ext 系列文件系统的专用工具 e2fsck 可被用于检查 exit2/exit3/exit4 文件系统,命令格式 e2fsck [option] <device>:

  • -y 所有疑问均回答 yes
  • -f 即使文件系统处于 clean 状态也强制进行检测。

sudo /usr/sbin/fsck 通用的文件系统检测工具:

  • -t <file-system-type> 指明文件系统的类型:
    • fsck -t ext4 = fsck.ext4
  • -a 无需交互,自动修复所有错误。修复时会自动删除未写完的文件,不推荐用。
  • -r 交互式修复。

4.4 挂载设置

文件系统挂载到根目录上的某个文件夹之后,才能通过该目录 ( 挂载点 ) 访问文件系统 ( 即访问磁盘的某个分区 )。

挂载点,是文件系统的访问入口 ( 简单理解,是个文件夹 ):

  • 事先存在。
  • 不要使用被其他进程使用的目录。
  • 挂载点下原有的文件将被隐藏。

mount [option] [-t vfstype] [-o options] <device> <dir> 命令中:

  • 命令选项:
    • -r 意为 read only 只读挂载 ( 比如光驱 ),
    • -w 意为 read & write 读写挂载,是默认选项。
    • -n 禁止设备的挂载或卸载的操作同步更新至 /etc/mtab 。默认会同步。
  • -t 选项:
    • -t 指明要挂载的设备上的文件系统的类型,多数情况下可省略,此时 mount 命令会通过 blkid 命令来识别要挂载的设备的文件系统的类型。
    • -L <label> 挂载时用卷标指明要挂载的设备。
    • -U <uuid> 挂载时用 uuid 指明要挂载的设备。
  • -o 挂载选项:
    • sync / async 采用 同步 / 异步 写入。
    • atime / noatime:
      • atime 当文件被访问时,马上更新文件的时间戳。
      • noatime 不更新文件时间戳。
    • diratime / nodiratime:
      • diratime 当目录被访问时,马上更新目录的时间戳。
      • nodiratime 不更新目录时间戳。
    • remount 重新挂载文件系统。
    • acl 支持使用 facl ( 文件访问控制 ) 功能。
    • ro 只读挂载。
    • rw 读写挂载。
    • dev / nodev 此设备上 允许 / 不允许 创建设备文件 ( /dev/ 下的文件为设备文件 )。
    • exec / noexec 是否允许运行此设备上的程序文件。
    • auto / noauto 是否允许自动挂载。
    • user / nouser 是否允许普通用户挂载此文件系统。
    • suid / nosuid 是否允许程序文件上的 suid 和 sgid 特殊权限生效。
    • relatime / norelatime 是否参考文件的修改时间来更新 inode 的访问时间。
    • defaults 使用默认选项: rw, suid, dev, exec, auto, nouser, async, relatime

注: 可以将目录绑定至另一个目录上,作为临时访问入口 mount --bind <target-dir> <entrance-dir>

查看当前系统所有已经挂载的设备:

  • 查看挂载表: cat /etc/mtab
  • 格式化解析挂载表: mount
  • 查看保存在内核中的挂载信息: cat /proc/mounts

挂载光盘 / U 盘:

  • mount -r /dev/cdrom <mount_point>
  • 光盘设备文件 /dev/cdrom/dev/dvd:
    • /dev/cdrom 是一个链接,指向真正的光盘文件。
    • 具体哪个才是要找的设备则需要参考存储容量来反推。

挂载本地的回环设备 ( 直接挂载 ISO 文件 ): mount -o loop <path-to-iso-file> <path-to-mount-point>

4.5 取消挂载

命令 sudo umount {<device> | <dir>} 可以卸载设备。

注: 正在被进程访问的挂载点无法被取消挂载。

取消挂载失败:

  1. 找到哪个进程正在使用挂载点:
    • 显示哪个进程正在使用挂载点里的数据: lsof <path-to-mount-point>
    • 显示哪个用户的什么进程正在使用挂载点的数据: fuser -v <path-to-mount-point>
  2. 干掉所有使用挂载点的进程: fuser -km <path-to-mount-point>

4.6 开机自动挂载文件系统

/etc/fstab 文件中,每行 6 个字段定义了一个要开机挂载的文件系统及其相关属性:

  1. 要挂载的文件设备:
    1. 设备文件
    2. LABEL
    3. UUID
    4. 伪文件系统
  2. 挂载点:
    1. 文件夹路径。
    2. swap 分区的挂载点为 swap
  3. 文件系统类型。
  4. 挂载选项:
    1. defaults 表示使用默认挂载选项。
    2. 如果要指明多个挂载选项,每个选项之间用逗号隔开。比如 defaults, acl, noatime, noexec
  5. 转储 ( 备份 ) 频率:
    1. 0 表示从不删除。
    2. 1 每天备份一次。
    3. 2 每隔一天备份一次。
  6. 自检次序:
    1. 0 不自检。
    2. 1 第一个自检 ( 通常根文件系统才用 1 )。
    3. 2 次级自检 ( 多个文件系统可以有相同的自检次序 )。
    4. 0-9 自检等级有 0 - 9 多个等级。

/etc/fstab 文件中的自动挂载配置实例:

  • 通过指定设备: /dev/sdb1 /mnt/400GIntelS3710 xfs defaults 0 0
  • 通过指定设备 uuid: UUID=cb111...c89c /mnt ext4 defaults,acl 0 0
  • 通过指定设备 label: LABEL=MYDATA /mnt ext4 defaults 0 0

更改完成后,执行 mount -a 即可挂载 /etc/fstab 文件里指明的所有设备。



Last Update: 2023-05-18 Thu 08:32

Contact: [email protected]     Generated by: Emacs 27.1 (Org mode 9.3)

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议