Чаму папярэджанне vpnc пра ачыстку маршрутаў з'яўляецца ў кантэйнеры
Ачыстка кэша маршрутаў — рэштка ад ядра, якое ўжо не трымае гэты кэш; памылка «толькі для чытання» паходзіць ад мантыравання ў кантэйнеры, а не ад тунеля.
Свежыя журналы кантэйнера часта заканчваюцца скаргай Read-only file system пра /proc/sys/net/ipv4/route/flush, і гэты радок абвінавачваюць за тунель, які можа быць цалкам спраўным. Запіс за ёй накіраваны на элемент ядра, які ўжо не робіць нічога карыснага, бо кэш маршрутаў IPv4 знік. Унутры кантэйнера /proc/sys манціруецца толькі для чытання, таму перанакіраванне адхіляецца да таго, як трапіць любое значэнне, і абалонка друкуе гэту адмову. Працаздольны тунель можа друкаваць гэта папярэджанне, пакуль стары радок застаецца ў скрыпце, і --privileged ніколі не робіць запіс асэнсаваным.
Што скрыпт спрабаваў ачысціць
Старыя скрыпты злучэння заканчваліся ачысткай кэша: запісаць значэнне ў кіраўнічы файл ядра і папрасіць стек IPv4 скінуць кэш маршрутызацыі, каб новы маршрут тунеля выбіраўся, не чакаючы старэння састарэлых запісаў. Файл адрасаваўся пад /proc/sys/net/ipv4/, што рабіла аперацыю перанакіраваннем абалонкі, а не камандай маршрутызацыі. Ядро 3.6 выдаліла гэты кэш, а разам з ім і прычыну існавання ачысткі. Нішто ў бягучым шляху даных не залежыць ад гэтага запісу.
Сам элемент захаваўся як састарэлы файл толькі для запісу, таму скрыпт, які ўсё яшчэ піша ў яго, дасягае рэальнага шляху і рэальнай праверкі правоў. На хоста запіс вяртае поспех і нічога не змяняе. У кантэйнеры тое ж перанакіраванне трапляе ў /proc/sys толькі для чытання і правальваецца з EROFS, што абалонка друкуе як паведамленне файлавай сістэмы толькі для чытання. На ядрах, дзе шлях сапраўды адсутнічае, фармулёўка становіцца No such file or directory, і выснова не змяняецца.
Дзве памылкі кажуць рознае, і розніцу варта трымаць ясна. Read-only file system азначае, што ядро дасягнула элемента і адмовіла ў запісе; No such file or directory азначае, што элемента няма. Ні адно паведамленне не паведамляе пра прыладу тунеля, маршруты ці развязанне імёнаў, таму ні адно не можа апраўдаць больш прывілеяў.
Менавіта парадак робіць паведамленне падобным на прычыннае. Скрыпт злучэння ўсталёўвае маршруты, змяняе стан інтэрфейса і перапісвае развязанне імёнаў, перш чым дасягнуць ачысткі ў канцы, таму апошні надрукаваны радок — гэта радок, які цытуюць, нават калі кожны важны крок вярнуў поспех. Тунель, які ўсталёўваецца і пераносіць трафік, друкуючы гэта папярэджанне, цалкам адпавядае механізму вышэй.
Праверце мантыраванне і маршрут, перш чым дадаваць прывілеі
Тры чытанні аддзяляюць касметычнае папярэджанне ад рэальнага збою: ці ўсё яшчэ нясе ўсталяваны скрыпт гэты радок, як манціраваны /proc/sys і куды насамрэч ідзе трафік праграмы. Выконвайце іх у тым жа прасторы імёнаў кантэйнера або на хосце, дзе з'явілася папярэджанне, бо праверка на незвязанай машыне адказвае на іншае пытанне.
grep -n 'ipv4/route/flush' /usr/share/vpnc-scripts/vpnc-script
findmnt -no OPTIONS /proc/sys
ip -4 route get 10.20.5.10Адказ grep слабейшы, чым выглядае, бо знаходжанне даказвае наяўнасць радка, а не тое, што ён выконваецца без аховы; падтрымліваны скрыпт можа трымаць запіс унутры аховы, якая яго прапускае. findmnt -no OPTIONS /proc/sys вырашае мантыраванне наўпрост, а ro у гэтым вывадзе азначае, што кожны запіс ніжэй гэтага пункта адхіляецца, што б ні рабіў скрыпт. Затым пошук маршруту паказвае, ці вырашаецца патрэбны праграме прызначэнне праз інтэрфейс тунеля ці праз шлюз кантэйнера па змаўчанні. Пошук, які выбірае шлюз па змаўчанні, азначае, што тунель падняўся і нішто ў яго не маршрутызуецца, а гэта праблема маршрутызацыі, а не прывілеяў.
Адкуль насамрэч пастаўляецца выпраўленне
Падтрымліванае выпраўленне жыве ў скрыпце, а не ў сцягах кантэйнера. upstream vpnc-script змяніў тое, як ён апрацоўвае гэту аперацыю, таму параўнайце копію ў вобразе з бягучым upstream і абнавіце праз пакет або зборку вобраза, якая яе пастаўляе. Файл, адрэдагаваны ўручную ў працуючым кантэйнеры, не падлягае праверцы і не захаваецца да наступнай зборкі.
--privileged дакументаваны як наданне ўсіх магчымасцяў і шырокага доступу да прылад — вялікая саступка за паведамленне, якое нічога не змяняе, таму называйце адсутную магчымасць, калі яе сапраўды няма. Пасля абнаўлення паўтарыце пошук маршруту і дайце праграме выкарыстаць тунель, бо ціхі журнал і працаздольнае злучэнне — асобныя вынікі.