Вопрос или проблема
ls /usr/bin
дает сообщение об ошибке:
ls: reading directory '/usr/bin': Permission denied
в wbash.exe
. По этой причине bash-completion и eshell-completion не работают или дают неполные результаты. Я хотел бы, чтобы это работало.
Что работает:
/usr/bin $ ls -l emacs
lrwxrwxrwx 1 root root 23 2017-07-31 17:16 emacs -> /etc/alternatives/emacs
/usr/bin $ ls -l gcc-5
-rwxr-xr-x 1 root root 915736 2017-09-14 06:01 gcc-5
/usr/bin $ ls -ld /usr/bin
drwxr-xr-x 0 root root 512 2017-12-19 09:45 /usr/bin
/usr/bin $ ls -ld /usr/sbin
drwxr-xr-x 0 root root 512 2017-12-19 09:45 /usr/sbin
/usr/bin $ ls -ld /
drwxr-xr-x 0 root root 512 2017-11-17 10:23 /
/usr/bin $ ls -ld /usr
drwxr-xr-x 0 root root 512 2017-03-30 11:55 /usr
Версия Windows: Windows 10 (64bit), Версия 1703 (Build 15063.786)
Каталог sbin
может быть показан без проблем, и все настройки Windows для bin
в %USERPROFILE%\AppData\Local\lxss\rootfs\usr
, доступные через WindowsExplorer, такие же, как и для sbin
.
Команды icacls.exe bin
и icacls.exe sbin
внутри %USERPROFILE%\AppData\Local\lxss\rootfs\usr
дают точно такой же ответ (за исключением первого слова, которое bin
для bin
и sbin
для sbin
). Поэтому это не кажется связанным с дополнительными атрибутами. Также команды icacls.exe bin /verify
и icacls.exe sbin /verify
не указывают на какие-либо ошибки.
Есть ли, возможно, какая-то функция безопасности в Ubuntu (о которой я не знаю), которая запрещает мне показывать содержимое каталога /usr/bin
? (В таком случае было бы странно, если бы это не запретило показывать /usr/sbin
.)
Это очень похоже на проблему с правами доступа.
Поскольку вы подтвердили, что проблема не в Windows,
то эта проблема связана с внутренними настройками WSL,
где эмулируются права доступа Linux, которые нативно не существуют в Windows.
Я не знаю точно, как WSL эмулирует права доступа Linux.
Если он использует механизм Windows – ACL, вы можете сбросить их все с помощью:
icacls %localappdata%\lxss /reset /T /C
Если это не поможет,
и без лучшего понимания того, как эти права доступа реализованы,
я бы предложил переустановить WSL:
-
Сделайте резервную копию ваших данных
-
Удалите среду Ubuntu, но оставьте свою домашнюю папку, затем
переустановите WSL, используя команды:lxrun /uninstall lxrun /install
-
Если это не помогло, полностью переустановите среду Ubuntu,
включая удаление вашей домашней папки, введя:lxrun /uninstall /full lxrun /install
Между двумя вышеуказанными командами проверьте, что папка
%localappdata%\lxss
пуста.
Если нет, переместите ее содержимое в временное хранилище и удалите позже
когда больше не будет нужды.
Нет проблем с правами доступа в cygwin под $HOME/AppData/Local/lxss/rootfs/usr/bin
, и я провел несколько тестов с папками для экспериментов в wsl под cygwin. Это привело меня к следующему решению.
В bash cygwin я перешел в $HOME/AppData/Local/lxss/rootfs/usr
и запустил следующую команду:
find bin -mindepth 1 -maxdepth 1 -printf "cp -a %p fix/%p\n" > /temp/fix.sh
Это создало скрипт /temp/fix.sh
в папке /temp
, которая разделяется между cygwin и wsl через символические ссылки.
В wbash
я перешел в /usr/
, создал папки fix
и fix/bin
, запустил скрипт и переместил каталог fix/bin
в bin-fix
.
cd /usr
mkdir -p fix/bin
. /temp/fix.sh
mv fix/bin bin-fix
Таким образом, wbash
сказал мне, что были проблемы с правами доступа для bin/head
.
Хорошо, я принял это и переустановил coreutils
как последний шаг этой процедуры (см. ниже).
Далее я закрыл все приложения wbash
и wbash
сам по себе и вернулся в cygwin, где папка usr
все еще была открыта.
Там я переместил bin
в сторону и переименовал bin-fix
в bin
.
mv bin bin.old
mv bin-fix bin
Я перезапустил wbash
, и вуаля, все работает нормально, и ls /usr/bin
работает.
Как уже упоминалось выше, я переустановил coreutils
как последний шаг:
sudo aptitude reinstall coreutils
Ответ или решение
Конечно, давайте разберемся с проблемой более подробно.
Теория
Ваше сообщение о проблеме с выполнением команды ls /usr/bin
в Windows Subsystem for Linux (WSL) говорит о том, что у вас возникли проблемы с доступом к данному каталогу. Система сообщает, что доступ к чтению каталога '/usr/bin'
запрещен. Это часто указывает на проблему с правами доступа.
WSL эмулирует Linux-систему внутри Windows, включая эмуляцию прав доступа файлами, что иногда может приводить к неожиданным проблемам. Хотя система активно использует ACL (Списки управления доступом) Windows для управления доступом, но она не всегда точно отражает права, принятые в стандартных Linux-системах.
Пример
Вы пробовали использовать программу icacls.exe
для проверки прав доступа как на bin
, так и на sbin
, и убедились, что они одинаковы. Это указывает на то, что проблема не связана непосредственно с ACL Windows. Также вы попробовали перенастроить права доступа с помощью icacls.exe
, но это, вероятно, не решило проблему.
Применение
-
Проверка и восстановление прав доступа: Если стандартные процедуры вроде
icacls.exe
не помогли, можно попробовать более кардинальную меру — полное восстановление WSL:lxrun /uninstall /full lxrun /install
Обратите внимание, что это удалит все данные в WSL, поэтому перед началом операции обязательно создайте резервные копии всех важных данных.
-
Альтернативное решение: Один из практических подходов, описанных вами, заключается в использовании Cygwin для копирования содержимого каталога и затем его восстановления в WSL:
- В Cygwin: Создайте скрипт для копирования файлов и исполните его, чтобы создать исправленную копию каталога.
- В WSL: Переместите старый каталог
bin
, установите исправленное содержимое. - После этих действий перезапустите
wbash
и, если необходимо, переустановите пакеты, напримерcoreutils
, чтобы восстановить функциональность.
Это комплексное решение позволит вам вернуть систему в рабочее состояние, исправляя возможные проблемы с правами.
Следуя приведенным рекомендациям, вы сможете устранить возникшую проблему и продолжить использовать WSL в полном объеме.