WSL环境运行Rails的rails db:migrate出现SQLite只读错误如何解决
WSL下Rails执行db:migrate报SQLite只读错误解决方案
核心原因
你遇到的SQLite3::ReadOnlyException报错核心诱因有两个:
- 你将Rails项目存放在了Windows系统核心目录
/mnt/c/Windows/system32下,该目录默认有严格的读写权限限制 - WSL默认挂载Windows NTFS分区时没有启用Linux权限元数据,导致文件权限逻辑和Linux系统不兼容,单独修改单个log文件的只读属性无法解决全局的权限限制
解决方案(按推荐优先级排序)
方案1:将Rails项目迁移到WSL原生文件系统(最推荐)
该方案不仅能彻底解决权限问题,还能大幅提升Rails在WSL下的运行速度,跨NTFS挂载分区运行Rails会有明显的性能损耗。
操作步骤:
- 在WSL用户目录下新建专属的项目存放路径:
mkdir -p ~/projects/ - 将整个项目文件夹从Windows系统目录移动到WSL原生路径:
mv /mnt/c/Windows/system32/railsfriends ~/projects/ - 进入项目根目录:
cd ~/projects/railsfriends/friends - 重新执行迁移命令即可:
rails db:migrate
方案2:修改WSL挂载NTFS分区的权限配置(适合必须把项目放在Windows分区的场景)
如果确实需要保留项目在Windows分区,可修改WSL的自动挂载配置,兼容Linux权限逻辑:
- 执行命令编辑WSL配置文件:
sudo nano /etc/wsl.conf - 在文件中写入以下配置:
[automount] enabled = true options = "metadata,umask=22,fmask=11" mountFsTab = false - 保存退出后,在Windows端CMD执行命令重启WSL:
wsl --shutdown - 重新打开WSL进入项目目录,递归设置项目文件夹权限:
sudo chmod -R 755 /mnt/c/Windows/system32/railsfriends/friends - 再次执行
rails db:migrate即可
注意:不建议长期把开发项目放在system32目录下,建议移动到普通Windows用户目录如/mnt/c/Users/你的用户名/Projects/下,避免系统权限限制
方案3:临时修改数据库文件权限(仅适合临时验证用)
如果只是临时测试验证问题,可单独给SQLite数据库文件设置可写权限:
- 进入项目的db目录:
cd /mnt/c/Windows/system32/railsfriends/friends/db - 给数据库文件设置全局可写权限:
sudo chmod 666 development.sqlite3 - 回到项目根目录重新执行迁移命令即可
内容的提问来源于stack exchange,提问作者Niki
相关产品推荐
相关产品推荐

