Read-Only Filesystem的解决办法
我知道,我不放图你们是不会进来的!
起因
前几天突发奇想,想学一学k8s,顺手在服务器上安装了k3s这个轻量版,然而由于某些原因导致服务器出现了read-only file system。下面记录一下解决过程。以下环境均在root
帐户下执行。
查找问题所在
其实我没有查出结果,但是还是要记一下。
我本身对linux的使用仅限于一些非常简单的命令上,于是边查边用,做了以下几个步骤。
-
docker logs ***
查看了容器的logs, 发现在5月27号就已经出现了文件系统只读的状况。
-
journalctl
想看看systemd的情况来着,发现全是瞎几把扫我服务器账密的sshd日志,无果
-
cat /etc/fstab
这里看了一下自动挂在配置文件,文件里有一条
UUID=9226105e-54f3-4386-b8a7-82b3e0584877 / ext4 noatime,errors=remount-ro 0 1
noatime,errors=remount-ro
这个玩意啥意思呢,如果文件系统出现了错误,下次启动或挂载时会使用只读模式挂载,我在好奇改成errors=continue
会不会可以直接解决问题,但是问题是我现在没法写入文件,这个操作不太行。
处理问题
在网上搜到好多这方面的问题,中文帖子大多集中在CSDN,大部分都给出以下两种操作方法。(我最后使用fsck修复磁盘成功恢复正常)
- 直接重新挂载
mount -o remount,rw /
在网上查到的
mount
命令的参数含义,-o
是异步操作,remount,rw
重新挂载为读写模式,/
是我们要挂载的出问题的地方。我尝试了一下,但是出现了以下错误。mount: cannot remount /dev/sda2 read-write, is write-protected
没法直接挂载,这个方法走不通。
-
fsck
修复磁盘前面重新挂载没法进行下去了,但提示得很明显,
/dev/sda2
设备处于写保护状态,为什么会写保护呢,因为文件系统上出现了错误,不允许再往里面写东西了。这时候fsck
修复磁盘就很有必要了。- 首先卸载设备防止出现问题,
unmount /dev/sda2
,按下回车之前我还在担心系统都在这个盘上,卸载之后会不会连shell都无法操作,不过linux很强大,没有出现我臆想的情况哈哈哈。 - 使用
fsck
修复磁盘,fsck -y /dev/sda2
,不加-y
参数的话需要和fsck
进行交互,确认修复块,因为服务器要修复好多损坏的块,为了省功夫,我直接加了-y
参数,默认确认操作。 - 重新挂载或重启,
mount /dev/sda2
或者reboot
,我不太清楚这个mount
怎么挂,挂到哪儿,我直接使用了reboot
,如果你们清楚怎么挂载的话请告诉我。reboot
的时候很担心啊,生怕重启失败了,我服务器上的数据全丢了,毕竟好久没有备份了。庆幸的是,服务器正常重启并且成功修复了错误!
- 首先卸载设备防止出现问题,
后续
由于乱装k3s导致出现的错误,我使用官方给的卸载工具卸载掉了k3s,但安装的dashboard
容器还没有删掉,后续又进行了docker的清理工作。
对于悬空镜像和未使用镜像可以使用手动进行个别删除:
- 删除所有悬空镜像,不删除未使用镜像:
docker rmi $(docker images -f "dangling=true" -q)
- 删除所有未使用镜像和悬空镜像
docker rmi $(docker images -q)
- 清理卷
如果卷占用空间过高,可以清除一些不使用的卷,包括一些未被任何容器调用的卷(-v 详细信息中若显示 LINKS = 0,则是未被调用):
删除所有未被容器引用的卷:
docker volume rm $(docker volume ls -qf dangling=true)
- 容器清理
如果发现是容器占用过高的空间,可以手动删除一些:
删除所有已退出的容器:
docker rm -v $(docker ps -aq -f status=exited)
删除所有状态为dead的容器
docker rm -v $(docker ps -aq -f status=dead)
反思了一下,像k8s、k3s、宝塔之类的管理运维工具,还是要在一个干净的系统上安装,否则容易出现各种奇怪的问题,如果想玩玩k8s,完全可以直接使用官方的交互服务来进行学习,等到一定基础之后再来给系统安装这些工具。
另外!!!一定要定期备份数据!!!!
本文系作者 @root 原创发布在 CycleGen。未经许可,禁止转载。