进程挂载是只读的

Jef*_*eff 6 filesystems systemd redis

我有一个 rw 文件系统/myraid0

# cat /proc/mounts | grep myraid0
/dev/mapper/isw_cfdbejjgdi_myraid0p1 /myraid0 ext4 rw,relatime,stripe=8,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)

我以/myraid0任何用户的身份写信都没有问题。

redis@host:~$ echo hi > /myraid0/tmp/redis/test
redis@host:~$ cat /myraid0/tmp/redis/test
hi
Run Code Online (Sandbox Code Playgroud)

但是,/myraid0由于EROFS(只读文件系统),我的进程无法在 上写入文件。

open("temp-4036.rdb", O_WRONLY|O_CREAT|O_TRUNC, 0666) = -1 EROFS (Read-only file system)
Run Code Online (Sandbox Code Playgroud)

这表明该进程将挂载视为 ro。

# cat /proc/15920/mounts | grep myraid0
/dev/mapper/isw_cfdbejjgdi_myraid0p1 /myraid0 ext4 ro,relatime,stripe=8,data=ordered 0 0
Run Code Online (Sandbox Code Playgroud)

为什么进程只有挂载的只读视图?

谢谢!

额外细节

  • Ubuntu 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. 无法将快照保存到非 root 设备
  • 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]
Run Code Online (Sandbox Code Playgroud)

不工作的redis进程

ls -l /proc/15920/ns/mnt
lrwxrwxrwx 1 redis redis 0 Sep 15 18:03 /proc/15920/ns/mnt -> mnt:[4026532343]
Run Code Online (Sandbox Code Playgroud)

为我的用户工作的 bash shell

ls -atlrh /proc/7138/ns/mnt
lrwxrwxrwx 1 jeff jeff 0 Sep 15 18:03 /proc/7138/ns/mnt -> mnt:[4026531840]
Run Code Online (Sandbox Code Playgroud)

Ven*_*atC 11

如您所见,redis 进程运行在它自己的“挂载命名空间”中,并带有只读选项。

Redis proc started by Systemd [/proc/15920/ns/mnt] -> mnt:[4026532343]

your shell [/proc/7138/ns/mnt] -> mnt:[4026531840]
Run Code Online (Sandbox Code Playgroud)

查看 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
Run Code Online (Sandbox Code Playgroud)

所以你可以添加 /myraid0 作为附加ReadWriteDirectories并重新启动 redis 服务