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 සහිත අක්ෂර උපාංගයක්ද, සවි කිරීමේ විකල්ප පිරිසිදුද, ක්‍රියාවලි සන්දර්භය හැකියාව දරයිද, සහ අසාර්ථකත්වයේ වේලා මුද්‍රාවේ ප්‍රතිපත්ති ප්‍රතික්ෂේපයක් තිබේද. පහම පසුකරන දෝෂයක් උපාංග ගැටලුවක් නොවේ, පණිවිඩය කුමක් කීවත්.

අදාළ ලිපි