额外细节

额外细节

我有一个 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.6apt-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 服务

相关内容