在Debian系统中,有效地管理和优化数据存储是确保系统性能和稳定性的关键。随着数据量的不断增长,不妨要经常监控硬盘空间使用情况、配置分区、设置文件系统以及执行高级优化技术变得尤为重要。本教程将介绍一系列的数据存储技巧,帮助系统管理员和用户充分利用Debian系统中的存储资源。
启动系统进入救援模式,可以通过使用 live CD 或 debian-installer CD。这种模式允许轻松地重新配置已连接启动设备上的数据存储设置。
如果这些设备在图形用户界面(GUI)下被自动挂载,可能需要在命令行手动执行 umount(8) 命令来卸载它们,以便进行进一步操作。
一、硬盘空间使用情况
硬盘空间的使用情况可以通过 mount、coreutils 和 xdu 软件包提供的程序来评估:
mount(8) 显示所有挂载的文件系统(= 磁盘);
df(1) 报告文件系统使用的硬盘空间;
du(1) 报告目录树使用的硬盘空间。
可以将 du(8) 的输出传输给 xdu(1x),来使用它的图形交互式演示,例如 “du -k . |xdu”、“sudo du -k -x / |xdu” 等等。
二、硬盘分区配置
对于硬盘分区配置,尽管 fdisk(8) 被认为是标准的配置,但是 parted(8) 工具还是值得注意的。
老的 PC 使用经典的主引导记录(Master Boot Record,MBR)方案,将硬盘分区数据保存在第一个扇区,即 LBA 扇区 0(512 字节)。
一些带有统一可扩展固件接口(Unified Extensible Firmware Interface,UEFI)的近代 PC,包括基于 Intel 的 Mac,使用 全局唯一标识分区表(GUID Partition Table,GPT)方案,硬盘分区数据不保存在第一个扇区。尽管 fdisk(8) 一直是硬盘分区的标准工具,但现在 parted(8) 替代了它。
硬盘分区管理软件包:
软件包 | 流行度 | 大小 | 说明 |
util-linux | V:881, I:999 | 5283 | 多种系统工具,包含 fdisk(8) 和 cfdisk(8) |
parted | V:411, I:565 | 122 | GNU Parted,硬盘分区调整程序 |
gparted | V:14, I:103 | 2175 | 基于 libparted 的 GNOME 分区编辑程序 |
gdisk | V:330, I:506 | 885 | 用于 GPT/MBR 并存的硬盘的分区编辑程序 |
kpartx | V:21, I:34 | 77 | 为分区建立设备映射的程序 |
尽管 parted(8) 声称也能用来创建和调整文件系统,但使用维护最好的专门工具来做这些事会更为安全,例如 mkfs(8)(mkfs.msdos(8)、mkfs.ext2(8)、mkfs.ext3(8)、mkfs.ext4(8)……)和 resize2fs(8)。
为了在 GPT 和 MBR 之间切换,需要直接删除开头的几个块中的内容并使用 “parted /dev/sdx mklabel gpt” 或 “parted /dev/sdx mklabel msdos” 来设置它。请注意,这里使用的 “msdos” 是用于 MBR。
三、使用UUID访问分区
尽管重新配置分区或可移动存储介质的激活顺序可能会给分区产生不同的名字,但可以使用同一个 UUID 来访问它们。如果有多个硬盘并且 BIOS/UEFI 没有给它们一致的设备名的话,使用 UUID 是不错的选择。
mount(8) 命令带有 “-U” 选项可以使用UUID 来挂载一个块设备,而不必使用他的文件名称,例如 “/dev/sda3”;
“/etc/fstab”可以使用 UUID;
引载加载程序也可以使用 UUID。
可以使用 blkid(8) 来查看一个特定块设备的 UUID。
也可以使用 “lsblk -f”来检测 UUID 并查看其它信息。
四、LVM2
LVM2 是一个用于 Linux 内核的逻辑卷管理器。使用 LVM2 的话,硬盘分区可以创建在逻辑卷上来替代物理硬盘。
LVM 有下列需求:
Linux 内核中的设备映射支持(Debian 内核默认支持);
用户自定义设备映射支持库(libdevmapper* 软件包);
用户自定义 LVM2 工具(lvm2 软件包)。
请从下面的 man 手册开始了解 LVM2:
lvm(8):LVM2 机制的基础知识(列出了所有 LVM2 命令);
lvm.conf(5):LVM2 的配置文件;
lvs(8):报告逻辑卷的相关信息;
vgs(8):报告卷组的相关信息;
pvs(8):报告物理卷的相关信息。
五、文件系统配置
对于 ext4 文件系统, e2fsprogs 包提供下面的工具:
mkfs.ext4(8) 创建新的 ext4 文件系统;
fsck.ext4(8) 检查和修复现有 ext4 文件系统;
tune2fs(8) 配置 ext4 文件系统的超级块。
debugfs(8) 交互式的调试 ext4 文件系统. (它有 undel 命令来恢复已经删除的文件.)
mkfs(8) 和 fsck(8) 命令是由 e2fsprogs 包提供的,是各种文件系统相关程序的前端。(mkfs.fstype 和 fsck.fstype). 对于 ext4 文件系统,它们是 mkfs.ext4(8) 和 fsck.ext4(8) (它们被符号链接到 mke2fs(8) 和 e2fsck(8)).
Linux 支持的每一个文件系统,有相似的命令。
文件系统管理包列表:
软件包 | 流行度 | 大小 | 说明 |
e2fsprogs | V:767, I:999 | 1501 | ext2/ext3/ext4 文件系统工具 |
btrfs-progs | V:44, I:72 | 5078 | Btrfs 文件系统工具 |
reiserfsprogs | V:12, I:25 | 473 | Reiserfs 文件系统工具 |
zfsutils-linux | V:29, I:30 | 1755 | OpenZFS 文件系统工具 |
dosfstools | V:190, I:536 | 315 | FAT 文件系统工具. (Microsoft: MS-DOS, Windows) |
exfatprogs | V:28, I:355 | 301 | exFAT 文件系统工具,由三星维护。 |
exfat-fuse | V:5, I:129 | 73 | FUSE 读写 exFAT 文件系统(微软)驱动。 |
exfat-utils | V:4, I:116 | 231 | exFAT 文件系统工具,由 exfat-fuse 的作者维护。 |
xfsprogs | V:22, I:96 | 3493 | XFS 文件系统工具. (SGI: IRIX) |
ntfs-3g | V:197, I:509 | 1470 | FUSE 读写 NTFS 文件系统(微软:Windows NT……)驱动。 |
jfsutils | V:0, I:8 | 1577 | JFS 文件系统工具. (IBM: AIX, OS/2) |
reiser4progs | V:0, I:2 | 1367 | Reiser4 文件系统工具 |
hfsprogs | V:0, I:5 | 394 | HFS 和 HFS Plus 文件系统工具. (Apple: Mac OS) |
zerofree | V:5, I:130 | 25 | 把 ext2/3/4 文件系统上空闲块设置为零的程序 |
Ext4 文件系统是 Linux 系统上默认的文件系统,强烈推荐使用这个文件系统,除非有特殊的理由不使用。
Btrfs 状态能够在 Debian wiki on btrfs 和 kernel.org wiki on btrfs 发现。它被期望作为 ext4 文件系统之后的下一个默认文件系统。
六、挂载选项文件系统创建
mkfs(8) 在 Linux 系统上创建文件系统。fsck(8) 命令在 Linux系统上提供文件系统完整性检查和修复功能。
在文件系统创建后,Debian 现在默认不周期性的运行 fsck;
在已经挂载的文件系统上运行 fsck ,一般是不安全的。
在 “/etc/mke2fs.conf” 里设置 “enable_periodic_fsck” 并使用 “tune2fs -c0 /dev/partition_name” 设置最大挂载数为 0,便可以在重启时,让 root 文件系统包括在内的所有文件系统上,安全的运行fsck(8) 命令.
从启动脚本里面运行的 fsck(8) 命令结果,可以在 “/var/log/fsck/” 目录下查看。
七、优化文件系统
“/etc/fstab” 中包含了基础的静态文件系统配置。例如,
UUID可以替代一般的块设备名称(例如 “/dev/sda1”、“/dev/sda2”……)来识别一个块设备。从 Linux 2.6.30 起,内核的默认行为是提供”relatime”选项。
八、超级块优化文件系统
一个文件系统的特性可以使用 tune2fs(8) 命令通过超级块来优化。
执行 “sudo tune2fs -l /dev/hda1” 可以显示 “/dev/hda1” 上的文件系统超级块内容;
执行”sudo tune2fs -c 50 /dev/hda1″ 改变 “/dev/hda1” 文件系统的检查(在启动时执行 fsck)频率为每 50 次启动;
执行 “sudo tune2fs -j /dev/hda1” 会给文件系统添加日志功能,即 “/dev/hda1” 的文件系统从 ext2 转换为 ext3;
执行 “sudo tune2fs -O extents,uninit_bg,dir_index /dev/hda1 && fsck -pf /dev/hda1” 在 “/dev/hda1” 上将它从 ext3 转换为 ext4。
尽管 tune2fs(8) 的名字是这样的,但它不仅能用于 ext2 文件系统,也能用于 ext3 和 ext4 文件系统。
九、硬盘优化
在折腾硬盘配置之前,请检查硬件并阅读 hdparm(8) 的 man 手册页,因为这可能会对数据完整性造成相当大的危害。
可以通过 “hdparm -tT /dev/hda” 来测试 “/dev/hda” 硬盘的访问速度。对于一些使用 (E)IDE 连接的硬盘,可以使用 “hdparm -q -c3 -d1 -u1 -m16 /dev/hda” 来启用 “(E)IDE 32 位支持”、启用 “using_dma flag”、设置 “interrupt-unmask flag” 并设置 “multiple 16 sector I/O”(危险!),从而加速硬盘访问速度。
可以通过 “hdparm -W /dev/sda” 来测试 “/dev/sda” 硬盘的写入缓存功能。可以使用 “hdparm -W 0 /dev/sda” 关闭写入缓存功能。
现代高速 CD-ROM 光驱,可以使用 “setcd -x 2” 降低速度,来读取不当压缩的 CDROM 光盘。
十、固态硬盘优化
固态硬盘(Solid state drive,SSD) 目前可以被自动检测。在 /etc/fstab 里面,将易失性数据路径挂载为 “tmpfs”,可以减少不必要的磁盘访问来阻止磁盘损耗。
十一、SMART预测硬盘故障
可以使用兼容 SMART 的 smartd(8) 后台守护进程(daemon)来监控和记录硬盘。
1、在 BIOS 中启用 SMART 功能。
2、安装 smartmontools 软件包。
3、通过 df(1) 列出硬盘驱动并识别它们。假设要监控的硬盘为 “/dev/hda”。
4、检查 “smartctl -a /dev/hda” 的输出,看 SMART 功能是否已启用。如果没有,通过 “smartctl -s on -a /dev/hda” 启用它。
5、通过下列方式运行 smartd(8) 后台守护进程(daemon)。
消除 /etc/default/smartmontools” 文件中 “start_smartd=yes” 的注释;
通过 “sudo systemctl restart smartmontools” 重新启动 smartd(8) 后台守护进程(daemon)。
smartd(8) 后台守护进程(daemon)可以使用 /etc/smartd.conf 文件进行自定义,文件中包含了相关的警告。
十二、$TMPDIR指定存储目录
应用程序一般在临时存储目录 “/tmp” 下建立临时文件。如果 “/tmp” 没有足够的空间,可以通过 $TMPDIR 变量来为程序指定临时存储目录。
十三、LVM扩展存储空间
在安装时创建在 Logical Volume Manager 逻辑卷管理(LVM) (Linux 特性) 上的分区,它们可以容易的通过合并扩展或删除扩展的方式改变大小,而不需要在多个存储设备上进行大量的重新配置。
十四、扩展可用存储空间
1、通过挂载另一个分区来扩展可用存储空间
如果有一个空的分区(例如 “/dev/sdx”),可以使用 mkfs.ext4(1) 将它格式化,并使用 mount(8) 将它挂载到需要更多空间的目录。(需要复制原始数据内容。)
也可以选择挂载一个空硬盘映像文件作为一个循环设备。实际的硬盘使用量会随着实际存储数据的增加而增加。
2、通过 “mount –bind” 挂载另一个目录来扩展可用存储空间
如果在另一个分区里有一个带有可用空间的空目录(例如 “/path/to/emp-dir”),可以通过带有 “–bind” 选项的 mount(8),将它挂载到一个需要更多空间的目录(例如 “work-dir”)。
3、通过 overlay 挂载(overlay-mounting)另一个目录来扩展可用存储空间
如果在另一个分区表中有可用的空间(例如,“/path/to/empty” 和 “/path/to/work”),可以在其中建立一个目录并堆栈到需要空间的那个旧的目录(例如,“/path/to/old”),要这样做,需要用于 Linux 3.18 版内核或更新版本(对应 Debian Stetch 9.0 或更新版本)的 OverlayFS。
“/path/to/empty” 和 “/path/to/work” 应该位于可读写的分区,从而能够写入 “/path/to/old”。
4、使用符号链接扩展可用存储空间
这是一个已弃用的做法。某些软件在遇到“软链接目录”时可能不会正常工作。请优先使用上文所述的“挂载”的途径。
如果在另一个分区里有一个带有可用空间的空目录(例如 “/path/to/emp-dir”),可以使用 ln(8) 建立目录的一个符号链接。
别对由系统管理的目录(例如 “/opt”)使用“链接到目录”,这样的链接在系统升级时可能会被覆盖。