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>
进入命令交互模式,开始分区:
(parted) mklabel gpt
创建 GPT 分区表。(parted) mkpart <primary | logical | extended> [ext4 | xfs |...] <[0% 100%] | [1K,M,G,T 5K,M,G,T]>
创建分区。(parted) name <partition number> <name>
重命名分区。(parted) print
查看硬盘分区。(parted) quit
退出。
3.3 让内核重新读取分区表
- debian:
sudo partprobe /dev/sdb
重读分区表。sudo partprobe
强制重读所有设备。
- centos 6 / 7:
sudo kpartx -a /dev/sdb
或sudo kpartx -af /dev/sdb
重读分区表。sudo kpartx -a
或sudo kpartx -af
强制重读所有设备。
注: 一次执行不成功可执行多次。
4 磁盘分区上的文件系统
注 1: 如果硬盘以前在 VMware 全家桶上使用,现在要将其加入 PVE 或者 Ceph 系统。如果硬盘没有做全盘写 0 这种彻底的数据擦除,那么在硬盘初始化阶段中,系统会在硬盘中找到 VMFS_volume_member
信息导致初始化失败。解决这个问题需要手动清理残留信息。
VMFS volume member
和 VMFS filesystem
的超级块分别位于距离分区起始位置的 1024 KiB 和 2048 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
文件系统处于一致状态显示为 clean 而 dirty 表示不一致:- 意外断电关机一定会有文件不完整,此时文件系统处于 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>}
可以卸载设备。
注: 正在被进程访问的挂载点无法被取消挂载。
取消挂载失败:
- 找到哪个进程正在使用挂载点:
- 显示哪个进程正在使用挂载点里的数据:
lsof <path-to-mount-point>
- 显示哪个用户的什么进程正在使用挂载点的数据:
fuser -v <path-to-mount-point>
- 显示哪个进程正在使用挂载点里的数据:
- 干掉所有使用挂载点的进程:
fuser -km <path-to-mount-point>
4.6 开机自动挂载文件系统
/etc/fstab 文件中,每行 6 个字段定义了一个要开机挂载的文件系统及其相关属性:
- 要挂载的文件设备:
- 设备文件
- LABEL
- UUID
- 伪文件系统
- 挂载点:
- 文件夹路径。
- swap 分区的挂载点为
swap
。
- 文件系统类型。
- 挂载选项:
defaults
表示使用默认挂载选项。- 如果要指明多个挂载选项,每个选项之间用逗号隔开。比如
defaults, acl, noatime, noexec
。
- 转储 ( 备份 ) 频率:
0
表示从不删除。1
每天备份一次。2
每隔一天备份一次。
- 自检次序:
0
不自检。1
第一个自检 ( 通常根文件系统才用 1 )。2
次级自检 ( 多个文件系统可以有相同的自检次序 )。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 文件里指明的所有设备。