Tại sao người dùng thông thường không thể xóa một subvolume btrfs


12

Sử dụng hệ thống tập tin btrfs do người dùng gắn kết vòng lặp, với các quyền được đặt chính xác, người dùng có thể tự do tạo các tệp con btrfs:

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

Tuy nhiên, cố gắng xóa các subvolume mới được tạo ra gây ra lỗi:

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'

Người dùng root, tất nhiên, có thể xóa nó:

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

Sự khác biệt trong hành vi giữa các hoạt động tạo và xóa này có vẻ hơi lạ. Bất cứ ai có thể làm sáng tỏ về điều này?

Đây là chuỗi lệnh chính xác:

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

Dưới đây là các quyền:

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

Và dòng liên quan trên df -T:

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

Bản phân phối là Debian Wheezy, 3.2.0-4-686-paekernel, v0.19btrfs-tools. Tình trạng này vẫn xảy ra trên Ubuntu Saucy, 3.11.0-4-generickernel, v0.20-rc1btrfs-tools.


Theo hiểu biết của tôi, loại hệ thống tập tin này vẫn còn thử nghiệm và chưa sẵn sàng sản xuất.
mdpc

Bạn có thể thêm đầu ra của df -Tbtrfs version? Khi tôi thử tương tự, tôi đã gặp lỗi sau "LRI: không thể tạo subvolume - Quyền bị từ chối"
bsd

@mdpc Trong khi đó là sự thật, btrfs đã xuất hiện được một vài năm và dự kiến ​​sẽ ổn định ở giai đoạn này. Tại thời điểm này có thể vẫn hữu ích nếu đây là lỗi hoặc 'tính năng'.
goncalopp

@bdowning Tôi đã thêm chuỗi lệnh chính xác, df và các phiên bản tôi đã sử dụng.
goncalopp

Hạt nhân 3.2 hiện đã được hơn một năm rưỡi. Nếu bạn muốn chơi với các hệ thống tập tin thử nghiệm, bạn có thể muốn chạy kernel cập nhật hơn.
psusi

Câu trả lời:


14

Vâng, đây là một kinh nghiệm học tập cho tôi nhưng cuối cùng tôi đã tìm ra nó. Tôi sẽ giải thích quy trình của tôi ở đây để dễ dàng biết cách tự mình tìm ra công cụ này (tài liệu BTRFS, như tôi chắc chắn rằng bạn đã phát hiện ra, tương đối chưa hoàn chỉnh trong thời điểm hiện tại).

Lúc đầu, tôi nghĩ rằng việc tạo ra subvolume là ioctlmột trình xử lý không thực hiện bất kỳ kiểm tra khả năng nào (có thể có hoặc không có vấn đề bảo mật tùy thuộc vào việc có logic nào không) trong khi xóa nó đang sửa đổi siêu dữ liệu trực tiếp (và do đó người dùng có thể yêu cầu CAP_SYS_RAWIOlàm việc đúng cách).

Để xác minh, tôi đã mở btrfs-utilsmã nguồn và đây là những gì tôi tìm thấy:

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);

Chà, điều đó không hữu ích, cả hai đều là ioctl (lưu ý phụ thú vị: "ảnh chụp nhanh" thường được sử dụng thay thế cho nhau trong mã nguồn với "subvolume" vì một số lý do). Vì vậy, tôi đã đi đến mã nguồn kernel và tìm thấy cả hai trình xử lý fs/btrfs/ioctl.c.

Cuối cùng, tôi truy tìm nó trở lại btrfs_ioctl_snap_destroy()và trên dòng 2116:

     if (!capable(CAP_SYS_ADMIN)){

Cụ thể, đây là một kiểm tra nếu họ không có khả năng nhưng nếu họ có nó, logic sẽ bỏ qua để thực hiện thao tác. Phần thân của câu lệnh if kiểm tra xem liệu người dùng thông thường có phải là chủ sở hữu của nút con của subvolume hay không và USER_SUBVOL_RM_ALLOWEDtùy chọn BTRFS có cho phép nó tiếp tục thực thi trình xử lý hay không. Nếu họ không có trình xử lý ioctl thoát có lỗi.

Vì vậy, có vẻ như phá hủy một "ảnh chụp nhanh" (còn gọi là "subvolume") thường yêu cầu người dùng có CAP_SYS_ADMIN(hoặc USER_SUBVOL_RM_ALLOWEDđể được bật và người dùng "sở hữu" subvolume đã cho). Tuyệt vời, những gì về việc tạo một ảnh chụp / âm lượng?

Trình xử lý cho ioctl dường như là btrfs_ioctl_snap_create()trình xử lý này dường như không chứa lệnh gọi capable()trực tiếp hoặc gián tiếp. Vì đó là cách truy cập chính được môi giới nên tôi lấy điều này có nghĩa là việc tạo ra subvolume luôn thành công. Điều này giải thích ở cấp độ chức năng tại sao bạn nhìn thấy những gì bạn đang thấy.

Tôi không thể nói lý do tại sao điều này được coi là mong muốn ngoài trường hợp sử dụng chính của BTRFS là với một máy chủ có quyền truy cập hạn chế của người dùng. Điều đó là không đủ nhưng tôi không thấy bất kỳ mã nào để thực sự dừng hoạt động. Nếu bạn không thể tìm thấy câu trả lời cho lý do tại sao (và bạn quan tâm để có nó), bạn có thể phải hỏi trong danh sách gửi thư kernel.

Phần kết luận

Nghiên cứu của tôi dường như chỉ ra rằng bất kỳ ai cũng có thể tạo ra các subvolume nhưng để xóa một subvolume bạn cần phải có CAP_SYS_ADMINhoặc nó cần đúng cả người dùng gọi là chủ sở hữu của subvolume inode và USER_SUBVOL_RM_ALLOWEDđược kích hoạt.

Việc tạo subvolume không có ý nghĩa vì vậy tôi có thể thiếu một số cách gián tiếp rằng hoạt động bị từ chối vì đó có vẻ là một cách dễ dàng để làm hệ thống.

Lưu ý: Tôi không ở nơi tôi có thể xác minh chức năng này nhưng một khi tôi về nhà, tôi có thể đặt nếu setcapphép thuật hoạt động như thế nào điều này dự đoán.


Cách nó có ý nghĩa (liên quan đến mối quan tâm DoS của bạn) là nếu rmdirđược phép trên các subvolume trống. Sau đó rm -rsẽ làm việc minh bạch. Thật không may, mã chỉ đơn giản là không được phát triển (chưa). Có vẻ như ai đó đã thực hiện ba lần thử trong năm 2010 và sau đó đã từ bỏ :(. Spinics.net/lists/linux-btrfs/msg06499.html
sourcejedi

5

Xóa một subvolume cho phép ai đó hủy liên kết các tệp mà họ không sở hữu. Theo tôi, các tệp mà người dùng đặc quyền ghi ở vị trí được chọn bởi người dùng ít đặc quyền hơn là trò chơi công bằng, nhưng người đóng góp chức năng xóa không root có thể không cảm thấy đủ tự tin về mức độ an toàn của ngữ nghĩa và nội dung để gửi chúng dưới dạng tùy chọn gắn kết mới ( mount -o user_subvol_rm_allowed).


1
Thật ngạc nhiên, trong UNIX®, bạn có thể dễ dàng hủy liên kết một tệp mà bạn không sở hữu - bạn chỉ cần có quyền ghi trong thư mục của nó.
poige

Tôi có cùng một vấn đề trên fedora 20, tôi có / nhà ở một subvolume, tôi đang sử dụng root người dùng, nhưng dù sao đi nữa, tôi không thể xóa / home
c4f4t0r

poige, nếu tập tin nghi vấn nằm trong một thư mục mà bạn không sở hữu, bạn không thể hủy liên kết nó và bạn không thể hủy liên kết chính thư mục đó vì nó vẫn chứa những thứ trong đó. Bạn chỉ có thể thực hiện các thao tác không phá hủy trên thư mục này, như di chuyển nó hoặc đổi tên nó.
sleblanc

-1

"Không thể xóa / nhà" (đó là @home).

Tại sao bạn muốn xóa subvolume mà / home / tài khoản của bạn cư trú, trừ khi bạn đã tạo ảnh chụp nhanh / home_snapshot_yymmdd để thay thế / home bằng?

Tôi mới sử dụng btrfs nhưng đây là những gì tôi đã tìm ra: @ / và @home (/ và / home) được tạo bởi btrfs khi nó được cài đặt trên HD của bạn dưới dạng hệ thống tệp. Trừ khi bạn đang thực hiện khôi phục / nhà từ ảnh chụp nhanh trước đó, như tôi hiểu, bạn sẽ tự cắt đứt đầu gối của mình.

Tuy nhiên, bạn có thể gắn thiết bị / nhà đang bật, NHƯ ROOT, sử dụng mount / dev / sa / mnt / (hoặc thiết bị nào đã chạy hệ thống btrfs của bạn) Sau đó cd đến / mnt / và từ đó phát lệnh xóa @Trang Chủ. Sau đó, bạn có thể sử dụng lệnh mv để di chuyển @home_snapshot_yymmdd (hoặc những gì bạn đã đặt tên cho nó) sang @home. Việc di chuyển có thể mất nhiều giờ, tùy thuộc vào kích thước của @home. Sau đó, CD quay lại tài khoản của bạn và phát hành sudo umount / mnt / Bạn chưa bao giờ thực sự đăng xuất hoặc tắt hệ thống của mình. Đó là một vẻ đẹp của btrfs.


Có vẻ như họ đã làm như vậy. Btrfs không tạo ra @ và @home trừ khi bạn bảo họ (hoặc bản phân phối của bạn như Ubuntu làm điều đó cho bạn).
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.