thiết bị lặp trong bộ chứa Linux?


14

Tôi đang cố gắng sử dụng một thiết bị lặp bên trong một thùng chứa, để gắn một số tệp hình ảnh:

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 thực sự không tồn tại, và

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

Làm thế nào tôi có thể làm cho công việc này? Liệu container có cần một số quyền cgroup mà nó có thể không có?

Câu trả lời:


17

Nếu bạn đang sử dụng systemd-nspawn, hãy khởi động container của bạn bằng công --capability=CAP_MKNODtắc dòng lệnh. Điều này sẽ cho phép bạn tạo các nút thiết bị bên trong thùng chứa của bạn. Sau đó tạo một thiết bị lặp như thế này:

# mknod /dev/loop0 b 7 0

Hãy nhớ rằng thiết bị lặp này được chia sẻ với máy chủ và cũng được gọi /dev/loop0ở đó. Và bây giờ có thể truy cập các thiết bị máy chủ nếu bạn biết các số chính và số phụ. Cũng có thể có những hậu quả khác mà tôi chưa từng nghĩ tới. Được cảnh báo.


Bất cứ ai có thể xác nhận rằng --capability=CAP_MKNODvẫn còn hoạt động? Đối với tôi nó dường như không có hiệu lực thi hành, tôi nhận được Operation not permittedngay cả với nó, và do đó, làm thành viên nàythành viên này .
nh2

2
Bây giờ tôi đã có nó để làm việc, nhưng ngoài việc cho --capability=CAP_MKNODtôi, tôi phải thiết lập DeviceAllow=block-loop rwmtrong đơn vị systemd-nspawn để làm cho nó hoạt động (có ý tưởng đó từ đây ).
nh2

Tôi đã phải thêm --device-cgroup-rule="b 7:* rmw"vào để docker runcho phép truy cập đầy đủ vào các thiết bị loopback (nhưng không có cái nào khác, vì không có --privilege). Tìm thấy qua docs.docker.com/edge/engine/reference/commandline/create/ và thử nghiệm trên docker 18,06.1-ce (tài liệu tuyên bố chỉ áp dụng cho Docker Edge)
RobM

9

Các thiết bị lặp được cung cấp bởi một mô-đun hạt nhân. Do đó, bạn cần đặc quyền để truy cập chúng. Bạn cũng cần hiển thị chúng vào thùng chứa của mình hoặc bạn cần tự tạo các tệp thiết bị.

Câu trả lời nhanh

docker run --privileged=true ...

Một sự thay thế

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

Điều này gần như hoạt động

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

Tuy nhiên tôi nhận được lỗi này:

root@5c033d5f8625:/# sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only

Xem liên kết này để biết thêm thông tin .


Một ghi chú trên trang mand systemd-nspawn:

systemd-nspawn giới hạn quyền truy cập vào các giao diện kernel khác nhau trong vùng chứa ở chế độ chỉ đọc, chẳng hạn như / sys, / Proc / sys hoặc / sys / fs / selinux. Giao diện mạng và đồng hồ hệ thống có thể không được thay đổi từ bên trong container. Các nút thiết bị có thể không được tạo. Hệ thống máy chủ không thể được khởi động lại và các mô-đun hạt nhân có thể không được tải từ bên trong container.

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.