4

Я пытаюсь установить linux-libc-dev с помощью apt-get в Windows Subsystem for Linux (ubuntu), но у меня появляется ошибка, и я не могу ее исправить:

dpkg: error processing archive /var/cache/apt/archives/linux-libc-dev_3.13.0-126.175_amd64.deb (--unpack):
 unable to install new version of `/usr/include/linux/netfilter/xt_DSCP.h': File exists
Errors were encountered while processing:
 /var/cache/apt/archives/linux-libc-dev_3.13.0-126.175_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Но когда я перечисляю файлы в /usr /include /, каталог linux даже не существует.

Что может быть причиной этого? Как файл может существовать, когда каталог не существует?

Благодарю.

2 ответа2

3

Вероятно, установка была прервана на полпути, и она не работает.

Найти сорванные пакеты:

dpkg --configure -a

Это должно вернуть список как:

Errors were encountered while processing:
libc6-dev:amd64
libstdc++-4.8-dev:amd64
g++-4.8
g++

Принудительно удалить эти:

dpkg --remove libc6-dev
dpkg --remove g++
...

Очистите кеш любого скачанного пакета, который является недействительным, и удалите дополнительные пакеты:

apt-get clean
apt-get autoremove

Теперь вы сможете снова apt-get install foo .

Насколько я знаю, apt не достаточно умен, чтобы исправить это сам, как только он попадет в такое состояние, вам придется вернуться к явной очистке пакетов с помощью dpkg --remove .

0

У меня была та же проблема, и я обнаружил, что она запускается просто потому, что по какой-то неудачной и странной причине пакет Ubuntu linux-libc-dev содержит несколько файлов (заголовков) с именами, которые различаются только по буквам, например, /usr/include/linux/netfilter/xt_DSCP.h и /usr/include/linuxnetfilter/xt_dscp.h .

Проблема связана с некоторым глупым поведением WSL, а именно с ошибкой / несогласованностью в реализации его чувствительной к регистру файловой системы. Предположим, в каком-то каталоге есть файл, и вы хотите создать в этом же каталоге еще один файл с тем же именем, за исключением регистра. Это должно сработать и создать второй файл в дополнение к другому (или, возможно, перезаписать существующий файл). Однако это не помогает и, что еще хуже, приводит к вводящей в заблуждение ошибке:

touch a.txt touch A.txt выдает touch: cannot touch 'A.txt': Input/output error

С другой стороны, можно создавать файлы в обоих случаях следующим образом: touch b.txt touch x.txt mv x.txt B.txt ls {b,B}.txt b.txt B.txt

Вот обходной путь для пакетов с именами, такими как linux-libc-dev_4.4.0-97.120_amd64.deb:

cd any-temp-dir

apt-get download linux-libc-dev
ar x linux-libc-dev*deb
tar xJf data.tar.xz        # ignore all erors like ./usr/include/linux/netfilter/xt_DSCP.h: Cannot open: Input/output error
tar cJf data.tar.xz ./usr
ar rcs linux-libc-dev*.deb debian-binary control.tar.gz data.tar.xz 

sudo dpkg -i linux-libc-dev*.deb

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .