OpenVPN errno 2 புகாருடன் நிற்கிறது, அது /dev/net/tun பற்றியது, ஆனால் lsmod tun தொகுதியை எளிதாக பட்டியலிடுகிறது. இரண்டு உண்மைகளும் ஒரே நேரத்தில் உண்மை. தொகுதி ஒரு இயக்கியை வழங்குகிறது, வாடிக்கையாளர் திறக்கும் பாதை வேறு ஏதாவது உருவாக்க வேண்டிய சாதன முனை. இரண்டையும் ஒரே பொருளாகக் கருதுவதே தொகுதியை மீண்டும் ஏற்றும் வெளிப்படையான சரிசெய்தல் எதையும் மாற்றாததற்குக் காரணம்.

இரண்டு பொருள்கள், இரண்டு வெவ்வேறு உரிமையாளர்கள்

கர்னல் தொகுதியும் சாதன முனையும் தனித்தனி வாழ்க்கைச் சுழற்சிகள் கொண்ட தனித்தனி பொருள்கள். தொகுதியை ஏற்றுவது ஒரு இயக்கியைப் பதிவு செய்கிறது, devtmpfs உள்ள அமைப்பில் கர்னல் தொடர்புடைய முனையை உருவாக்கக் கேட்கிறது. devtmpfs இல்லாத அமைப்பில் எதுவும் எதையும் உருவாக்காது, இயக்கி அதை நோக்கிக் காட்டும் எந்தப் பாதையும் இல்லாமல் அங்கேயே அமர்ந்திருக்கும். தொகுதி ஒரே நேரத்தில் ஏற்றப்பட்டதாக, ஆரோக்கியமாக, கோப்பு முறைமை வழியாக முற்றிலும் அணுக முடியாததாக இருக்க முடியும்.

அதனால்தான் பிழை உரையும் தொகுதி பட்டியலும் ஒன்றுக்கொன்று முரண்படவில்லை. வாடிக்கையாளர் ஒரு பாதையைத் திறக்கிறார், பாதை இல்லை, tun இயக்கியைக் கேட்பதற்கு முன்பே கர்னல் ENOENT திருப்பித் தருகிறது. தொகுதியை மீண்டும் ஏற்றுவது காணாமல் போன பாதையைச் சரிசெய்ய முடியாது, பாதையை உருவாக்குவது காணாமல் போன இயக்கியைச் சரிசெய்ய முடியாது.

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

devtmpfs மற்றும் வெளிப்படையான mknod

பொதுவாக இரண்டு செயல்முறைகள் அந்த முனையை உருவாக்குகின்றன, எது பொறுப்பாக இருக்க வேண்டும் என்று தெரிந்தால் எதைச் சரிசெய்ய வேண்டும் என்று தெரியும். devtmpfs கர்னலை ஏற்றப்பட்ட நிகழ்வில் சாதன முனைகளை உருவாக்க அனுமதிக்கிறது, udev அவற்றின் மீது உரிமையையும் அனுமதிகளையும் பயன்படுத்துகிறது. ஒரு வெளிப்படையான mknod என்பது இரண்டும் துவக்கத்தில் இயங்காத படங்கள் மற்றும் பெயர்வெளிகளுக்கான கைமுறை பாதை.

எண்ணங்களை அல்ல, முடிவுகளை ஒப்பிடுங்கள். devtmpfs /dev இல் ஏற்றப்பட்டிருந்தும் முனை இன்னும் இல்லை என்றால், இயக்கி நீங்கள் கருதுவது அல்ல, அல்லது ஏதோ துவக்கத்திற்குப் பிறகு முனையை நீக்கியது. /dev திறந்த rootfs உள்ளே ஒரு சாதாரண அடைவு என்றால், தானியங்கி செயல்முறை இல்லை, படத்தை உருவாக்குபவர் முனையை உருவாக்க வேண்டும்.

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

இரண்டு செயல்முறைகளும் இயங்காத இடத்தில், முனையை கையால் உருவாக்க வேண்டும், வரிசை முக்கியம். முதலில் பெற்றோர் அடைவை உருவாக்குங்கள், ஏனெனில் mknod அதைக் கற்பனை செய்ய முடியாது, பின்னர் எழுத்துச் சாதனம், பின்னர் root க்கு மட்டும் எழுதக்கூடிய பயன்முறை. முனையை உருவாக்கும் முன் தொகுதியை மீண்டும் ஏற்றுங்கள், இருக்கும் பாதையை ls அது சாதனம் அல்ல, அடைவு என்று காட்டிய பிறகே நீக்குங்கள்.

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

விரைவான வேறுபடுத்தி stat தெரிவிக்கும் வகை, அந்தப் பாதையில் அடைவு இருப்பது குறைந்தபட்ச படங்களில் மிகவும் பொதுவான ஆச்சரியம். நல்ல நோக்கத்துடன் எழுதப்பட்ட mkdir Dockerfile இல் அதையே விட்டுச் செல்கிறது, எத்தனை தொகுதிகளை ஏற்றினாலும் அடைவை எழுத்துச் சாதனத்தால் மாற்ற முடியாது. Major 10 மற்றும் minor 200 tun க்கான பதிவு செய்யப்பட்ட இணை, பதினாறிலக்கத்தில் a மற்றும் c8 ஆக வெளிப்படுத்தப்படுகிறது.

நான்கு தடயங்கள், நான்கு காரணங்கள்

நான்கு காரணங்கள் கிட்டத்தட்ட ஒவ்வொரு நிகழ்வையும் விளக்குகின்றன, ஒவ்வொன்றும் பதிவுகளில் வேறு தடயத்தை விட்டுச் செல்கிறது. துவக்கச் சூழலில் தொடங்குங்கள். வட்டு இல்லாத படங்கள், உள்ளமைக்கப்பட்ட பலகைகள் மற்றும் initramfs நிலைகள் பெரும்பாலும் devtmpfs அல்லது udev நிர்வகிக்கும் /devஏற்றுவதில்லை, எனவே எந்தச் செயலும் முனையை எழுதுவதில்லை. பின்னர் /devவழங்குபவற்றின் ஏற்று விருப்பங்களைப் படியுங்கள், ஏனெனில் nodev பாதை இருக்க அனுமதிக்கிறது ஆனால் அதைத் திறக்க மறுக்கிறது, கடினப்படுத்தப்பட்ட புரவலனிலிருந்து எடுக்கப்பட்ட bind ஏற்று தன்னை அறிவிக்காமல் இந்தக் கொடியைச் சுமக்கிறது. படிக்க-மட்டும் ஏற்று முன்பே மற்றும் சத்தமாக தோல்வியடைகிறது: mknod அங்கே EROFS திருப்பித் தருகிறது, EPERM என்பது செயலுக்குத் திறன் இல்லை, கோப்பு முறைமை தன்னைப் பாதுகாக்கிறது என்று அல்ல. இறுதியாக, தனக்கான /dev tmpfs உள்ள கொள்கலன் இயக்கநேரம் முனையை அதன் சொந்தப் பெயர்வெளியில் செலுத்த வேண்டும், அதன் சாதன cgroup major மற்றும் minor இணையை அனுமதிக்க வேண்டும்.

அனுமதிகளை மீண்டும் மாற்றும் முன் கொள்கை அடுக்கைச் சரிபார்க்கவும். SELinux மற்றும் AppArmor ஒவ்வொரு கோப்புப் பண்பும் அனுமதிக்கும் திறப்பை மறுக்கலாம், அந்த மறுப்பு வாடிக்கையாளர் வெளியீட்டில் அல்ல, தணிக்கைப் பதிவில் தோன்றுகிறது. எந்த மறுப்பிலும் ஒருபோதும் தோன்றாத அனுமதி மாற்றம் முற்றிலும் தவறான அடுக்கில் செலவிடப்பட்ட நேரம்.

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

பட்டியலால் அல்ல, இடைமுகத்தால் நிரூபியுங்கள்

வெற்றிகரமான பட்டியல் ஒரு பாதை இருப்பதை நிரூபிக்கிறது அவ்வளவே. ஆரோக்கியமான tun முனையைப் படிக்கத் திறங்கள், அழைப்பு பிழையுடன் திரும்புகிறது, ஏனெனில் சாதனத்திற்கு படிக்கும் பொருள் இல்லை, அது சாதாரண கோப்பும் அல்ல. அந்தப் பிழையே இங்கே வெற்றியின் சமிக்ஞை, அதை அறிவது அதைக் குறையாகத் துரத்துவதைத் தடுக்கிறது.

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

தீர்க்கமான சோதனை ஒரு இடைமுகத்தை உருவாக்குகிறது, ஏனெனில் அது ஒரே படியில் இயக்கி, முனை மற்றும் உங்கள் சிறப்புரிமைகளைச் சோதிக்கிறது. சேர்ப்பு வெற்றிபெற்று இணைப்பு தோன்றினால் மூன்றும் வேலை செய்கின்றன. தோல்வியடையும் போது errno காரணங்களைப் பிரிக்கிறது: ENOENT என்பது பயன்படுத்தக்கூடிய முனை இல்லை, EPERM திறன், ஏற்றுக் கொடிகள் அல்லது கொள்கையைச் சுட்டுகிறது, EBUSY என்பது வேறு செயல் ஏற்கனவே இடைமுகத்தை வைத்திருக்கிறது.

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

அந்தச் சோதனையை உண்மையில் தோல்வியடையும் சூழலிலேயே இயக்குங்கள், ஏனெனில் சேவை அலகு, கொள்கலன் அல்லது திட்டமிடப்பட்ட வேலை உங்கள் உள்நுழைவு ஷெல்லை விட வேறு திறன் தொகுப்பைக் கொண்டிருக்கலாம். தவறான சூழலில் தேர்ச்சி பெறும் சோதனை தோல்வியடையும் சூழலைப் பற்றி எதையும் நிரூபிக்காது.

சாதனம் பிரச்சினையாக இல்லாதபோது

இடைமுகச் சோதனை வெற்றிபெற்றும் வாடிக்கையாளர் இன்னும் தோல்வியடைந்தால், மீதமுள்ள பிரச்சினை சுயவிவரம், சேவைச் சூழல் அல்லது பாதை, சாதனம் நன்றாக உள்ளது. சாதன முனைகளைத் திருத்துவதை நிறுத்த வேண்டிய தருணம் அதுவே, ஏனெனில் மேலும் மாற்றங்கள் இயங்கும் அமைப்பிலிருந்து தூரத்தை மட்டுமே கூட்டுகின்றன.

ஒவ்வொரு முறையும் புதியதைக் கண்டுபிடிக்காமல் அதே ஐந்து சரிபார்ப்புகளை இயக்குங்கள்: தொகுதி போட்டி தொகுதி இல்லாமல் ஏற்றப்பட்டுள்ளதா, பாதை சரியான major மற்றும் minor கொண்ட எழுத்துச் சாதனமா, ஏற்று விருப்பங்கள் சுத்தமா, செயல் சூழல் திறனைக் கொண்டுள்ளதா, தோல்வியின் நேரமுத்திரையில் கொள்கை மறுப்பு உள்ளதா. ஐந்தையும் கடக்கும் குறைபாடு சாதனப் பிரச்சினை அல்ல, செய்தி எதைக் குறிப்பிட்டாலும்.

தொடர்புடைய கட்டுரைகள்