Làm cho chỉ đọc / vv có thể viết


11

Tôi đang làm việc với một thiết bị nhúng chạy Linux. Các nhà sản xuất của thiết bị này đã thiết lập nó để nó tải hệ thống tập tin gốc dưới dạng chỉ đọc.

Từ / etc / mtab:

rootfs / rootfs rw 0 0
/dev/root / squashfs ro,relatime 0 0

Điều này có nghĩa là tôi không thể sửa đổi bất kỳ tệp nào trong / etc, chẳng hạn như để thêm người dùng mới.

Tôi đã thử truy cập thư mục gốc:

mount -o remount,rw -t squashfs /dev/root /

nhưng tôi chỉ nhận được một lỗi

mount: cannot remount block device /dev/root read-write, is write-protected

Tôi đã tìm kiếm lỗi này và mọi người đang nói sử dụng blockdev. Hệ thống không được cài đặt blockdev, vì vậy tôi đã biên dịch nó và sao chép nó. Sau đó tôi chạy

blockdev --setrw rootfs

nhưng một lần nữa tôi gặp lỗi:

blockdev: cannot open rootfs: No such file or directory

Có thể thực hiện / vv có thể ghi nếu nó chưa? Tôi có quyền truy cập root vào hệ thống, nhưng tôi không thể truy cập hệ thống tập tin 'ngoại tuyến', tất cả các thay đổi phải được thực hiện thông qua các lệnh Bash.

Câu trả lời:


19

squashfslà một hệ thống tập tin nén chỉ đọc. Nó không có điều khoản để sửa đổi nó một khi nó được tạo ra. Vì vậy, bạn không thể viết thư cho nó ngay cả khi thiết bị khối bên dưới có thể được ghi. Bạn cần tạo một hình ảnh squashfs mới của toàn bộ hệ thống tệp với các sửa đổi của bạn và ghi nó vào thiết bị lưu trữ nơi hệ thống tệp đó được lưu trữ, điều này sẽ gây ra vấn đề từ hệ thống trực tiếp.

Một tùy chọn khác là gắn kết một hệ thống tập tin khác /etc. Nó có thể thông qua ngàm kết hợp nếu được hỗ trợ bởi kernel, kết hợp hai hệ thống tệp với nhau thông thường với một hệ thống tệp chỉ ghi lại các thay đổi đối với hệ thống tệp chỉ đọc cơ sở .

Kiểm tra hỗ trợ cho AUFS_FS hoặc OVERLAY_FS trong cấu hình kernel.

Chẳng hạn, để hợp nhất một thư mục trong /tmp(hy vọng có thể ghi được mặc dù có thể có tmpfstrong bộ nhớ (vì vậy không liên tục khởi động lại) trong trường hợp của bạn nếu hệ thống không có bộ nhớ có thể ghi vĩnh viễn)

mkdir -p /tmp/etc/work /tmp/etc/upper
mount -t overlay \
      -o lowerdir=/etc,upperdir=/tmp/etc/upper,workdir=/tmp/etc/work \
       overlay /etc

Sau đó /etcsẽ được ghi lại và sửa đổi bạn thực hiện cho nó sẽ thực sự được lưu trữ trong /tmp/etc/upper.

Ngoài ra, nếu đó chỉ là một vài tệp bạn muốn sửa đổi, bạn có thể gắn kết chúng (có, bạn có thể gắn vào bất kỳ tệp nào, không chỉ thư mục) từ một phiên bản được lưu trữ trong hệ thống tệp có thể ghi:

cp /etc/passwd /tmp
mount --bind /tmp/passwd /etc/passwd

Sau đó /etc/passwdsẽ được viết. Tất nhiên bạn cũng có thể làm điều đó cho toàn bộ /etcthay thế. ( cp -a /etc /tmp && mount --bind /tmp/etc /etc).


Một số hệ thống nhúng có thể ghi đè tệp vào /etclúc khởi động dựa trên cài đặt nhất định trong nvram. Do đó, để thay đổi một tệp trong /etcbạn sẽ đặt biến hệ thống "ma thuật", hãy cam kết nó với nvram, sau đó tải lại cấu hình hoặc khởi động lại. Phần lớn các bộ định tuyến gia đình làm việc như vậy. Nhưng các cơ chế và lệnh chính xác là dành riêng cho hệ thống.
Satō Katsura

Hoàn hảo! Thiết bị không hỗ trợ các lớp phủ, nhưng ràng buộc các tệp tùy chỉnh trên các tệp trong / etc hoạt động rất tốt! Cảm ơn bạn đã giúp đỡ.
Joshua Walsh
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.