Linux 硬盘诊断工具

块设备属性查看

首先,我们所说的设备文件是一种特殊类型的文件,用于表示系统中的设备,使应用程序可以通过标准的文件I/O接口与这些设备交互。设备文件通常位于/dev目录下。

设备文件可以分为两类:

  • 块设备文件:可以在任何位置随机访问,并且数据通常按照固定大小的块(blocks)进行进行读写。例如硬盘、驱动器;

  • 字符设备文件:按字符流顺序读写的设备,例如键盘、鼠标

块设备和字符设备的区别:

  • 块设备允许随机访问数据块,可以跳转到设备上的任何位置进行读/写操作,而不必顺序地从头到尾进行。例如硬盘

  • 字符设备通常不支持随机访问。数据是顺序地读取或写入的,就像从水龙头流出的水流或从键盘输入的字符一样。例如键盘、鼠标和串口。


lsblk 查看块设备

通过lsblk,可以列出系统中所有的块设备,简单理解 lsblk 就是看系统上有多少硬盘和分区信息。

例如:

lsblk

如果还要查看块设备文件的挂载点或对应文件系统的类型, 可以通过 -f 参数来实现。

lsblk -f

blkid 查看单个设备属性

使用blkid命令就可以查看块设备的UUID、文件系统类型还有一些其它的属性信息。

运行这个命令不加任何参数,就会列出所有已知的块设备及其相关信息。

blkid

指定了设备的文件名称,就会只显示指定设备的属性信息

blkid /dev/sda2

权限限制:某些块设备的元数据可能受到权限限制,这意味着普通用户可能无法访问它们,所以需要使用root用户的权限才可以确保 blkid 可以读取它需要的所有数据

sudo blkid

例如:我不使用root用户的权限,默认某些硬盘或者分区就没权限访问,这个时候blkid就不会有任何的输出


df 查看文件系统信息

df是disk free的缩写。可以查看文件系统的总空间、已用空间、剩余空间等信息。

直接使用df,不带任何参数,默认是以1K块为单位进行显示,即以KB(千字节)为单位的大小进行显示。

如果想要以其他单位(如MB或GB)来显示磁盘空间,可以使用 -h 参数来实现。

除了需要关注文件系统存储空间的使用情况外,还需要关注inode索引数量是否用完,这个时候可以通过 -i 参数来查看文件系统中inode索引的使用情况。

在Linux或Unix系统中,每个文件和目录都需要一个inode来存储其元数据(如权限、所有者、时间戳、文件大小等),每个inode通过一个唯一标识符inode编号标识。如果inode索引号用完了就会导致在文件系统上创建新的文件或目录时,操作失败。

df -i

如果像使用df命令查看文件系统类型的话,通过 -T(大写) 参数就可以实现。

df -T

du 查看文件占用空间

要查看某个文件或者目录使用了多少硬盘空间,可以通过du命令来实现。du是disk usage的缩写。


使用du统计某个目录大小时,如果不加任何参数,du 命令的默认行为是递归地显示指定目录及其所有子目录的大小。但如果目录中只有文件,而没有子目录,那么 du 只会显示该目录的总大小。


默认是以KB为单位进行显示的,如果需要以易读的格式显示大小,使用 -h 参数即可。


再查看目录文件占用硬盘空间大小的时候,如果指向看目录的总大小,不想递归地显示指定目录及其所有子目录的大小。通过 -s 参数即可实现。


du命令还可以通过 max-depth 参数来查看到到特定的目录深度的大小。使用这个参数的时候,就不能使用 -s 参数了,不然会产生冲突。

例如:通过work目录下,每个子目录的大小

du -sh  --max-depth=1  work/

使用du命令统计某个目录大小的时候,如果想要跳过某些文件不统计,可以通过 --exclude 参数来指定不统计的目录。--exclude=相对路径是相对于要统计的目录所在的位置

例如;统计 /home/user 的大小,但想排除 /home/user/Downloads:

du -sh --exclude=Downloads /home/user

如果指向统计当前文件系统的大小,跳过其他文件系统,可以使用 -x 或 --one-file-system 选项。这个选项会让 du 仅在开始扫描的文件系统中统计大小,不包括挂载到其下的其他文件系统。

du -shx /

df和du大小情况比较

  • df > du的情况:当把文件删除了,但是空间并没有被释放(有进程再使用这个文件,删除了这个文件不会马上释放空间)时候,使用df看到的数据比du统计的大。即:df>du

  • df < du的情况:当某个目录文件挂载到其他设备了的时候(多个设备空间的组合),这就是所说的文件系统重叠时候。即df < du


fsck 实现硬盘修复

fsck 是一个通用的前端工具,会根据分区的文件系统类型,fsck 会自动决定调用哪个后端工具(如 e2fsck、fsck.ext4、fsck.vfat 等)。如果 fsck 不支持或不能自动处理某个文件系统类型,它通常会给出提示,告诉用户应该使用哪个专门的工具。

  • 如果是ext系列文件系统,fsck后端会调用 e2fsck 工具来对文件进行修复

  • 如果是xfs文件系统,xfs不会自动调用 xfs_repair进行处理,而是显示一个消息,建议使用 xfs_repair 来处理 xfs 文件系统

  • 如果是vfat文件系统,fsck会自动调用fsck.fat进行修复

fack使用说明:
使用fsck对文件系统进行修复前,需要先将文件系统卸载,或确保它是只读模式。不然检查已经挂载好的文件系统可能会导致数据丢失或其他不可预测的结果

自动修复模式:通过 -y 参数会对所有问题自动回答"Yes"

fsck -y /dev/xxx

如果只是想检查文件系统而不执行任何修复操作,就需要使用fsck 的 -n 参数了,会报告任何发现的问题,但不会尝试修复它们。

说明:如果只是检查的话,可以不用卸载或者确保文件系统是只读模式的。

fsck -n /dev/xxx

e2fsck还有xfs_repair使用和fsck一样的,也是 -y 参数自动修复,-n 参数只检查不修复。

例如:

硬盘因为异常断电而损坏,这个时候无法进入系统,会默认进入initramfs模式。Linux系统启动时,会先加载内核,然后挂载根文件系统,如果在加载根文件系统之前就遇到了问题,那么系统将进入emergency模式或者initramfs模式,以便用户对问题进行修复。

1、查看挂载根目录硬盘的属性信息
在这个模式下,lsblk不能使用,可以使用blkid来查看硬盘的文件名称。

blkid

2、查找到硬盘名称后,可以使用 fsck -y /dev/xxx 进行修复

fsck -y /dev/xxx

3、如果修复后提示:“could this be a zero-length partition?”,说明uperblock损坏,需要修复superblock;可以通过dump2fs或mke2fs工具找到superblock的备份

# dump2fs是一个用于打印ext2、ext3、ext4文件系统的详细信息的工具
dump2fs /dev/sda1 | grep -i 'superblock backup'

# mke2fs主要是用于创建新的ext2、ext3或ext4文件系统,但你可以使用其-n选项来查看哪些超级块会被创建为备份
mke2fs -n /dev/sda1

# 可以使用xfs_info命令来查看xfs文件系统的详细信息:
xfs_info /dev/sda1 或 xfs_info /mount/point

**4、利用备份的superblock信息修复文件系统的superblock。备份的blocks很多,一个不行就试另外一个。

例如是ext4文件系统,就可以使用e2fsck的 -b 参数来指定superblock的备份位置,进行修复**

e2fsck -y /dev/sda1 -b 32768

# 使用指定的备份超级块8193来尝试自动修复/dev/sda1上的任何问题
fsck.ext4 -b 8193 /dev/sda1

5、等待修复完成后,修复过程可能有点久,然后输入reboot -f命令进行重启。

reboot -f

xfs和ext系列文件系统修复说明:

  • ext系列文件系统:可能会出现超级块损坏的问题。此时需要使用dump2fs或者mke2fs -n 来查看超级块的备份位置,然后通过fsck或特定的版本如e2fsck、fsck.ext4等,使用-b参数指定备份超级块的位置进行修复。

  • xfs没有单独的超级块的概念;相反,文件系统的元数据和结构信息都分布在整个文件系统中。所以不会出现超级块损坏的情况,出现问题了直接使用xfs_repair工具进行修复就行了。

posted on 2022-07-02 21:49  背对背依靠  阅读(248)  评论(0编辑  收藏  举报