我有一个 rw 文件系统/myraid0
。
# cat /proc/mounts | grep myraid0
/dev/mapper/isw_cfdbejjgdi_myraid0p1 /myraid0 ext4 rw,relatime,stripe=8,data=ordered 0 0
我以任何用户的身份写入都没有问题/myraid0
。
redis@host:~$ echo hi > /myraid0/tmp/redis/test
redis@host:~$ cat /myraid0/tmp/redis/test
hi
/myraid0
但是,由于EROFS
(只读文件系统),我的进程无法在 上写入文件。
open("temp-4036.rdb", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EROFS (Read-only file system)
这表明进程将挂载视为 ro。
# cat /proc/15920/mounts | grep myraid0
/dev/mapper/isw_cfdbejjgdi_myraid0p1 /myraid0 ext4 ro,relatime,stripe=8,data=ordered 0 0
为什么进程只有挂载的只读视图?
谢谢!
额外细节
- 乌班图16.04
Linux jeff-apartment-2015 4.4.0-36-generic #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
- 应用程序是
redis-server
.无法将快照保存到非根设备 - Redis错误是
无法打开 .rdb 进行保存:只读文件系统
- 通过安装版本 3.0.6
apt-get
- 发起人
systemd
- 列表
/proc/15920/ns
(由@VenkatC请求):lrwxrwxrwx 1 redis redis 0 Sep 16 05:39 cgroup -> cgroup:[4026531835] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 ipc -> ipc:[4026531839] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 mnt -> mnt:[4026532343] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 net -> net:[4026531957] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 pid -> pid:[4026531836] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 user -> user:[4026531837] lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 uts -> uts:[4026531838]
apparmor_status | grep redis
不返回任何内容(@Gilles 请求)- 日志中没有什么比 strace 输出更能提供信息了。
进程命名空间
为 redis 用户工作 bash shell
ls -l /proc/7359/ns/mnt
lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 /proc/7359/ns/mnt -> mnt:[4026531840]
redis 进程不工作
ls -l /proc/15920/ns/mnt
lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 /proc/15920/ns/mnt -> mnt:[4026532343]
为我的用户工作 bash shell
ls -atlrh /proc/7138/ns/mnt
lrwxrwxrwx 1 jeff jeff 0 Sep 15 18:03 /proc/7138/ns/mnt -> mnt:[4026531840]
答案1
如您所见,redis 进程正在其自己的“挂载命名空间”中运行,并具有只读选项。
Redis proc started by Systemd [/proc/15920/ns/mnt] -> mnt:[4026532343]
your shell [/proc/7138/ns/mnt] -> mnt:[4026531840]
查看 systemd 单元以获取redis-server
与 mountflags 相关的启动和更新选项,以满足您的需求
查看 redis-server systemd 单元文件,我看到以下设置
# grep -i readwrite /etc/systemd/system/redis.service
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis
ReadWriteDirectories=-/etc/redis
所以你可以添加 /myraid0 作为附加ReadWriteDirectories
并重新启动 redis 服务