OpenVPN yn stopio gyda chwyn errno 2 am /dev/net/tun tra bod lsmod yn rhestru'r modiwl tun yn ddi-broblem. Mae'r ddau ffaith yn wir ar yr un pryd. Mae'r modiwl yn darparu gyrrwr, ac mae'r llwybr y mae'r cleient yn ei agor yn nod dyfais y mae'n rhaid i rywbeth arall ei greu. Trin y rhain fel un gwrthrych yw'r rheswm pam nad yw'r atgyweiriad amlwg o ail-lwytho'r modiwl yn newid dim o gwbl.

Dau wrthrych, dau berchnogwr gwahanol

Mae modiwl cnewyllyn a nod dyfais yn wrthrychau annibynnol â chylchoedd bywyd annibynnol. Mae llwytho'r modiwl yn cofrestru gyrrwr, ac mewn system â devtmpfs mae'r cnewyllyn yn gofyn i'r nod cyfatebol gael ei greu. Mewn system heb devtmpfs nid oes dim yn creu dim, ac mae'r gyrrwr yn eistedd yno heb lwybr yn cyfeirio ato. Gall y modiwl fod wedi'i lwytho, yn iach ac yn hollol anghyraeddadwy drwy'r system ffeiliau ar yr un pryd.

Dyna pam nad yw testun y gwall a'r rhestr modiwlau yn gwrth-ddweud ei gilydd. Mae'r cleient yn agor llwybr, nid yw'r llwybr yn bodoli, ac mae'r cnewyllyn yn dychwelyd ENOENT cyn i'r gyrrwr tun gael ei ymgynghori o gwbl. Ni all ail-lwytho'r modiwl atgyweirio llwybr sydd ar goll, ac ni all creu'r llwybr atgyweirio gyrrwr sydd ar goll.

lsmod | grep -w tun
stat -c "%F %t:%T" /dev/net/tun
grep " /dev " /proc/mounts

devtmpfs yn erbyn mknod penodol

Yn arferol mae dau fecanwaith yn creu'r nod hwnnw, a bydd gwybod pa un y dylai fod yn gyfrifol yn dweud wrthych beth i'w atgyweirio. Mae devtmpfs yn gadael i'r cnewyllyn greu nodau dyfais mewn achos wedi'i fowntio, ac mae udev yn rhoi perchnogaeth a chaniatadau ar eu pennau. Mae mknod penodol yn llwybr â llaw ar gyfer delweddau a mannau enw lle nad yw'r naill na'r llall yn rhedeg wrth gychwyn.

Cymharwch ganlyniadau yn hytrach na bwriadau. Os yw devtmpfs wedi'i fowntio yn /dev ac mae'r nod yn dal ar goll, nid y gyrrwr yw'r un rydych yn ei dybio, neu mae rhywbeth wedi tynnu'r nod ar ôl cychwyn. Os yw /dev yn gyfeiriadur plaen y tu mewn i rootfs heb ei bacio, nid oes mecanwaith awtomatig ac mae'n rhaid i bwy bynnag sy'n adeiladu'r ddelwedd greu'r nod.

stat -c "%F major=%t minor=%T" /dev/net/tun
# expect: character special file major=a minor=c8

Lle nad yw'r naill fecanwaith na'r llall yn rhedeg, rhaid gwneud y nod â llaw, ac mae'r drefn yn bwysig. Crëwch y cyfeiriadur rhiant yn gyntaf, oherwydd mknod ni all ei ddyfeisio, yna'r ddyfais nodau, yna modd sy'n ei adael yn ysgrifennadwy i root yn unig. Ail-lwythwch y modiwl cyn i chi greu'r nod, a dim ond ar ôl i ls ddangos mai cyfeiriadur ydyw yn hytrach na dyfais y dylech dynnu llwybr sy'n bodoli.

sudo modprobe tun
sudo mkdir -p /dev/net
sudo mknod /dev/net/tun c 10 200
sudo chmod 600 /dev/net/tun
ls -l /dev/net/tun

Y math a adroddir gan stat yw'r gwahaniaethydd cyflymaf, a chyfeiriadur yn y llwybr hwnnw yw'r syndod mwyaf cyffredin mewn delweddau minimol. Mae mkdir o fwriad da mewn Dockerfile yn gadael yn union hynny, ac nid oes unrhyw faint o lwytho modiwlau yn disodli cyfeiriadur â dyfais nodau. Major 10 gyda minor 200 yw'r pâr cofrestredig ar gyfer tun, wedi'i fynegi mewn hecs fel a a c8.

Pedwar ôl, pedwar achos

Mae pedwar achos yn esbonio bron bob achos, ac mae pob un yn gadael ôl gwahanol yn y cofnodion. Dechreuwch gyda'r amgylchedd cychwyn. Mae delweddau di-ddisg, byrddau wedi'u mewnosod a chamau initramfs yn aml yn mowntio'r naill na'r llall o devtmpfs na /devsy'n cael ei reoli gan udev, felly nid oes unrhyw broses byth yn ysgrifennu'r nod. Yna darllenwch opsiynau mowntio beth bynnag sy'n cynnal /dev, oherwydd nodev yn caniatáu i'r llwybr fodoli tra'n gwrthod ei agor, ac mae mownt bind a gymerwyd o westeiwr caled yn cario'r faner heb gyhoeddi ei hun. Mae mownt darllen-yn-unig yn methu'n gynt ac yn uwch: mknod yn dychwelyd EROFS yno, tra bod EPERM yn golygu bod y broses yn brin o'r gallu yn hytrach na bod y system ffeiliau'n amddiffyn ei hun. Yn olaf, mae runtime cynwysyddion â'i /dev tmpfs ei hun angen i'r nod gael ei chwistrellu i'w ofod enw ei hun, ac mae'n rhaid i'w cgroup dyfeisiau ganiatáu'r pâr major a minor.

Gwiriwch yr haen polisi cyn newid caniatadau eto. Gall SELinux ac AppArmor wrthod agoriad y mae pob priodoledd ffeil yn ei ganiatáu, ac mae'r gwrthodiad hwnnw'n ymddangos yng nghofnod archwilio yn hytrach nag yn allbwn y cleient. Mae newid caniatâd nad yw byth yn ymddangos mewn gwrthodiad yn amser wedi'i wario ar yr haen hollol anghywir.

sudo journalctl -k -n 20 --no-pager
sudo ausearch -m AVC -ts recent | tail -5

Profwch ef â rhyngwyneb, nid â rhestr

Mae rhestr lwyddiannus yn profi bod llwybr yn bodoli a dim mwy. Agorwch nod tun iach i'w ddarllen a daw'r alwad yn ôl gyda gwall, oherwydd nid oes gan y ddyfais semanteg darllen ac nid yw'n ffeil arferol. Y gwall hwnnw yw'r signal llwyddiant yma, ac mae ei adnabod yn eich cadw rhag ei erlid fel nam.

head -c 1 /dev/net/tun
head: error reading '/dev/net/tun': File descriptor in bad state

Mae'r prawf pendant yn creu rhyngwyneb, oherwydd mae'n ymarfer y gyrrwr, y nod a'ch breintiau mewn un cam. Os yw'r ychwanegiad yn llwyddo ac mae'r cyswllt yn ymddangos, mae'r tri yn gweithio. Pan fydd yn methu, mae errno yn gwahanu'r achosion: mae ENOENT yn golygu nad oes nod defnyddiadwy, mae EPERM yn pwyntio at allu, baneri mowntio neu bolisi, ac mae EBUSY yn golygu bod proses arall eisoes yn berchen ar y rhyngwyneb.

sudo ip tuntap add dev tun7 mode tun
ip -brief link show tun7
sudo ip tuntap del dev tun7 mode tun

Rhedwch y prawf hwnnw yn y cyd-destun sy'n methu mewn gwirionedd, oherwydd gall uned gwasanaeth, cynhwysydd neu dasg wedi'i hamserlennu gario set galluoedd wahanol i'ch powlen fewngofnodi. Nid yw prawf sy'n pasio yn y cyd-destun anghywir yn profi dim am yr un sy'n methu.

Pan nad y ddyfais yw'r broblem

Os yw'r prawf rhyngwyneb yn llwyddo ac mae'r cleient yn dal i fethu, y broblem sy'n weddill yw'r proffil, cyd-destun y gwasanaeth neu'r llwybr, ac mae'r ddyfais yn iawn. Dyna'r eiliad i roi'r gorau i olygu nodau dyfais, oherwydd nid yw newidiadau pellach ond yn ychwanegu pellter oddi wrth system sy'n gweithio.

Rhedwch yr un pum gwiriad bob tro yn hytrach na dyfeisio un newydd: a yw'r modiwl wedi'i lwytho heb fodiwl cystadleuol, a yw'r llwybr yn ddyfais nodau gyda'r major a'r minor cywir, a yw'r opsiynau mowntio'n lân, a yw cyd-destun y broses yn cario'r gallu, ac a oes gwrthodiad polisi ar stamp amser y methiant. Nid yw nam sy'n goroesi'r pum i gyd yn broblem dyfais, beth bynnag y mae'r neges yn ei grybwyll.

Erthyglau cysylltiedig