Ana Sayfa
EN

İzleme

İndeksin nasıl güncel kaldığı: inotify'ın neden kullanılmadığı, fanotify'ın neden bir kez root istediği, ve işaret olmadan ne olduğu.

Bir arama aracının indeksi, ancak dosya sistemiyle aynı anda değişirse doğrudur. Linux’ta bunu duymanın iki yolu vardır; Scour yalnız birini kullanır ve neden diğerini kullanmadığı küçük bir ayrıntı değildir.

inotify — neden değil

inotify her dizin için ayrı bir izin ister. Bir örnek: geliştirme yapılan bir makinede 609.322 klasör vardı; çekirdeğin oturum başına verdiği izin sayısı 524.288. Yani o makine inotify ile izlenemezdi — Scour bütün bütçeyi tek başına yutsa bile yetmiyordu.

Üstelik bu bütçe paylaşımlıdır. Editörünüz, IDE’niz, dosya yöneticiniz ve her npm run dev aynı havuzdan alır. Bir program havuzu tüketirse hata onda değil, sıradaki programda çıkar — ve o hata asla “izin kalmadı” demez. Her izin yaklaşık bir kilobayt takas edilemez çekirdek belleği tutar.

Bu yüzden Scour’da inotify yok — yedek yol olarak bile. Bir sürüm boyunca yedek olarak durdu ve tam bu şekilde bir makinenin geliştirme aracını açamaz hâle getirdi. Başkasının programını bozmak onun işi değildir.

fanotify — birim başına bir işaret

fanotify dizinleri değil, dosya sisteminin kendisini işaretler. İki birim izleniyorsa iki işaret; klasör sayısının hiçbir önemi yoktur. Bir milyon klasör de olsa iki işaret.

Ölçülen boşta maliyeti, iki disk birden izlenirken ve kimse bakmazken bir çekirdeğin %0,8’i. Bir yüz açıkken indeks her saniye, kimse bakmazken on beş saniyede bir yazar; değişikliğin görünür olma gecikmesi bundan gelir, izleyiciden değil.

Neden bir kez root

Bir dosya sisteminin tamamını dinlemek, tanımı gereği kendi dosyalarınızın dışını da görmek demektir. Çekirdek bunu CAP_SYS_ADMIN arkasına koymuş — makul bir yer.

Scour bu yetkiyi almaz. Bir an için ödünç alır ve geri verir:

scour-watch, hiçbir Scour bileşenine bağlı olmayan ve tek işi bu olan ayrı bir programdır. Sırasıyla: fanotify tanıtıcısını açar, işaretleri koyar, çözer, yetkiyi düşürür ve scourd’u çalıştırır. Servis hayatının geri kalanını yetkisiz geçirir.

Devir ölçüldü, varsayılmadı: teslim alınan süreç CapEff=0 ile döner ve iki ayrı yetki yükseltme denemesi de EPERM verir. scour-watch hiçbir şey kurmaz — setcap yok, kalıcı bağlama yok, kendi servisi yok.

Neden parolasız sudo kuralı değil

İnsanların bunun yerine sarıldığı çözüm, sudoers içinde parolasız bir kuraldır. Burada bu daha kötüdür: zincirdeki her ikili kullanıcının ev dizinindedir, dolayısıyla onlardan birini gösteren parolasız bir kural, o dizine yazabilen her şey için parolasız root demektir — yani kullanıcının kendi hesabı için.

Sistem birimi bunun yerine, yetkiyi yalnızca açılışta ve yalnızca scour-watch için verir.

Kurulum

systemctl --user disable --now scourd.service   # kullanıcı birimi açıksa
sudo bash packaging/install-service.sh           # [--user AD] [KÖK...]
systemctl start scour.service

Kurucu yardımcıyı root’a ait /usr/local/libexec/scour altına koyar, sistem birimini ve polkit kuralını sizin hesabınıza göre yazar; kullanıcı sudo’yu çalıştırandan, izlenecek kökler argümanlardan (varsayılan /home). İlk satır atlanmamalı. İki servis aynı anda çalışırsa ikisi de indeksin kilidi için yarışır; kaybeden “indeks meşgul” diyerek çıkar ve systemd onu tekrar tekrar başlatır.

Dosyayı çalıştırmadan önce okuyun: içinde yetkinin ne için alındığı ve nerede bırakıldığı yazıyor.

Kurmazsanız

Scour yine çalışır — ama inotify’a düşmez, o yol yok. Birimin yazma sayacı kıpırdayınca yürüyerek eşitler: hiçbir şey kaçmaz, değişiklikler anında değil biraz sonra görünür. Küçük bir ev dizininde aradaki farkı fark etmezsiniz. Sayacı olmayan ağ ve FUSE bağları ise bir kez yürünür ve bir daha eşitlenmez; onlar için işaret şarttır.

Durumu görmek için:

scour status

izlenen satırı kaç kaynağın canlı izlendiğini söyler.