Debian - установка, пропускающая страницы справочника?

Это получило меня удивление, и я взглянул на источник ядра Linux (я предполагаю, что Ваш вопрос о Linux).

Это появляется ответ, более трудный, чем Вы ожидали бы. Эта страница руководства по интерфейсу API БОЧКИ/TAP предлагает некоторое понимание. В основном Ваша программа выделяет новое устройство БОЧКИ/TAP путем открытия /dev/net/tun и отправка его TUNSETIFF ioctl. Если все подходит, интерфейс создается, ядро дает Вам свое имя и дескриптор файла, и это - то, как Вы управляете им.

Здесь существует две выгоды:

  1. Ядро не хранит PID процесса, который представил ioctl struct tun_struct (БОЧКА и TAP в основном совместно используют те же структуры данных).
  2. Процесс может отметить интерфейс как персистентный, закрыть его дескриптор файла и после этого использовать его в качестве нормального сетевого интерфейса.

На практике я подозреваю 2, не происходит очень. Проверка openvpn процесс с lsof показывает, что это все еще получило свой дескриптор файла к открытому устройству TAP и очевидно использующему это, но с тех пор /dev/net/tun своего рода устройство мультиплексирования как /dev/ptmx, можно использовать lsof узнать, какие процессы в настоящее время используют устройство БОЧКИ/TAP, но Вы не можете знать то, что процесс использует что устройство.

Существуют наклонные способы решить базовую проблему. Для OpenVPN я использую туннельный сценарий установки, который называет tunX/tapX устройства с более описательным именем, которое включает базовое имя файла конфигурации OpenVPN. Так, /etc/openvpn/foo.conf приводит к a vpn-foo устройство. Затем я могу коррелировать процесс OpenvVPN с интерфейсом, который он использует. Еще не должны были делать этого с QEmu/KVM, все же.

4
20.03.2017, 12:18
2 ответа

Начиная с ответа @derobert, я проложил себе путь к получению точно текущей версии всех пакетов для переустановки.

Короткая версия:

sudo dpkg -l | grep '^ii ' | sed 's/  */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall -y --ignore-missing

Объясненный:

Ключ на самом деле указывает требуемую версию каждого пакета.

Общекомандное:

apt-get install --reinstall <package>=<version>

Разрушение долгой командной строки:

$ dpkg -l

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                                        Version                            Architecture Description
+++-===========================================================-==================================-============-========================================================================
ii  adduser                                                     3.113+nmu3                         all          add and remove users and groups
ii  apt                                                         0.9.7.8+rpi1                       armhf        commandline package manager
ii  apt-utils                                                   0.9.7.8+rpi1                       armhf        package managment related utility programs
ii  aptitude-common                                             0.6.8.2-1                          all          architecture indepedent files for the aptitude package manager
ii  atmel-firmware                                              1.3-4                              all          Firmware for Atmel at76c50x wireless networking chips.

$ dpkg -l | grep '^ii '

... избавляется от строк заголовка и нескольких пакетов с состоянием'hold'(отмеченный как hi вместо ii)

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g'

... преобразовывает любое количество пробелов к единственному Символу табуляции, подготавливающему почву для cut.
(Btw: почему, о, почему, не делает sed поддержка x+ regex для "символа x, один или несколько раз"? Это может быть эмулировано с xx* - значение 'x' когда-то сопровождаемый нулем 'x' или больше раз)

Вывод похож на это:

ii      adduser 3.113+nmu3      all     add     and     remove  users   and     groups
ii      apt     0.9.7.8+rpi1    armhf   commandline     package manager
ii      apt-utils       0.9.7.8+rpi1    armhf   package managment       related utility programs
ii      aptitude-common 0.6.8.2-1       all     architecture    indepedent      files   for     the     aptitude        package manager
ii      atmel-firmware  1.3-4   all     Firmware        for     Atmel   at76c50x        wireless        networking      chips.

Далее:

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g' | cut -f 2,3 | sed 's/\t/=/'

... завоевывает репутацию и версия каждого пакета (2-е и 3-и поля) и заменяет вкладку, которая разделяет их с '='

adduser=3.113+nmu3
apt=0.9.7.8+rpi1
apt-utils=0.9.7.8+rpi1
aptitude-common=0.6.8.2-1
atmel-firmware=1.3-4

Наконец, передайте каждое по каналу вышеупомянутое в Кв. - добираются как длинный список использования аргументов xargs.

Заметьте параметр --ignore-missing - эта команда выполняется как 'максимальные усилия' - я не хочу, чтобы обновление остановилось, потому что некоторые пакеты не доступны для переустановки (они останутся неизмененными),

$ dpkg -l | grep '^ii ' | sed 's/  */\t/g' |cut -f 2,3 | sed 's/\t/=/' | xargs apt-get install --reinstall --ignore-missing

При тестировании я также добавил a --dry-run аргумент Кв. - добирается.

5
27.01.2020, 20:51

Походит на довольно простой способ пойти. Команда для получения списка пакетов и их состояния dpkg --get-selections, таким образом, Вы могли сделать что-то вроде этого:

dpkg --get-selections | grep '\<install$' | cut -f1 | xargs apt-get install --reinstall
2
27.01.2020, 20:51

Теги

Похожие вопросы