Havolalar — ln, symlink va hard link

~10 daq · Linux · Fayl tizimi

Muammodan boshlaylik

Nginx da saytni yoqish uchun qo'llanmada shunday yozilgan:

sudo ln -s /etc/nginx/sites-available/dokon /etc/nginx/sites-enabled/

Bu nima? Faylni nusxalash emas, ko'chirish ham emas. Nima uchun shunday qilinadi?

Yoki: ilovaning yangi versiyasini deploy qildingiz (/opt/dokon/releases/v2), lekin barcha sozlamalar /opt/dokon/current ga ishora qiladi. Qanday qilib bir zumda versiyani almashtirish mumkin?

Javob — havolalar (links).


Symlink — ramziy havola

Symlink (symbolic link) — boshqa faylga yoki papkaga ishora qiluvchi maxsus fayl. Windows dagi "yorliq" (shortcut) ga o'xshaydi, lekin tizim darajasida ishlaydi — har qanday dastur uni haqiqiy fayl kabi ko'radi.

ln -s NISHON HAVOLA_NOMI
ln -s /home/otabek/loyihalar/dokon/config.json config.json
ls -l config.json
lrwxrwxrwx 1 otabek otabek 42 Nov  6 12:00 config.json -> /home/otabek/loyihalar/dokon/config.json
  • Birinchi belgi l — havola
  • -> — qayerga ishora qilishi

Endi cat config.json, muharrirda ochish, o'zgartirish — hammasi asl faylga ta'sir qiladi.

[!TIP] Tartibni eslab qolish: ln -s — xuddi cp kabi: avval mavjud narsa, keyin yangi nom. cp manba nusxa → ln -s manba havola.

Papkaga symlink

ln -s /var/www/dokon/public ~/sayt
cd ~/sayt          # aslida /var/www/dokon/public da

Havolani o'chirish

rm config.json         # faqat havola o'chadi, asl fayl joyida
unlink config.json     # xuddi shu

[!WARNING] Papkaga havolani o'chirishda oxiriga / qo'ymang: rm sayt — havola o'chadi. rm -r sayt/ — asl papka ichidagilarni o'chirishi mumkin!

Yo'qolgan havola

Asl fayl o'chirilsa yoki ko'chirilsa — havola "osilib" qoladi (broken link):

cat config.json
cat: config.json: No such file or directory

ls -l da odatda qizil rangda ko'rinadi. Topish:

find . -xtype l

Mavjud havolani almashtirish

ln -sfn /opt/dokon/releases/v2 /opt/dokon/current
  • -f — mavjud havolani almashtirish
  • -n — agar havola papkaga ishora qilsa, uning ichiga emas, havolaning o'zini almashtirish

Amaliy foydalanish

1. Nginx: sites-available / sites-enabled

/etc/nginx/sites-available/      ← barcha sayt sozlamalari
    dokon
    blog
    eski-sayt
/etc/nginx/sites-enabled/        ← faqat yoqilganlari (havolalar)
    dokon -> ../sites-available/dokon
    blog  -> ../sites-available/blog
sudo ln -s /etc/nginx/sites-available/dokon /etc/nginx/sites-enabled/    # yoqish
sudo rm /etc/nginx/sites-enabled/eski-sayt                              # o'chirish

Sozlama fayli o'chirilmaydi — faqat "yoqilgan" ro'yxatdan chiqadi. Qayta yoqish — bitta ln -s. (43-dars)

2. Versiyalarni almashtirish (atomik deploy)

/opt/dokon/
├── releases/
│   ├── v1/
│   ├── v2/
│   └── v3/
└── current -> releases/v3

Ilova va Nginx /opt/dokon/current bilan ishlaydi. Yangi versiya:

ln -sfn /opt/dokon/releases/v4 /opt/dokon/current

Orqaga qaytish — v3 ga havola. Bir zumda, fayllarni nusxalamasdan.

3. Dotfiles

Sozlama fayllaringizni (.bashrc, .gitconfig) Git repo da saqlab, uy papkaga havola qilish:

ln -s ~/dotfiles/.bashrc ~/.bashrc

4. Dastur versiyalari

ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 10 ... /usr/bin/python3 -> python3.12

python3 — aniq versiyaga havola. Tizimning o'zi ham shu usulni ko'p ishlatadi: /bin -> usr/bin.


Nisbiy va absolyut havola

ln -s /etc/nginx/sites-available/dokon /etc/nginx/sites-enabled/dokon   # absolyut
cd /etc/nginx/sites-enabled && ln -s ../sites-available/dokon dokon   # nisbiy

Nisbiy havola — havolaning o'zi turgan joydan hisoblanadi (joriy papkadan emas!). Papkalar birgalikda ko'chirilsa, nisbiy havola ishlashda davom etadi; absolyut — yo'q.


Hard link — qattiq havola

Symlink — "manzil yozilgan qog'oz". Hard link — xuddi shu ma'lumotga ikkinchi nom:

ln asl.txt ikkinchi-nom.txt         # -s siz
ls -li asl.txt ikkinchi-nom.txt
1835012 -rw-r--r-- 2 otabek otabek 120 Nov  6 12:00 asl.txt
1835012 -rw-r--r-- 2 otabek otabek 120 Nov  6 12:00 ikkinchi-nom.txt
  • Birinchi ustun — inode raqami: ikkalasida bir xil — bu bitta fayl
  • 2 — shu ma'lumotga ishora qiluvchi nomlar soni

Asl nomni o'chirsangiz — ma'lumot saqlanib qoladi (oxirgi nom o'chirilgandagina yo'qoladi).

Symlink (-s) Hard link
Papkaga ✅ ❌
Boshqa diskka ✅ ❌
Asl o'chirilsa Buziladi Ishlaydi
ls -l da ko'rinadi -> bilan Oddiy fayldek
Amalda 99% holatlarda Kamdan-kam (zaxira vositalari)

Kundalik ishda — deyarli doim symlink.


Nima uchun shunday?

Nima uchun havola — nusxa olishdan yaxshiroq?

Chunki nusxa — ikki mustaqil fayl: birini o'zgartirsangiz, ikkinchisi eskiradi va ular asta-sekin farqlanib ketadi. Havola — bitta haqiqat manbai: o'zgarish bir joyda, ko'rinish hamma joyda. Bundan tashqari, havolani almashtirish atomik — bir lahzada: Nginx yoki ilova hech qachon "yarim nusxalangan" holatni ko'rmaydi. Shuning uchun deploy vositalari (Capistrano, Deployer) aynan current -> releases/vN sxemasidan foydalanadi.


Xulosa

Eslab qoling:

  • ln -s NISHON HAVOLA — symlink; tartib cp kabi
  • ls -l da l va ->; buzilganlarni topish: find -xtype l
  • Havolani o'chirish: rm havola (oxirida / siz!)
  • ln -sfn — mavjud havolani almashtirish
  • Nginx sites-enabled, current -> releases/vN, dotfiles — tipik foydalanish
  • Nisbiy havola — havola joyidan hisoblanadi
  • Hard link — bitta inode ga ikkinchi nom; kamdan-kam kerak

Keyingi dars

11-dars: Mashqlar — fayl tizimi bilan ishlash