Normal bir kullanıcı neden bir btrfs alt birimini silemez?


12

Döngü monteli kullanıcı tarafından oluşturulan btrfs dosya sistemi kullanılarak, izinler doğru ayarlandığında, kullanıcı serbestçe btrfs alt birimleri oluşturabilir:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub create newsubvol
Create subvolume './newsubvol'

Ancak, yeni oluşturulan alt birimi silmeye çalışmak hatayla sonuçlanır:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'
ERROR: cannot delete '/home/user/btrfs/fs/snapshots/newsubvol'

Kök kullanıcı, elbette, silebilir:

root@machine:/home/user/btrfs/fs/snapshots# /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'

Oluşturma ve silme işlemleri arasındaki bu davranış farkı biraz garip görünüyor. Birisi buna ışık tutabilir mi?

İşte komutların tam sırası:

user@machine:~$ dd if=/dev/zero of=btrfs_disk bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.2345 s, 84.9 MB/s
user@machine:~$ mkdir mountpoint
user@machine:~$ /sbin/mkfs.btrfs btrfs_disk

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

SMALL VOLUME: forcing mixed metadata/data groups
Created a data/metadata chunk of size 8388608
fs created label (null) on btrfs_disk
    nodesize 4096 leafsize 4096 sectorsize 4096 size 100.00MB
Btrfs Btrfs v0.19
user@machine:~$ sudo mount btrfs_disk mountpoint/
user@machine:~$ cd mountpoint/
user@machine:~/mountpoint$ /sbin/btrfs sub create test
Create subvolume './test'
user@machine:~/mountpoint$ /sbin/btrfs sub delete test
Delete subvolume '/home/user/mountpoint/test'
ERROR: cannot delete '/home/user/mountpoint/test' - Operation not permitted

İşte izinler:

user@machine:~/mountpoint$ ls -la
total 4
drwxr-xr-x 1 user user    8 Set  4 09:30 .
drwx------ 1 user user 4486 Set  4 09:29 ..
drwx------ 1 user user    0 Set  4 09:38 test

Ve ilgili hat df -T:

Filesystem              Type     1K-blocks      Used Available Use% Mounted on
/dev/loop0              btrfs       102400        32     98284   1% /home/user/mountpoint

Dağıtım bir Debian Wheezy, 3.2.0-4-686-paeçekirdek, v0.19btrfs-aletleridir. Durum hala Ubuntu Saucy, 3.11.0-4-genericçekirdek, v0.20-rc1btrfs-tools'da meydana geliyor.


Anladığım kadarıyla, bu dosya sistemi türü hala deneysel ve üretime hazır değil.
mdpc

Eğer çıktısını ekleyebilir df -Tve btrfs version? Aynı denediğimde şu hatayı aldım "HATA: alt hacim oluşturulamıyor - İzin reddedildi"
bsd

@mdpc Bu doğru olsa da, btrfs birkaç yıldır var ve bu aşamada bir miktar istikrarlı olması bekleniyor. Bu noktada bunun bir hata mı yoksa 'özellik' mi olduğunu anlamak yararlı olabilir.
goncalopp

@bdowning Komutlar, df ve kullandığım sürümlerin tam sırasını ekledim.
goncalopp

3.2 çekirdek artık bir buçuk yıldan daha eski. Deneysel dosya sistemleri ile oynamak istiyorsanız, daha güncel bir çekirdek çalıştırmak isteyebilirsiniz.
psusi

Yanıtlar:


14

Bu benim için bir öğrenme deneyimiydi ama sonunda anladım. İşlemimi burada açıklayacağım, böylece bu şeyleri kendi başınıza nasıl çözeceğinizi bilmek daha kolay (BTRFS belgeleri, bildiğiniz gibi, şu an için nispeten eksik).

İlk başta, alt hacim oluşturmanın, ioctlherhangi bir yetenek kontrolü yapmayan bir işleyici ile olduğunu düşündüm (bazı mantık olup olmadığına bağlı olarak bir güvenlik sorunu olabilir veya olmayabilir), silme işlemi meta verileri doğrudan değiştiriyordu (ve dolayısıyla kullanıcının CAP_SYS_RAWIOdüzgün çalışması gerekebilir ).

Doğrulamak için btrfs-utilskaynak kodunu açtım ve bulduğum şey bu:

Create subvolume, cmds-receive.c Line 180:
         ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);

Delete subvolume, cmds-subvolume.c Line 259:
         res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);

Eh, bu yararlı değil, her ikisi de ioctl's (ilginç yan not: "anlık görüntü" genellikle kaynak kodunda "alt hacim" ile bir nedenle kullanılır). Böylece çekirdek kaynak koduna gittim ve her iki işleyiciyi de buldum fs/btrfs/ioctl.c.

Sonunda, btrfs_ioctl_snap_destroy()2116 satırına geri döndüm :

     if (!capable(CAP_SYS_ADMIN)){

Özellikle bunlar, bu bir çek yok yeteneğine sahip ama onlar buna sahip yaparsanız, mantık düz işlemi gerçekleştiren atlar. İf ifadesinin gövdesi, alt hacmin inode'unun sahibi olan normal kullanıcı olup olmadığını ve USER_SUBVOL_RM_ALLOWEDBTRFS seçeneğinin etkin olup olmadığını kontrol eder ve işleyiciyi yürütmeye devam eder. İkisi de yoksa ioctl işleyicisi hata ile çıkar.

Dolayısıyla, bir "anlık görüntüyü" (diğer bir deyişle "alt hacim") yok etmek gibi görünüyor, genellikle CAP_SYS_ADMIN(veya USER_SUBVOL_RM_ALLOWEDetkinleştirilmesi gereken bir kullanıcı gerekir ve kullanıcı verilen alt hacme "sahiptir"). Harika, anlık görüntü / hacim oluşturmaya ne dersiniz?

İoctl işleyicisi, btrfs_ioctl_snap_create()bu işleyicinin capable()doğrudan veya dolaylı çağrı içermediği anlaşılıyor . Erişimin aracılı olmasının ana yolu bu olduğundan, alt hacim oluşturma işleminin her zaman başarılı olduğu anlamına gelir . Bu, işlevsel bir seviyede, gördüklerinizi neden gördüğünüzü açıklar.

Ben konuşamıyor neden bu kısıtlı kullanıcı erişimi olan bir sunucu ile btrfs ana kullanım durumunda varlığın arzu dışında kabul edilir. Bu yeterli değil ama aslında işlemi durdurmak için herhangi bir kod görmüyorum. Bunun nedeninin cevabını bulamıyorsanız (ve sahip olmayı önemsiyorsanız), çekirdek posta listesinde sormanız gerekebilir.

Sonuç

Araştırmam, herhangi birinin alt hacimler oluşturabildiğini gösteriyor, ancak bir alt hacmi silmek için ya sahip olmanız gerekiyor CAP_SYS_ADMINya da hem arayan kullanıcının alt hacim inode sahibi hem de USER_SUBVOL_RM_ALLOWEDetkin olması gerekiyor.

Alt hacim oluşturma mantıklı değil, bu yüzden muhtemelen bir sistemi DoS için kolay bir yol gibi göründüğünden, işlemin reddedildiği dolaylı bir yolu kaçırıyorum.

Not: Bu işlevselliği doğrulayabildiğim bir yerde değilim ama eve döndüğümde setcapsihrin nasıl işlediğini ayarlayabilirim .


Mantıklı bir şekilde (DoS endişenizle ilgili olarak) rmdirboş alt hacimlerde izin verilip verilmediğidir. Sonra rm -rşeffaf bir şekilde çalışacaktır. Ne yazık ki kod henüz geliştirilmedi (henüz). Birisi 2010'da üç deneme yaptı ve sonra vazgeçti :(. Spinics.net/lists/linux-btrfs/msg06499.html
sourcejedi

5

Bir alt hacmin silinmesi, birinin sahip olmadığı dosyaların bağlantısını kaldırmasına izin verir. Bence, ayrıcalıklı bir kullanıcının daha az ayrıcalıklı bir kullanıcı tarafından seçilen bir yerde yazdığı dosyalar adil bir oyundur, ancak kök olmayan silme işlevine katkıda bulunan kişi muhtemelen bu anlambilimin ne kadar güvenli olduğu ve içerik olduğu konusunda yeterince emin değildi yeni bir bağlama seçeneği ( mount -o user_subvol_rm_allowed) olarak göndermek için .


1
Şaşırtıcı bir şekilde UNIX®'te sahip olmadığınız bir dosyanın bağlantısını kolayca kaldırabilirsiniz - sadece dizininde yazma iznine sahip olmanız gerekir.
poige

Ben fedora 20 aynı sorunu var, ben bir alt hacimde / ev var, ben kullanıcı kök kullanıyorum, ama her neyse, ben / home silemezsiniz
c4f4t0r

poige, söz konusu dosya sahip olmadığınız bir klasördeyse, bağlantısını kaldıramazsınız ve içinde hala bir şeyler bulunduğundan klasörün kendisinin bağlantısını kaldıramazsınız. Bu klasörde yalnızca taşımak veya yeniden adlandırmak gibi tahribatsız işlemler yapabilirsiniz.
sleblanc

-1

"/ Home silinemiyor" (@home).

/ Home ile değiştirmek için / home_snapshot_yymmdd anlık görüntüsü oluşturmadığınız sürece, / home / hesabınızın bulunduğu alt birimi neden silmek istersiniz?

Ben btrfs kullanmak için yeniyim ama bu öğrendim: @ / ve @home (/ ve / home) dosya sistemi olarak HD üzerine yüklendiğinde btrfs tarafından oluşturulur. Önceki bir enstantaneden / evden bir geri yükleme yapmadıkça, anladığım kadarıyla, dizlerinin üstünde kendini keseceksin.

Ancak, / home açık olan cihazı AS ROOT, mount / dev / sa / mnt / (veya çalışan btrfs sisteminizi hangi cihazda çalıştırdığınızı) kullanarak monte edebilirsiniz. Sonra cd / mnt / 'ye @ev. Daha sonra @home_snapshot_yymmdd (ya da ona ne ad verdiğiniz) @home konumuna taşımak için mv komutunu kullanabilirsiniz. @Home boyutuna bağlı olarak hareket saatler sürebilir. Ardından CD'yi kendi hesabınıza geri döndürün ve sudo umount / mnt / Sisteminizi gerçekten kapatıp kapatmadınız. Bu btrfs güzelliği.


Öyle görünüyorlar. Siz söylemediğiniz sürece Btrfs @ ve @home yapmaz (ya da Ubuntu gibi dağıtımınız bunu sizin için yapar).
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.