/dev/net/tun yo'q, tun esa yuklangan: qurilma tugunini tuzating
Yuklangan tun moduli qurilma tuguni mavjudligini isbotlamaydi. Drayverni tugundan ajrating, tartib bilan qayta quring va interfeys bilan tekshiring.
OpenVPN errno 2 shikoyati bilan to'xtaydi, u /dev/net/tun haqida, holbuki lsmod tun modulini bemalol ro'yxatlaydi. Ikkala fakt bir vaqtda to'g'ri. Modul drayver beradi, klient ochadigan yo'l esa boshqa narsa yaratishi kerak bo'lgan qurilma tugunidir. Ularni bitta obyekt deb qarash — modulni qayta yuklash kabi ko'rinib turgan tuzatish nima uchun hech narsani o'zgartirmasligining sababi.
Ikki obyekt, ikki xil egasi
Yadro moduli va qurilma tuguni mustaqil hayot sikllariga ega mustaqil obyektlardir. Modulni yuklash drayverni ro'yxatga oladi va devtmpfs bor tizimda yadro tegishli tugunni yaratishni so'raydi. devtmpfs yo'q tizimda hech narsa hech narsani yaratmaydi va drayver unga ishora qiluvchi hech qanday yo'lsiz o'sha yerda o'tiradi. Modul bir vaqtning o'zida yuklangan, sog'lom va fayl tizimi orqali butunlay yetib bo'lmaydigan bo'lishi mumkin.
Shuning uchun xato matni va modullar ro'yxati bir-biriga zid emas. Klient yo'lni ochadi, yo'l yo'q va yadro tun drayveridan so'ralishidan oldin ENOENT qaytaradi. Modulni qayta yuklash yo'qolgan yo'lni tuzata olmaydi, yo'lni yaratish esa yo'qolgan drayverni tuzata olmaydi.
lsmod | grep -w tun
stat -c "%F %t:%T" /dev/net/tun
grep " /dev " /proc/mounts
devtmpfs va aniq mknod
Odatda bu tugunni ikki mexanizm yaratadi va qaysi biri javobgar bo'lishi kerakligini bilish nima tuzatishni aytadi. devtmpfs yadroga o'rnatilgan nusxada qurilma tugunlarini yaratishga ruxsat beradi, udev esa ularga egalik va ruxsatlarni qo'llaydi. Aniq mknod ikkisi ham yuklashda ishlamaydigan obrazlar va nom fazolari uchun qo'lda qilinadigan yo'ldir.
Niyatni emas, natijani solishtiring. Agar devtmpfs /dev ga o'rnatilgan bo'lsa-yu tugun hali yo'q bo'lsa, drayver siz o'ylagan narsa emas, yoki kimdir yuklashdan keyin tugunni olib tashlagan. Agar /dev ochilgan rootfs ichidagi oddiy katalog bo'lsa, avtomatik mexanizm yo'q va obrazni kim qursa, tugunni o'sha yaratishi kerak.
stat -c "%F major=%t minor=%T" /dev/net/tun
# expect: character special file major=a minor=c8
Ikkala mexanizm ham ishlamaydigan joyda tugunni qo'lda yasash kerak va tartib muhim. Avval ota-katalog yarating, chunki mknod uni o'ylab topa olmaydi, so'ng belgi qurilmasi, so'ng faqat root uchun yozsa bo'ladigan rejim. Tugun yaratishdan oldin modulni qayta yuklang va mavjud yo'lni faqat ls uning qurilma emas, katalog ekanini ko'rsatgandan keyin olib tashlang.
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
Eng tez ajratgich — stat xabar beradigan tur, va o'sha yo'lda katalog bo'lishi minimal obrazlarda eng ko'p uchraydigan ajablantiruvchi narsa. Yaxshi niyat bilan yozilgan mkdir Dockerfile ichida aynan shuni qoldiradi va qancha modul yuklanmasin, katalogni belgi qurilmasi bilan almashtirib bo'lmaydi. Major 10 va minor 200 — tun uchun ro'yxatga olingan juftlik, o'n oltilikda a va c8 sifatida ifodalanadi.
To'rt iz, to'rt sabab
To'rt sabab deyarli har bir holatni tushuntiradi va har biri jurnallarda boshqa iz qoldiradi. Yuklash muhitidan boshlang. Disksiz obrazlar, o'rnatilgan platalar va initramfs bosqichlari ko'pincha na devtmpfs, na udev boshqaradigan /devni o'rnatadi, shuning uchun hech bir jarayon tugunni hech qachon yozmaydi. So'ng /devni xosting qilayotgan narsaning o'rnatish parametrlarini o'qing, chunki nodev yo'lning mavjud bo'lishiga ruxsat beradi, lekin uni ochishdan bosh tortadi, va qattiqlashtirilgan xostdan olingan bind o'rnatish bu bayroqni o'zini e'lon qilmasdan olib yuradi. Faqat-o'qish uchun o'rnatish ertaroq va balandroq muvaffaqiyatsiz bo'ladi: mknod u yerda EROFS qaytaradi, EPERM esa jarayonda qobiliyat yo'qligini bildiradi, fayl tizimi o'zini himoya qilayotganini emas. Nihoyat, o'z /dev tmpfs iga ega konteyner runtime tugunni o'z nom fazosiga kiritishni talab qiladi va uning qurilma cgroup i major va minor juftligiga ruxsat berishi kerak.
Ruxsatlarni yana o'zgartirishdan oldin siyosat qatlamini tekshiring. SELinux va AppArmor faylning har bir atributi ruxsat beradigan ochishni rad etishi mumkin va bu rad javob audit jurnalida ko'rinadi, klient chiqishida emas. Hech qachon rad javobida ko'rinmaydigan ruxsat o'zgarishi butunlay noto'g'ri qatlamga sarflangan vaqtdir.
sudo journalctl -k -n 20 --no-pager
sudo ausearch -m AVC -ts recent | tail -5
Buni interfeys bilan isbotlang, ro'yxat bilan emas
Muvaffaqiyatli ro'yxat yo'l mavjudligini isbotlaydi va boshqa hech narsani emas. Sog'lom tun tugunini o'qish uchun oching, chaqiruv xato bilan qaytadi, chunki qurilmada o'qish semantikasi yo'q va u oddiy fayl emas. O'sha xato bu yerda muvaffaqiyat signali va uni tanib olish sizni uni nosozlik deb quvishdan saqlaydi.
head -c 1 /dev/net/tun
head: error reading '/dev/net/tun': File descriptor in bad state
Hal qiluvchi sinov interfeys yaratadi, chunki u bir qadamda drayverni, tugunni va sizning imtiyozlaringizni sinaydi. Qo'shish muvaffaqiyatli bo'lsa va havola paydo bo'lsa, uchtasi ham ishlaydi. Muvaffaqiyatsiz bo'lganda errno sabablarni ajratadi: ENOENT foydali tugun yo'qligini, EPERM qobiliyat, o'rnatish bayroqlari yoki siyosatga ishora qilishini, EBUSY esa interfeysni boshqa jarayon allaqachon egallaganini bildiradi.
sudo ip tuntap add dev tun7 mode tun
ip -brief link show tun7
sudo ip tuntap del dev tun7 mode tun
Bu sinovni haqiqatan ham muvaffaqiyatsiz bo'ladigan kontekstda o'tkazing, chunki xizmat birligi, konteyner yoki rejalashtirilgan ish sizning kirish shellingizdan boshqa qobiliyatlar to'plamini olib yurishi mumkin. Noto'g'ri kontekstda o'tgan sinov muvaffaqiyatsiz bo'layotgani haqida hech narsani isbotlamaydi.
Qurilma muammo bo'lmaganda
Agar interfeys sinovi muvaffaqiyatli bo'lsa-yu klient hali ham muvaffaqiyatsiz bo'lsa, qolgan muammo profil, xizmat konteksti yoki marshrutdir va qurilma joyida. Bu qurilma tugunlarini tahrirlashni to'xtatish kerak bo'lgan payt, chunki keyingi o'zgarishlar ishlayotgan tizimdan faqat masofani oshiradi.
Har safar yangisini o'ylab topish o'rniga o'sha beshta tekshiruvni o'tkazing: modul raqib modulsiz yuklanganmi, yo'l to'g'ri major va minor ga ega belgi qurilmami, o'rnatish parametrlari tozami, jarayon konteksti qobiliyatni olib yuradimi va muvaffaqiyatsizlik vaqtida siyosat rad javobi bormi. Beshtasidan ham omon o'tgan nosozlik qurilma muammosi emas, xabar nima deyishidan qat'i nazar.