Havolalar — ln, symlink va hard link
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— xuddicpkabi: 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; tartibcpkabils -ldalva->; 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