gem 更新显示 WSL2 上的权限错误
我想按照 doc 在 WSL2 上安装 jekyll。但出现错误。
gem update
Updating installed gems
Updating fiddle
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0
directory.
在 --backtrace
之后,
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0 directory.
/usr/lib/ruby/2.5.0/rubygems/installer.rb:706:in `verify_gem_home'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:854:in `pre_install_checks'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:281:in `install'
/usr/lib/ruby/2.5.0/rubygems/resolver/specification.rb:97:in `install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:168:in `block in install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `each'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `install'
/usr/lib/ruby/2.5.0/rubygems/dependency_installer.rb:409:in `install'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:213:in `update_gem'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:225:in `block in update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `each'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:100:in `execute'
/usr/lib/ruby/2.5.0/rubygems/command.rb:313:in `invoke_with_build_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:173:in `process_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:143:in `run'
/usr/lib/ruby/2.5.0/rubygems/gem_runner.rb:59:in `run'
/usr/bin/gem:21:in `<main>'
我阅读了 stackoverflow 相关的问题,但它们不起作用。
系统信息:
ruby -v
ruby 2.5.8p224(2020-03-31 修订版 67882)[x86_64-linux- gnu]gem -v
2.7.6.2- 发行版 - Ubuntu 20.04.4 LTS
- Winver - 版本 21H2(操作系统内部版本 22000.556)
编辑:gem 环境的输出
/usr/lib/ruby/2.5.0/rubygems/commands/environment_command.rb:154: warning: Insecure world writable dir /mnt/c in PATH, mode 040777
RubyGems Environment:
- RUBYGEMS VERSION: 2.7.6.2
- RUBY VERSION: 2.5.8 (2020-03-31 patchlevel 224) [x86_64-linux-gnu]
- INSTALLATION DIRECTORY: /var/lib/gems/2.5.0
- USER INSTALLATION DIRECTORY: /home/raghav/.gem/ruby/2.5.0
- RUBY EXECUTABLE: /usr/bin/ruby2.5
- EXECUTABLE DIRECTORY: /usr/local/bin
- SPEC CACHE DIRECTORY: /home/raghav/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /var/lib/gems/2.5.0
- /home/raghav/.gem/ruby/2.5.0
- /usr/lib/ruby/gems/2.5.0
- /usr/share/rubygems-integration/2.5.0
- /usr/share/rubygems-integration/all
- /usr/lib/x86_64-linux-gnu/rubygems-integration/2.5.0
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- https://rubygems.org/
- SHELL PATH:
- /home/raghav/.local/bin
- /home/raghav/bin
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
- /usr/games
- /usr/local/games
- /usr/lib/wsl/lib
- /mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath
- /mnt/c/WINDOWS/system32
- /mnt/c/WINDOWS
- /mnt/c/WINDOWS/System32/Wbem
- /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
- /mnt/c/WINDOWS/System32/OpenSSH/
- /mnt/c/Users/Raghav/Downloads/cmake-3.20.3-windows-x86_64/cmake-3.20.3-windows-x86_64/bin
- /mnt/c/Program Files/dotnet/
- /mnt/c/Program Files/Microsoft SQL Server/130/Tools/Binn/
- /mnt/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/170/Tools/Binn/
- /mnt/c/msys64/mingw64/bin"
- /mnt/c/Users/Raghav/.dotnet/tools
- /mnt/c/Users/Raghav/AppData/Local/Microsoft/WindowsApps
- /mnt/c/Program Files/Java/jre1.8.0_321/bin
- /mnt/c/Users/Raghav/AppData/Local/Programs/MiKTeX/miktex/bin/x64/
- /snap/bin
用户名:raghav
root 是文件的所有者。
I want to install jekyll on WSL2 as per doc. But get errors.
gem update
Updating installed gems
Updating fiddle
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0
directory.
After --backtrace
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /var/lib/gems/2.5.0 directory.
/usr/lib/ruby/2.5.0/rubygems/installer.rb:706:in `verify_gem_home'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:854:in `pre_install_checks'
/usr/lib/ruby/2.5.0/rubygems/installer.rb:281:in `install'
/usr/lib/ruby/2.5.0/rubygems/resolver/specification.rb:97:in `install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:168:in `block in install'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `each'
/usr/lib/ruby/2.5.0/rubygems/request_set.rb:156:in `install'
/usr/lib/ruby/2.5.0/rubygems/dependency_installer.rb:409:in `install'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:213:in `update_gem'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:225:in `block in update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `each'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:224:in `update_gems'
/usr/lib/ruby/2.5.0/rubygems/commands/update_command.rb:100:in `execute'
/usr/lib/ruby/2.5.0/rubygems/command.rb:313:in `invoke_with_build_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:173:in `process_args'
/usr/lib/ruby/2.5.0/rubygems/command_manager.rb:143:in `run'
/usr/lib/ruby/2.5.0/rubygems/gem_runner.rb:59:in `run'
/usr/bin/gem:21:in `<main>'
I have read stackoverflow related que but they did not work.
System info:
ruby -v
ruby 2.5.8p224 (2020-03-31 revision 67882) [x86_64-linux-
gnu]gem -v
2.7.6.2- Distro - Ubuntu 20.04.4 LTS
- Winver - Version 21H2 (OS build 22000.556)
EDIT:
output ofgem environment
/usr/lib/ruby/2.5.0/rubygems/commands/environment_command.rb:154: warning: Insecure world writable dir /mnt/c in PATH, mode 040777
RubyGems Environment:
- RUBYGEMS VERSION: 2.7.6.2
- RUBY VERSION: 2.5.8 (2020-03-31 patchlevel 224) [x86_64-linux-gnu]
- INSTALLATION DIRECTORY: /var/lib/gems/2.5.0
- USER INSTALLATION DIRECTORY: /home/raghav/.gem/ruby/2.5.0
- RUBY EXECUTABLE: /usr/bin/ruby2.5
- EXECUTABLE DIRECTORY: /usr/local/bin
- SPEC CACHE DIRECTORY: /home/raghav/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /etc
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /var/lib/gems/2.5.0
- /home/raghav/.gem/ruby/2.5.0
- /usr/lib/ruby/gems/2.5.0
- /usr/share/rubygems-integration/2.5.0
- /usr/share/rubygems-integration/all
- /usr/lib/x86_64-linux-gnu/rubygems-integration/2.5.0
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- https://rubygems.org/
- SHELL PATH:
- /home/raghav/.local/bin
- /home/raghav/bin
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
- /usr/games
- /usr/local/games
- /usr/lib/wsl/lib
- /mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath
- /mnt/c/WINDOWS/system32
- /mnt/c/WINDOWS
- /mnt/c/WINDOWS/System32/Wbem
- /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
- /mnt/c/WINDOWS/System32/OpenSSH/
- /mnt/c/Users/Raghav/Downloads/cmake-3.20.3-windows-x86_64/cmake-3.20.3-windows-x86_64/bin
- /mnt/c/Program Files/dotnet/
- /mnt/c/Program Files/Microsoft SQL Server/130/Tools/Binn/
- /mnt/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/170/Tools/Binn/
- /mnt/c/msys64/mingw64/bin"
- /mnt/c/Users/Raghav/.dotnet/tools
- /mnt/c/Users/Raghav/AppData/Local/Microsoft/WindowsApps
- /mnt/c/Program Files/Java/jre1.8.0_321/bin
- /mnt/c/Users/Raghav/AppData/Local/Programs/MiKTeX/miktex/bin/x64/
- /snap/bin
username : raghav
root is the owner of files.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您尝试运行的程序尝试使用非特权帐户执行特权操作。即使您以非特权用户身份运行该目录,
gem
也会尝试写入 root 拥有的目录。还有另一个问题,即bundler
将使用gem
,因此会给您带来同样的问题,但这次您不能使用--user-install不再标记了。为了在不影响底层操作系统的情况下克服默认行为,您可以强制 gem 使用用户帐户,并强制捆绑器使用本地目录。
TL;DR:
您需要做的是使用
gem install --user-install
而不是gem install
。这会将 gems 安装到~/.local/share/gem/
;以及每个项目的
bundle config set --local path 'vendor/bundle'
或类似命令。或者,您可以使用bundle config set --global path ~/.local/share/gem/
,它将使用与gem install --user-install
相同的文件夹使用(在 Ubuntu 22.04 上)。首先,该教程的当前说明建议打开 power shell 并运行 bash。那已经过时了。如果您使用 Windows 应用商店中的 Ubuntu 应用程序,当您运行该应用程序时,您将在 Ubuntu 虚拟机内获得一个 shell,这就是您应该使用的。从那里您可以按照ubuntu 说明进行操作。
这是在此环境中有效的一步一步,它只会在不可避免的情况下使用
sudo
一次:这样您就可以像往常一样在 Ubuntu 中使用 Jekyll 了。如果你想从捆绑器中使用它,那么你必须再次安装 webrick gem,因为 jekyll 会覆盖 Gemfile。另外,默认情况下,捆绑程序会尝试在系统范围内安装,因此您必须将其配置为使用本地目录。
警告:仅在您的博客目录或未来博客的新空目录中运行这些命令。
使用
bundle exec jekyllserve
进行测试如果您可以使用用户范围的 gem 文件夹,并且知道更新 jekyll 会更新它所依赖的 gems 版本,从而影响您的其他 ruby 项目,那么您可以使用用户范围的方法:
当然,您也可以始终使用系统范围的方法,这是最不推荐的,因为它会破坏您的 ruby 安装:
The program you're trying to run attempts to perform privileged operations with an unprivileged account.
gem
will try to write to root owned directories even though you're running that as an unprivileged user. There's another problem which isbundler
that will usegem
which will therefore bring you to the same problem but this time you can't use the--user-install
flag anymore. To overcome the default behavior without affecting the underlying operational system you can force gem to use a user account and bundler to use a local directory.TL;DR:
What you need to do is use
gem install --user-install
instead ofgem install
. That will install gems to~/.local/share/gem/
;And
bundle config set --local path 'vendor/bundle'
or a similar command for every project. Alternatively, you can usebundle config set --global path ~/.local/share/gem/
, which will use the same folder thatgem install --user-install
uses (On Ubuntu 22.04).First of all, the current instructions on that tutorial suggests opening power shell and running
bash
. That is outdated. If you're using the Ubuntu App from Windows Store, when you run that App you'll get a shell inside the Ubuntu virtual machine, that's what you should use. From there you can follow the ubuntu instructions.This is a step by step which works in this environment, it will use
sudo
only once where it is unavoidable:With just that you can already use Jekyll inside Ubuntu as usual. If you want to use it from bundler, then you'll have to install webrick gem again because jekyll will overwrite Gemfile. Also, by default, bundler tries to install system-wide, so you'll have to configure it to use a local directory.
WARNING: only run these commands inside the directory of your blog, or a new empty directory for a future blog.
Test it with
bundle exec jekyll serve
If you're ok with using your user-wide gem folder and is aware that updating jekyll will update the version of the gems it depends, affecting your other ruby projects, then you can use the user-wide approach:
Of course, you can always use the system-wide approach too, which is the least recommended because it'll break your ruby installation: