Linux 系统 “Read-only file system” ” 错误 与 解决方法

本文介绍了一起Web服务器磁盘分区变为只读的故障案例,详细阐述了故障现象、排查思路及解决步骤,包括定位问题、手动创建目录测试、卸载磁盘分区、使用fsck命令修复文件系统等。

这个问题经常发生在有大量磁盘读写操作且磁盘分区很大的环境中,下面简单描述下此案例的应用环境:这是一个 Web 服务器故障案例,客户利用两台服务器加一个磁盘阵列做了一个双机热备的 Web 系统,所有网站数据都存储在磁盘阵列中,两台服务器共享一个磁盘阵列分区,在正常情况下主机挂载磁盘阵列分区提供网站服务,主机故障时备机接管磁盘阵列分区继续提供网站服务。

1 . 案例现象

接到客户电话说他们的网站无法添加数据了,不过网站还可以正常访问,服务器和磁盘阵列也没有任何告警信息。

2 . 解决思路

根据这个简单信息,基本排查思路如下:

  网站程序可能出现问题了

  服务器磁盘故障

3 . 排查问题

首先通知研发人员对网站程序问题进行排查。经过检查,并没有发现程序有问题,而在程序日志中发现了一条信息:

java.lang.RuntimeException: Cannot make directory: file:/www/data/html/2013-03-30

根据这个输出可知,程序不能创建目录,那么尝试手动创建一个目录试试,登录 Web服务器,在/www/data/html 目录下创建一个目录 test,操作如下:

[root@localhost html]# mkdir test

mkdir: cannot create directory `test': Read-only file system

从这个输出信息可知,/www/data/html 目录所在的磁盘分区出现了问题,通过检查发现,/www/data/html 目录正是挂载的磁盘阵列分区,于是问题原因找到了。

4 . 解决问题

磁盘出现“Read-only file system”的原因有很多种,可能是文件系统数据块出现不一致导致的,也有可能是磁盘故障造成的。主流的 ext3、ext4 文件系统都有很强的自我修复机制,对于简单的错误,文件系统一般可自行修复,当遇到致命错误无法修复时,文件系统为了保证数据一致性和安全,会暂时屏蔽文件系统的写操作,将文件系统变为只读,进而出现了上面的“Read-only file system”现象。

手工修复文件系统错误的命令是 fsck,在修复文件系统前,最好卸载文件系统所在的磁

盘分区:

[root@localhost ~]# umount /www/data

umount: /www/data: device is busy

提示无法卸载,可能这个磁盘中还有文件对应的进程在运行,检查如下:

[root@localhost ~]# fuser -m /dev/sdb1

/dev/sdb1: 8800

接着检查一下 8800 这个端口对应是什么进程,如图所示,查询 8800 端口对应的进程信息:

 

原来是系统的 apache 进程还没有停止,停止 apache,成功卸载磁盘,操作如下:

[root@localhost ~]#/usr/local/apache2/bin/apachectl stop

[root@localhost ~]# umount /www/data

最后,执行修复操作,如图所示。用 fsck 命令修复磁盘分区。

 

修复过程比较简单,上面省略了很多输出信息。修复的时间根据磁盘大小和文件系统损

坏程度而定。如果有些数据无法修复,会提示是否删除,此时可根据情况选择。修复完成后,

被删除的文件会保留在对应磁盘分区挂载点的 lost+found 目录中。

修复完成后,执行挂载操作:

[root@localhost ~]# mount /dev/sdb1 /www/data

最后,在/www/data 目录下验证是否可以成功创建文件,至此,问题圆满解决。

 

### 解决 Linux 系统中因只读文件系统导致的权限更改问题 在 Linux 系统中,当遇到“Read-only file system错误时,通常是因为目标文件系统被挂载为只读模式。以下是一些可能的原因和解决方案[^1]。 #### 1. 检查文件系统挂载状态 使用 `mount` 命令检查当前文件系统的挂载状态。如果发现目标文件系统以只读模式挂载,则需要重新挂载为可写模式。 ```bash mount | grep " /path/to/target " ``` 如果输出包含“ro”(代表只读),则需要重新挂载为可写模式。 #### 2. 重新挂载为可写模式 通过以下命令将文件系统重新挂载为可写模式: ```bash sudo mount -o remount,rw /path/to/target ``` 此操作会将指定路径下的文件系统从只读模式切换为可写模式[^1]。 #### 3. 检查磁盘健康状况 如果文件系统意外变为只读模式,可能是由于底层硬件故障或文件系统损坏。运行以下命令检查磁盘健康状况: ```bash sudo fsck /dev/sdX ``` 其中 `/dev/sdX` 是目标分区的设备名称。修复完成后,重新挂载文件系统。 #### 4. 修改文件权限 一旦文件系统成功挂载为可写模式,可以使用 `chmod` 命令修改文件权限: ```bash chmod +x setup.sh ``` 如果仍然无法修改权限,可以尝试使用 `chattr` 命令解锁文件属性: ```bash sudo chattr -i setup.sh chmod +x setup.sh ``` #### 5. 使用临时目录安装 如果目标文件系统无法更改为可写模式,可以将安装文件复制到其他可写目录(如 `/tmp` 或 `/home`)进行操作: ```bash cp setup.sh /tmp/ cd /tmp/ chmod +x setup.sh ./setup.sh ``` #### 6. 检查 SELinux 配置 SELinux 可能限制了文件的访问权限。可以临时禁用 SELinux 进行测试: ```bash sudo setenforce 0 ``` 禁用后再次尝试修改文件权限。如果问题解决,说明 SELinux 是导致问题的原因。 --- ### 示例代码:检查文件系统挂载状态并重新挂载 以下是一个简单的脚本,用于检查文件系统是否为只读模式,并尝试重新挂载为可写模式: ```bash #!/bin/bash TARGET_PATH="/path/to/target" # 检查挂载状态 if mount | grep "$TARGET_PATH" | grep -q "ro"; then echo "File system is mounted as read-only. Attempting to remount as read-write..." sudo mount -o remount,rw $TARGET_PATH if [ $? -eq 0 ]; then echo "File system successfully remounted as read-write." else echo "Failed to remount file system. Please check disk health or permissions." fi else echo "File system is already mounted as read-write." fi ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海天哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值