Это получило меня удивление, и я взглянул на источник ядра Linux (я предполагаю, что Ваш вопрос о Linux).
Это появляется ответ, более трудный, чем Вы ожидали бы. Эта страница руководства по интерфейсу API БОЧКИ/TAP предлагает некоторое понимание. В основном Ваша программа выделяет новое устройство БОЧКИ/TAP путем открытия /dev/net/tun
и отправка его TUNSETIFF
ioctl
. Если все подходит, интерфейс создается, ядро дает Вам свое имя и дескриптор файла, и это - то, как Вы управляете им.
Здесь существует две выгоды:
struct tun_struct
(БОЧКА и TAP в основном совместно используют те же структуры данных).На практике я подозреваю 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, все же.
Начиная с ответа @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
аргумент Кв. - добирается.
Походит на довольно простой способ пойти. Команда для получения списка пакетов и их состояния dpkg --get-selections
, таким образом, Вы могли сделать что-то вроде этого:
dpkg --get-selections | grep '\<install$' | cut -f1 | xargs apt-get install --reinstall