Yo'llar va fayl turlari
/var/log/nginx/access.log oddiy matn fayliga olib boradi. /dev/null ham faylga o'xshaydi, lekin u umuman matn fayli emas, balki qurilmaga bog'langan maxsus obyekt. "Hamma narsa fayl" — Linux’dagi qulay soddalashtirish, lekin administrator baribir yo'l, u olib boradigan obyektning turi va bu obyektni qaysi fayl tizimi saqlashi o'rtasidagi farqni bilishi kerak. Aks holda noto'g'ri yo'lni tahrirlab qo'yish, nomi g'alati faylni xavfli usulda o'chirish yoki maxsus faylni oddiy matndek o'qishga urinish oson bo'lib qoladi.
Bu maqola Fayl tizimi ierarxiyasi, Hard va symbolic link’lar va Mount tushunchalari maqolalaridagi g'oyalarni yo'lni tahlil qilishning amaliy usuliga birlashtiradi. Misollar Ubuntu Server LTS, Bash va GNU/util-linux vositalari uchun yozilgan. Quyida absolyut va nisbiy yo'lni qachon ishlatishni; kernel yo'lni qisma-qism qanday aniqlashini; buzilgan yo'lni pwd, realpath va namei bilan qanday tashxislashni; ls, stat va file aslida nima aytishini; yettita asosiy fayl turini qanday tanib olishni; nomida bo'sh joy bor yoki - bilan boshlanadigan fayllar bilan xavfsiz ishlashni o'rganamiz.
Yo'l qanday qilib obyektga olib boradi
Yo'l nomi (pathname) — katalog nomlari va oxirgi obyekt nomidan tuzilgan satr. /etc/ssh/sshd_config da / boshlang'ich nuqta, etc va ssh oraliq kataloglar, sshd_config esa oxirgi qism.
Kernel har bir oraliq katalog ichidan navbatdagi nomni birin-ketin qidiradi. Soddalashtirilgan holda jarayon quyidagicha:
- qidiruv yo ildiz katalogdan, yo jarayonning joriy katalogidan boshlanadi;
- yo'l chapdan o'ngga, har safar bitta katalog qismi bo'yicha tekshiriladi;
.shu katalogda qoladi,..esa ota katalogga o'tadi;- yo'lda symbolic link uchrasa, aniqlash odatda uning maqsadidan davom etadi;
- mount nuqtasi uchrasa, qidiruv u yerga mount qilingan fayl tizimi ichida davom etadi;
- oxirgi qism topilgach, dastur shu obyekt ustida so'ralgan amalni bajaradi.
Shu sababli bir xil ko'ringan xato turli sabablarga ega bo'lishi mumkin: oxirgi fayl yo'q bo'lishi, oraliq katalog mavjud bo'lmasligi, yo'ldagi symbolic link buzilgan bo'lishi yoki kataloglardan biri joriy foydalanuvchi uchun shunchaki o'qib bo'lmaydigan bo'lishi mumkin.
Absolyut va nisbiy yo'l
Absolyut yo'l / bilan boshlanadi va odatda ildiz katalogdan boshlab aniqlanadi:
Nisbiy yo'l jarayonning joriy ish katalogidan boshlab aniqlanadi:
Bu yerda ikkala buyruq ham bitta katalogni ko'rsatadi, lekin ikkinchisining natijasi butunlay cd sizni qayerda qoldirganiga bog'liq. Skript, cron vazifasi yoki xizmatning ish katalogi siz interaktiv terminalda ko'rib turgandan farq qilishi mumkin. Shuning uchun production skriptlarida muhim konfiguratsiya va ma’lumot yo'llari odatda to'liq yoziladi.
Joriy katalogni tekshirish:
pwd Bash’ning o'z hisobiga ko'ra mantiqiy yo'lni ko'rsatadi; pwd -P esa symbolic link’larni ochgandan keyingi jismoniy yo'lni ko'rsatadi. Agar /srv/current symbolic link bo'lsa, birinchi buyruq shu nomni, ikkinchisi esa /srv/releases/v2 kabi yo'lni chiqarishi mumkin.
., .., ~ va - bir xil mexanizm emas
.: joriy katalog, yo'l qismi sifatida...: ota katalog, yo'l qismi sifatida.~: kernel umuman tanimaydigan nom — uni Bash foydalanuvchining uy katalogiga almashtiradi.cd -: BashOLDPWDda saqlangan oldingi ish katalogiga qaytadi.
Masalan:
Bu ikkisi odatda bir xil natija chiqaradi. Lekin ikkitalik qo'shtirnoq ichidagi "~" almashtirilmaydi:
Natija:
Bu farq ~ konfiguratsiya fayliga yozilganda muhim bo'ladi: har bir dastur ham Bash’dagidek almashtirishni bajarmaydi. Dastur hujjatlarida boshqacha aytilmagan bo'lsa, absolyut yo'ldan foydalaning.
Nega ./program kerak
Buyruq nomida / bo'lmasa, Bash bajariladigan faylni PATH da ko'rsatilgan kataloglardan qidiradi. Joriy katalog odatda PATH ga kirmaydi. Shuning uchun joriy katalogdagi skript quyidagicha ishga tushiriladi:
Bu yerda . joriy katalogni bildiradi, / esa Bash’ga aniq yo'l berilganini aytadi. Fayl mavjud bo'lsa ham, bajarish huquqi bo'lmasa, boshqa xato chiqadi — ruxsatlar keyingi modulda batafsil ko'rib chiqiladi.
Yo'lni kanonik shaklga keltirish
Yo'lda ortiqcha . va .. qismlari, takrorlangan / belgilari va yo'l bo'ylab symbolic link’lar bo'lishi mumkin. Kanonik yo'l bularning hammasini ochib, bitta absolyut shaklga keltiradi.
Kutiladigan natija:
Foydali variantlar:
realpath -e <path>: har bir qism haqiqatan mavjud bo'lishini talab qiladi.realpath -m <path>: ba’zi qismlar hali yaratilmagan bo'lsa ham yo'lni hisoblaydi.realpath -L <path>: symbolic link’lar ortidan borishdan oldin..ni mantiqiy aniqlaydi.realpath -P <path>: symbolic link’larni uchrashi bilan ochadi; bu GNU’dagi sukut bo'yicha xatti-harakat.
Bitta yo'lda symbolic link va .. birga kelganda -L va -P turli natija berishi mumkin. Vaziyat aynan qaysi mantiqni talab qilishini bilmasdan, avtomatlashtirishda ularning o'rnini almashtirmang.
Yo'lning har bir qismini alohida ko'rish uchun namei qulay:
Ubuntu Server’dagi namunaviy natija:
f: /var/log/syslog
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxrwxr-x root syslog log
-rw-r----- syslog adm syslog
Birinchi belgi obyekt turini, satrning qolgan qismi esa ruxsatlarni ko'rsatadi. Har bir qator yo'lning bitta qismi. Oxirgi faylni foydalanuvchi o'qiy olsa ham, oraliq kataloglardan birida kerakli ruxsat bo'lmasa, yo'l ochilmaydi. Haqiqiy egalar, guruhlar va natija tizimga bog'liq.
Tip
namei -lx <path> mount chegarasini katta D harfi bilan belgilaydi. Konteynerlar, bind mount’lar yoki alohida /var bilan murakkab sozlangan serverda yo'l aynan qayerda boshqa fayl tizimiga o'tishini shu yo'l bilan oson ko'rish mumkin.
Fayl nomlari bo'yicha amaliy qoidalar
Linux fayl nomlarida / va NUL bayt bo'lishi mumkin emas. Bo'sh joy, yangi qator belgisi va - kabi boshqa ko'plab belgilarga ruxsat beriladi, lekin shell ulardan ba’zilariga maxsus ma’no beradi.
Bo'sh joy va maxsus belgilar
Yo'l o'zgaruvchida saqlanganda yoki buyruqqa uzatilganda uni qo'shtirnoqqa oling:
Qo'shtirnoq bo'lmasa, $file ikkita alohida argumentga bo'linib ketishi mumkin. -- undan keyin keladigan narsa opsiya emasligini bildiradi.
- bilan boshlanadigan nom
Quyidagi laboratoriya xavfsiz:
Tozalashdan oldin qiymatni tekshiring:
So'ng faqat ekranda ko'rsatilgan vaqtinchalik katalogni o'chiring:
rm -rI rekursiv o'chirishdan oldin bir marta tasdiq so'raydi. -- bo'lmasa, -report fayl nomi o'rniga opsiya deb talqin qilinishi mumkin.
Warning
Agar o'zgaruvchi bo'sh bo'lsa yoki noto'g'ri katalogni ko'rsatsa, rekursiv o'chirish siz tegmoqchi bo'lmagan ma’lumotlarni yo'q qiladi. Production serverda maqsadni avval printf '%q\n' "$lab" va find "$lab" -maxdepth 1 -ls bilan tekshiring. Muhim bo'lgan har qanday narsa uchun rekursiv o'chirishdan oldin zaxira nusxa yoki VM snapshot bo'lishi kerak.
Harf registri va kengaytmalar
Ko'pchilik Linux server fayl tizimlarida Report.txt va report.txt — ikki xil nom. Lekin bu kernel bo'yicha universal qoida emas: boshqa operatsion tizimlar bilan birga ishlash uchun ishlatiladigan ba’zi fayl tizimlari boshqacha sozlanishi mumkin.
.txt, .jpg yoki .service kengaytmasi nomning bir qismi, obyektning haqiqiy turini isbotlamaydi. Linux dasturlari odatda nomga ishonmasdan, faylning haqiqiy mazmunini, uning magic baytlarini yoki muayyan konfiguratsiya joyini tekshiradi.
Linux’dagi asosiy fayl turlari
ls -l natijasining birinchi belgisi obyekt turini bildiradi:
| Belgi | Tur | Odatiy misol |
|---|---|---|
- |
oddiy fayl (regular file) | /etc/hosts |
d |
katalog (directory) | /var/log |
l |
symbolic link | /etc/mtab |
b |
blok qurilma (block device) | /dev/sda yoki /dev/vda |
c |
belgili qurilma (character device) | /dev/null |
p |
nomlangan pipe, FIFO | jarayonlararo lokal oqim |
s |
Unix domain socket | /run ostidagi xizmat socket’i |
ls, stat va file har biri nima aytadi
Bu uch buyruq bir-birining o'rnini bosmaydi:
ls -lnom, tur, ruxsatlar, egasi, hajm va vaqtni ixcham ko'rsatadi.statinode, havolalar soni, qurilma identifikatori va aniq vaqt tamg'alarini beradi.filefayl tizimi turi, magic ma’lumotlar va mazmun testlari yordamida obyektning amaliy formatini taxmin qiladi.
ls -ld /etc/hosts /dev/null
stat -c 'type=%F inode=%i link=%h device=%D name=%n' /etc/hosts
file -h /etc/hosts
Namunaviy natija:
-rw-r--r-- 1 root root 220 Apr 15 09:30 /etc/hosts
crw-rw-rw- 1 root root 1, 3 Apr 15 09:20 /dev/null
type=regular file inode=658017 link=1 device=10301 name=/etc/hosts
/etc/hosts: ASCII text
/dev/null qatoridagi c uni belgili qurilma deb belgilaydi; u yerdagi 1, 3 fayl hajmi emas, qurilmaning major va minor raqami. Inode raqamlari va sanalar tizimga qarab farq qiladi.
file -h symbolic link’ning o'zini tekshiradi, file -L esa uning maqsadi ortidan boradi:
Oddiy fayllar va kataloglar
Oddiy fayl baytlarni saqlaydi — matn, bajariladigan kod, arxiv, rasm va hokazo. Katalog esa nomlarni inode’larga bog'laydigan maxsus tuzilma. Shu sababli katalogning o'z "hajmi" ichidagi fayllar hajmining yig'indisi emas. Diskdagi joy sarfi uchun du, fayl tizimi sig'imi uchun df dan foydalaning — bu haqda Disk va fayl tizimi asoslari maqolasida gaplashganmiz.
Blok va belgili qurilmalar
Blok qurilma disk kabi belgilangan o'lchamdagi bloklarga ixtiyoriy tartibda murojaat qilishni qo'llaydigan qurilmani ifodalaydi. Belgili qurilma esa baytlar oqimi sifatida ishlaydi. Ikkala qurilma tuguni ham haqiqiy ma’lumotni o'zida saqlamaydi: ular kernel drayveriga murojaat qilish nuqtasi xolos.
Danger
/dev/sda, /dev/vda yoki /dev/nvme0n1 kabi blok qurilmalarga cat, yo'naltirish, dd, mkfs yoki matn muharriri bilan yozmang. Bu fayl tizimini buzib, ma’lumotlarni qaytarib bo'lmaydigan tarzda yo'q qilishi mumkin. Qurilmani faqat o'qish orqali o'rganish uchun lsblk -f, blkid va stat yetarli. Yozish bilan bog'liq har qanday tajriba faqat snapshot olingan alohida VM diskida bajariladi.
FIFO va socket’lar
FIFO (first in, first out — birinchi kirgan birinchi chiqadi) fayl tizimidagi nom orqali ikki jarayon o'rtasida oqim uzatadi. U doimiy mazmun saqlamaydi. Bir tomon — o'quvchi yoki yozuvchi — bo'lmasa, uni ochish ikkinchi tomon ulanmaguncha kutib qolishi (bloklanishi) mumkin.
Unix domain socket ham jarayonlararo aloqa nuqtasi, lekin u socket qoidalari orqali ikki tomonlama ishlaydi. Uni oddiy fayldek cat bilan o'qish ma’noli diagnostika usuli emas.
Xavfsiz laboratoriya: turlarni yaratish va tekshirish
Bu laboratoriyada oddiy fayl, katalog, symbolic link va FIFO yaratiladi. Qurilmalar va mavjud socket’lar esa faqat o'qish orqali tekshiriladi.
Boshlang'ich holat
Obyektlarni yaratish
Bu buyruqlar faqat yangi vaqtinchalik katalogga ta’sir qiladi va sudo talab qilmaydi.
Natijani tekshirish
ls -l ning namunaviy natijasi:
drwxr-xr-x 2 user user 40 Jul 29 10:00 subdir
lrwxrwxrwx 1 user user 4 Jul 29 10:00 link -> text
-rw-r--r-- 1 user user 6 Jul 29 10:00 text
prw-r--r-- 1 user user 0 Jul 29 10:00 queue
d, l, - va p mos ravishda katalog, symbolic link, oddiy fayl va FIFO ni belgilaydi. Symbolic link hajmi sifatida ko'rsatilgan 4 — u ko'rsatayotgan faylning hajmi emas, text maqsad satrining uzunligi.
Hech narsani o'zgartirmasdan tizimdagi qurilma va socket’larni topish:
Socket’lar ro'yxati xizmatlar va distributivga qarab farq qiladi. Bu yerda find bo'sh natija qaytarsa, bu albatta xato degani emas.
Tozalash
printf 'directory to remove: %q\n' "$lab"
find "$lab" -maxdepth 1 -ls
rm -rI -- "$lab"
test ! -e "$lab" && printf 'cleaned up\n'
Amaliy vaziyat: "No such file or directory"
Xizmat /srv/app/config/app.ini ni topa olmayapti. Darhol fayl yaratish yoki ruxsatlarni o'zgartirish o'rniga yo'lni qatlamma-qatlam tekshiring.
Avval aynan qaysi muhit va joriy katalog ishlatilayotganini tasdiqlang:
So'ng har bir qismni tekshiring:
Agar yo'lda symbolic link bo'lsa:
Oxirida yo'l aslida qaysi mount ichida ekanini ko'ring:
Natijani talqin qilish:
nameiqatoridagi?: bu qism topilmadi yoki boshqa qidiruv xatosi yuz berdi.realpath -exato bersa: kamida bitta qism mavjud emas yoki uni aniqlab bo'lmaydi.readlinknisbiy maqsad qaytarsa: u link turgan katalogga nisbatan hisoblanadi.findmntkutilmagan fayl tizimini ko'rsatsa: oldingi katalogning mazmuni mount ostida yashirinib qolgan bo'lishi mumkin.
Bu ketma-ketlik taxmin bilan chmod -R ga qo'l urishdan ancha xavfsizroq: u avval yo'lning aynan qaysi qismi buzilganini topadi.
Keng tarqalgan xatolar
Nisbiy yo'lni noto'g'ri katalogdan ishlatish
config/app.ini faqat bitta, kutilgan joriy katalogdan to'g'ri ishlaydi. Avtomatlashtirishda yo ish katalogini aniq belgilang, yo absolyut yo'ldan foydalaning.
Har bir dastur ~ ni tushunadi deb o'ylash
~ — Bash kengaytmasi. YAML fayli, systemd unit’i yoki ilovaning o'z konfiguratsiya tahlilchisi uni avtomatik ravishda $HOME ga aylantirmasligi mumkin.
Yo'lni qo'shtirnoqsiz uzatish
Bo'sh joy va glob belgilari argumentni kutilmaganda bo'lib yuborishi yoki kengaytirib yuborishi mumkin. O'zgaruvchini "$path" ko'rinishida uzating va opsiyalar tugaganini -- bilan belgilang.
Fayl turini kengaytmasiga qarab aniqlash
backup.jpg arxiv yoki bajariladigan fayl bo'lishi mumkin. stat fayl tizimidagi obyektning haqiqiy turini ko'rsatadi, file esa mazmun formatini tekshiradi.
FIFO yoki qurilmani oddiy fayldek ochish
FIFO bloklanib qolishi mumkin, qurilmaga yozish esa ma’lumotlarni buzishi mumkin. Ularning o'rniga stat, file -h va shu ish uchun mo'ljallangan diagnostika vositasidan foydalaning.
Mashqlar
- Uy katalogingizdagi bitta mavjud faylga uch xil nisbiy yo'l yozing.
realpath -eyordamida uchalasi ham bitta obyektga olib borishini tasdiqlang. - Ikkita fayl yarating: birining nomida bo'sh joy bo'lsin, ikkinchisining nomi
-bilan boshlansin. Ikkalasinistat -- <path>bilan xavfsiz tekshiring, so'ng interaktiv rejimda o'chiring. - Vaqtinchalik katalogda oddiy fayl, katalog, symbolic link va FIFO yarating.
stat -c '%F %n'natijasinils -lning birinchi belgisi bilan solishtiring. /etc/mtabninamei -lx,readlinkvareadlink -fbilan tahlil qiling. Qaysi qismi symbolic link, qaysi qismi mount chegarasi ekanini qayd eting.find /var/log -xdev -type fyordamida/var/logostidagi faqat oddiy fayllarni toping. Ruxsat xatolarini yashirmang — ularni alohida ko'rib chiqing vasudoishlatishdan oldin u nega o'rinli yoki o'rinsiz bo'lishini tushuntiring.
Mashqni bajardim deyish uchun: chiqargan har bir xulosangiz uchun uni tasdiqlaydigan buyruq natijasidagi aniq belgini, stat maydonini yoki yo'l qismini ko'rsata olishingiz kerak.
Manbalar
- Linux man-pages:
path_resolution(7): https://man7.org/linux/man-pages/man7/path_resolution.7.html - GNU Bash Reference Manual: Tilde Expansion: https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html
- GNU Coreutils qo'llanmasi:
realpathinvocation: https://www.gnu.org/software/coreutils/manual/html_node/realpath-invocation.html - util-linux:
namei(1): https://man7.org/linux/man-pages/man1/namei.1.html file(1)qo'llanma sahifasi: https://man7.org/linux/man-pages/man1/file.1.html- Filesystem Hierarchy Standard 3.0: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html