侧边栏壁纸
博主头像
慧棱镜 All In One 服务平台 博主等级

行动起来,活在当下

  • 累计撰写 18 篇文章
  • 累计创建 48 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

WSL上安装软件到目录/mnt/d下后报错文件权限异常

创始者
2024-10-24 / 0 评论 / 0 点赞 / 30 阅读 / 0 字
广告 广告

问题背景

作为资深开发者, 平时工作中, 我们总是有在WSL中安装各种软件,包括数据库或者服务, 这时候我们因为也有把Docker容器的部分目录映射到/mnt地下的其他大容量的盘, 但是恰恰这种需求总是给我们带来一些不必要的麻烦, 比如文件和文件夹的权限问题.

在 WSL(Windows Subsystem for Linux)中,Windows 驱动器(如 /mnt/d)的文件系统具有一些限制,特别是与 Linux 文件系统权限相关的操作。Windows 文件系统不支持 Linux 原生的权限模式,因此你遇到了 could not change permissions of directory: Operation not permitted 这样的错误。

解决方案

要解决这个问题,你可以尝试以下几种方案:

方案 1:将 PostgreSQL 安装到 WSL 内部文件系统

将 PostgreSQL 安装到 WSL 内部的 Linux 文件系统(例如 /home 或者 /usr/local),而不是 /mnt/d 这样的 Windows 挂载盘。

1. 创建新的数据目录(例如在 /var/lib/postgresql/data/home/your-user/postgres-data 下):

sudo mkdir -p /var/lib/postgresql/data
sudo chown -R postgres:postgres /var/lib/postgresql/data

2. 修改 PostgreSQL 的 postgresql.conf 文件,指定新目录为数据存储位置:

sudo nano /etc/postgresql/[version]/main/postgresql.conf

data_directory 设置为你刚创建的目录。

3. 重启 PostgreSQL:

sudo systemctl restart postgresql

方案 2:使用 bind mount 来解决权限问题

如果你必须使用 /mnt/d 目录,可以使用 bind mount 将 WSL 内的 Linux 文件系统目录映射到 /mnt/d,这样可以保留 Linux 文件系统的权限管理。

1. 在 WSL 文件系统中创建一个目录,例如 /wsl-data

sudo mkdir /wsl-data
sudo chown postgres:postgres /wsl-data

2. 使用 mount --bind 将这个目录绑定到 /mnt/d

sudo mount --bind /wsl-data /mnt/d/postgres-data

3. 现在你可以使用 /mnt/d/postgres-data 作为 PostgreSQL 的数据目录,但权限依然会由 /wsl-data 控制。

方案 3:调整挂载选项

如果你需要在 /mnt/d 下保留 PostgreSQL 数据,也可以通过调整 WSL 的挂载选项来改善权限问题。编辑 WSL 的配置文件 /etc/wsl.conf,并增加以下内容:

[automount]
enabled = true
options = "metadata"

然后重新启动 WSL 实例:

wsl --shutdown

此选项将启用对 NTFS 文件系统的文件权限管理,但这仍然有一定的局限性,可能不能完全解决所有权限相关的问题。

总结

推荐的解决方案是将 PostgreSQL 安装到 WSL 内部的 Linux 文件系统,而避免直接使用 Windows 驱动器上的目录。这将避免文件权限问题,并确保数据库系统的正常运行。如果必须使用 Windows 挂载盘,可以尝试 bind mount 或调整 WSL 的挂载选项。

本人更加倾向于用第三种方案解决此类问题, 因为我们的需求本身就是要把目录映射到一个大容量的非系统盘, 显然第一种方案远远不能满足我们的需求, 除此之外, 我们也不可能每次都用`mount --bind`之类的命令来重复操作, 所以直接调整挂在选项是对我们最友好的, 更何况我本人已经实验验证过了, 第三种方案是完全可行的.

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
广告 广告

评论区