服务器大容量磁盘结构需要清理一系列问题解决。
前言
最近服务器出现结构需要清理(structure needs cleaning)的问题,网络上给出的均为fsck -y /dev/磁盘
即可。但是实际上遇到的问题不止这些,由于我的磁盘有一点点大,总是会爆内存,这里我整落了这几天我遇到的问题和解决方式,相对于你们去参考2012年甚至更久的帖子或者千篇一律的复制粘贴会给你们带来更多的帮助。
问题
首先我们需要找到自己出问题的磁盘,一般都是额外挂载上的磁盘出现问题,使用df -h
找到自己对应的磁盘。
(base) root@server-1:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 126G 0 126G 0% /dev
tmpfs 26G 4.8M 26G 1% /run
/dev/sda2 938G 879G 12G 99% /
tmpfs 126G 137M 126G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 126G 0 126G 0% /sys/fs/cgroup
/dev/sda1 511M 5.3M 506M 2% /boot/efi
/dev/sdc 3.7T 1.3T 2.3T 35% /home/data1
/dev/sdb 3.7T 3.4T 136G 97% /home/data
/dev/sdh 15T 132G 14T 1% /home/data6
/dev/sdg 15T 701G 14T 5% /home/data5
/dev/sdd 15T 1.9T 12T 14% /home/data2
/dev/sdf 15T 154G 14T 2% /home/data4
/dev/sde 15T 1.5T 13T 11% /home/data3
/dev/sdi 15T 578G 14T 5% /home/data7
这里一般都是/dev
开头的磁盘,之后使用umount /dev/磁盘
卸载。
磁盘被占用
umount: /xxx: device is busy.
显而易见需要我们结束掉占用磁盘的进程。
使用fuser
命令查看, 通过 -mv
和 -kv
进行查看和结束进程。 你也可以使用lsof
命令查看进程并使用kill
结束。
-k,--kill kill processes accessing the named file
-m,--mount show all processes using the named filesystems or block device
-v,--verbose verbose output
(base) root@server:~$ fuser -mv /dev/sde
USER PID ACCESS COMMAND
/dev/sde: root kernel mount /home/data3
(base) root@server:~$ fuser -kv /dev/sde
内存
Error storing directory block information (inode=2087157, block=0, num=190005956): Memory allocation failed
e2fsck: aborted
这里我贴出一个ubuntu社区帖子,没什么用。不要去分配额外的sawp 不要设置乱七八糟的东西,作为2022年的人类大概率检查是fsck版本问题!
主要先查看自己的fsck的版本,服务器版本为ubuntu16.04 ,通过fsck --version
查看到的版本是1.42,这是个非常老的版本,很多问题都是因为老版本的bug导致内存溢出,这里我们需要安装新版本的fsck。官方也给出了安装方式:这里
# for ubuntu
sudo add-apt-repository ppa:daniel-mehrmann/admin
sudo apt-get update
sudo apt-get upgrade
#######
# for debain
git clone git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
cd e2fsprogs
./debian/rules
dpkg-buildpackage -b -uc -rfakeroot
但是当你执行的时候你就会发现没办法使用,由于系统很老加上是社区版本,会提示:
"Enable UA Infra" notification
如果你是企业版可以直接sudo ua status
查看,然后使用ua disable
相关命令解决。
但是我是社区版本没有这些,直接下载官方的源码自己make一下。Ext2fs Home Page (sourceforge.net),这里我选择下载最新版本1.46 。下载
wget https://mirrors.edge.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.46.5/e2fsprogs-1.46.5.tar.gz
tar -zxf e2fsprogs-1.46.5.tar.gz
cd e2fsprogs-1.46.5但是
编译这里会出现两种情况一种是你正常编译成果
mkdir build
cd build
../configure
make
make install
但是如果出现这些错误·
'lib/blkid/blkid_types.h' is up to date.
等等问题,基本是因为一些库文件版本不对,这里使用他自带的就行
../configure --enable-libblkid # somelibs out of date
make
make install
当你看到这些基本就是安装成功了
make[2]: Leaving directory '/home/root/fsck/e2fsprogs-1.46.5/build/lib/blkid'
making install in lib/support
make[2]: Entering directory '/home/root/fsck/e2fsprogs-1.46.5/build/lib/support'
SUBST ../../lib/dirpaths.h
make[2]: Leaving directory '/home/root/fsck/e2fsprogs-1.46.5/build/lib/support'
making install in lib/ext2fs
make[2]: Entering directory '/home/root/fsck/e2fsprogs-1.46.5/build/lib/ext2fs'
SUBST ../../lib/dirpaths.h
SUBST ext2_err.et
MKDIR_P /usr/lib /usr/include/ext2fs
INSTALL_DATA /usr/lib/libext2fs.a
INSTALL_DATA /usr/include/ext2fs/bitops.h
INSTALL_DATA /usr/include/ext2fs/ext2fs.h
INSTALL_DATA /usr/include/ext2fs/ext2_io.h
INSTALL_DATA /usr/include/ext2fs/ext2_fs.h
INSTALL_DATA /usr/include/ext2fs/ext2_ext_attr.h
INSTALL_DATA /usr/include/ext2fs/ext3_extents.h
INSTALL_DATA /usr/include/ext2fs/tdb.h
INSTALL_DATA /usr/include/ext2fs/qcow2.h
INSTALL_DATA /usr/include/ext2fs/hashmap.h
INSTALL_DATA /usr/include/ext2fs/ext2_err.h
INSTALL_DATA /usr/include/ext2fs/ext2_types.h
INSTALL_DATA /usr/lib/pkgconfig/ext2fs.pc
make[2]: Leaving directory '/home/root/fsck/e2fsprogs-1.46.5/build/lib/ext2fs'
make[1]: Leaving directory '/home/root/fsck/e2fsprogs-1.46.5/build'
这时候检查版本
$ fsck --version
fsck 1.46.5 (30-Dec-2021)
重新运行fsck检查
fsck -fCy /dev/磁盘
等待一会即可,基本不会出现内存爆炸的问题了。基本内存占用再8g-16g左右,属于常规水平。
之后重启电脑重新挂载即可。
检查坏道
一般看到这里基本是文件系统的问题,偶尔断电导致文件系统出点问题,但是也不排除是硬盘问题,最好查一下坏道。
badblocks -b 5120 -s -v -o ./bb-磁盘.log /dev/磁盘