Là sử dụng một hệ thống tập tin gốc chỉ đọc là một ý tưởng tốt cho thiết lập nhúng?


15

Tôi đã được giao nhiệm vụ chạy Linux như một hệ điều hành trên một thiết bị nhúng.

Mục tiêu có bộ xử lý x86 và có thiết bị CompactFlash 8 GB để lưu trữ.

Tôi đã quản lý để sử dụng buildroot để tạo hình ảnh hạt nhân và các công cụ biên dịch chéo. Tôi đã phân vùng thiết bị CF thành một phân vùng FAT nhỏ, nơi hình ảnh hạt nhân cư trú cũng như syslinuxcấu hình khởi động và một ext3hệ thống tệp mà tôi đã giải nén hệ thống tệp gốc được tạo bởi buildroot.

Hệ thống khởi động thành công bằng syslinuxcách đặt thư mục gốc vào phân vùng CF ext3 nơi đặt hệ thống tệp buildroot của tôi.

Câu hỏi của tôi tập trung vào nhu cầu về sự mạnh mẽ khi đối mặt với việc mất điện ngay lập tức (và thường xuyên) vì điều quan trọng là thiết bị phải khởi động thành công sau khi mất điện. Tôi đã đọc rằng gắn hệ thống tập tin gốc như chỉ đọc là một cách để đảm bảo tính toàn vẹn dữ liệu. Đây có phải là một cách hợp lý để tôi tiến hành?

Tôi cũng đã đọc về khả năng tải hệ thống tập tin gốc vào RAM để đạt được điều tương tự nhưng vẫn chưa biết cách thực hiện.

Có cách nào để đạt được mục tiêu này không và nếu có thì cách tốt nhất để tôi tiến hành là gì?

Câu trả lời:


11

Câu trả lời mới (2015-03-22)

( Lưu ý: . Câu trả lời này là đơn giản hơn trước, nhưng không an toàn hơn câu trả lời đầu tiên của tôi là mạnh bởi vì bạn có thể giữ các tập tin chỉ đọc bởi fs gắn kết tùy chọn trước . Cờ phép Vì vậy, buộc phải viết một tập tin mà không được phép viết sẽ không làm việc ở tất cả.)

Có, trong Debian , có một gói: fsprotect ( trang chủ ).

Nó sử dụng aufs(theo mặc định, nhưng có thể sử dụng một unionfscông cụ khác ) để cho phép thay đổi phiên trực tiếp nhưng theo RAM theo mặc định, vì vậy mọi thứ bị lãng quên khi khởi động lại.

Bạn có thể cài đặt chúng bằng cách chạy đơn giản:

apt-get install fsprotect

Sau khi hoàn thành, từ tài liệu trực tuyến:

Sau đó:

  • Chỉnh sửa /boot/grub/menu.lsthoặc /etc/default/grub2hoặc /etc/lilo.confthêm " fsprotect=1G" vào tham số kernel.
  • Sửa đổi 1G khi cần thiết.
  • Áp dụng thay đổi (nghĩa là chạy update-grub)
  • Chỉnh sửa /etc/default/fsprotectnếu bạn muốn bảo vệ các hệ thống tập tin khác /.
  • khởi động lại

Bạn cũng có thể muốn mật khẩu bảo vệ bộ tải khởi động grub hoặc cấm mọi thay đổi đối với nó.

Từ đó, nếu một số tệp được bảo vệ chống lại các thay đổi, đối với mẫu bằng

chmod ugo-w myfile

nếu bạn sử dụng cho mẫu vi myfilevà cố gắng viết lên nó bằng lệnh :w!, điều này sẽ hoạt động và bạn myfileđã thay đổi. Bạn có thể khởi động lại để truy xuất không sửa đổi myfile.

Điều đó thậm chí không thể với giải pháp đầu tiên sau đây của tôi:

Câu trả lời cũ (đầu tiên):

Vâng, nó là một giải pháp mạnh mẽ, nhưng mạnh mẽ!

Làm cho r / o có thể sử dụng

Bạn phải gắn kết một số thư mục trong rw , như /var, /etcvà có thể /home. Điều này có thể được thực hiện bằng cách sử dụng aufs hoặc unionfs . Tôi thích cách này theo cách khác , sử dụng /dev/shmmount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Trước đây, bạn có thể di chuyển tất cả các thư mục không thay đổi hoạt động bình thường trong a static-var, hơn là tạo liên kết tượng trưng trong / var:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Vì vậy, khi kết nối lại trong ro, sao chép /vartrong /dev/shmsẽ không chiếm quá nhiều dung lượng vì hầu hết các tệp được chuyển đến /static-varvà chỉ có các liên kết tượng trưng được sao chép trong ram.

Cách tốt hơn để làm điều này một cách tinh vi là tạo ra một chu kỳ toàn năng, một ngày làm việc đầy đủ và chạy một lệnh như:

find / -type f -o -type f -mtime -1

Vì vậy, bạn sẽ thấy tập tin nào cần được định vị trên phân vùng đọc-ghi.

Ghi nhật ký

Vì trong máy chủ này không tồn tại bộ nhớ tĩnh có thể ghi, để lưu trữ lịch sử và các nhật ký khác, bạn phải cấu hình một syslogmáy chủ từ xa .

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

Bằng cách này, nếu hệ thống của bạn bị hỏng vì bất kỳ lý do gì, mọi thứ trước đó đều được ghi lại.

Nâng cấp

Khi chạy với một số người mount --bindđang sử dụng, để thực hiện nâng cấp như vậy trong khi hệ thống đang sử dụng (không cần chạy init 1, để giảm thời gian xuống), cách đơn giản hơn là xây dựng lại một root sạch , có thể thực hiện nâng cấp:

Sau khi kết thúc '/' ở chế độ đọc-ghi :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

Và bây giờ:

shutdown -r now

Cảm ơn câu trả lời của bạn. Tôi hoàn toàn không hiểu điều đó vì các kỹ năng Linux của tôi không tốt vào lúc này. Nó vẫn rất hữu ích mặc dù và cho tôi thêm một số lĩnh vực để nghiên cứu.
nhà toán

Trả lời chỉnh sửa! Giải pháp mới và giải thích khác biệt!
F. Hauri

Điều này không trả lời câu hỏi, đó là một câu trả lời tuyệt vời cho một hệ thống dựa trên debian, nhưng Buildroot không dựa trên debian.
LovesTha

@LoveTha Hãy xem câu trả lời Cũ (đầu tiên) ! Đây là ít dựa trên Debian và U có thể hiểu nguyên tắc và cơ chế tương tự cho bất kỳ loại phân phối / cài đặt nào. (ngay cả khi phần Nâng cấp hiển thị các lệnh Debian, U có thể thực hiện tương tự để nâng cấp thủ công hoặc bất kỳ nâng cấp dựa trên phân phối nào khác.)
F. Hauri

Câu trả lời cũ của bạn sẽ là một câu trả lời tuyệt vời cho một câu hỏi chung chung về việc thiết lập chỉ đọc các hệ thống Linux. Khi tôi đã hoàn thành việc khám phá làm cho bản dựng của chúng tôi chỉ đọc, tôi hy vọng sẽ quay lại và đưa ra câu trả lời chi tiết tuyệt vời cho câu hỏi cụ thể ở đây. Buildroot đã có các bit tạm thời của / var symlinked to / tmp là tempfs. / etc không nên được sử dụng làm không gian đầu cho các chương trình, vì vậy không nên xử lý một cách đặc biệt.
LovesTha

3

Tôi chỉ có kinh nghiệm sử dụng bản dựng mới hơn (2014/02). Trong phiên bản đó, bạn có thể vô hiệu hóa 'khởi động lại hệ thống tập tin đọc ghi gốc' trong tập tin cấu hình với:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW chưa được đặt

Tôi đã quản lý để tạo ra một hình ảnh chỉ sử dụng ext4 / phân vùng của nó như chỉ đọc để việc rút sức mạnh của hệ thống hoàn toàn không gây hại. Nó hoạt động rất tốt, vì vậy nếu bạn không cần phải ghi vào hệ thống tệp của mình, có thể đây là một giải pháp đơn giản hơn nhiều so với giải pháp được đề cập ở trên (có vẻ như ít nhiều có thể áp dụng cho hệ thống Debian khi đề cập đến apt-get).


Cảm ơn câu trả lời - tuy nhiên cuối cùng tôi đã chọn thiết lập initramfs với việc chỉ gắn một vài thư mục với tùy chọn đồng bộ hóa trên ổ CF để duy trì dữ liệu. Điều này đã phục vụ tôi khá tốt trong thời gian này.
nhà toán

Để thêm vào điều này: sử dụng các phiên bản buildroot cũ hơn, hãy kiểm tra xem /etc/inittabliệu /có xảy ra ở đó không. Nếu vậy, thay đổi nó theo nhu cầu của bạn.
evnu

Câu trả lời này là một phần quan trọng của 'cách xây dựng' để thực hiện nó. Phần lớn lời khuyên trong câu trả lời được chấp nhận sẽ là cần thiết để làm cho các hệ thống phức tạp hơn hoạt động. Cơ hội là mặc dù tất cả những gì sẽ cần phải được thực hiện là thiết lập thêm một vài liên kết tượng trưng đến / tmp (tempfs) và mọi thứ đều hoạt động.
LovesTha
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.