การใช้ระบบไฟล์รูทแบบอ่านอย่างเดียวเป็นความคิดที่ดีสำหรับการตั้งค่าแบบฝังหรือไม่


15

ฉันได้รับมอบหมายให้ทำงานลีนุกซ์เป็นระบบปฏิบัติการบนอุปกรณ์ฝังตัว

เป้าหมายมีโปรเซสเซอร์ x86 และมีอุปกรณ์ CompactFlash 8 GB สำหรับจัดเก็บ

ฉันมีการจัดการเพื่อใช้ buildroot เพื่อสร้างภาพเคอร์เนลและเครื่องมือการรวบรวมข้าม ฉันแบ่งพาร์ติชันอุปกรณ์ CF ออกเป็นพาร์ติชัน FAT ขนาดเล็กซึ่งมีเคอร์เนลอิมเมจอยู่รวมถึงsyslinuxการกำหนดค่าการบู๊ตและext3ระบบไฟล์ที่ฉันทำการแตกระบบไฟล์รูทที่สร้างโดย buildroot

บูตระบบสำเร็จโดยใช้syslinuxโดยการตั้งค่าไดเรกทอรีรากเป็นพาร์ติชัน CF ext3 ซึ่งเป็นที่ตั้งของระบบไฟล์ buildroot ของฉัน

คำถามของฉันมีศูนย์กลางอยู่ที่ความต้องการความทนทานในการเผชิญกับการสูญเสียพลังงานในทันที (และบ่อยครั้ง) เนื่องจากเป็นสิ่งสำคัญสำหรับอุปกรณ์ที่จะบู๊ตได้สำเร็จหลังจากไฟดับ ฉันได้อ่านแล้วว่าการติดตั้งระบบไฟล์รูตเนื่องจากการอ่านอย่างเดียวเป็นวิธีการตรวจสอบความถูกต้องของข้อมูล นี่เป็นวิธีที่เหมาะสมหรือไม่สำหรับฉันที่จะดำเนินการต่อ

ฉันได้อ่านเกี่ยวกับความเป็นไปได้ของการโหลดระบบไฟล์รูทลงใน RAM เพื่อให้ได้สิ่งเดียวกัน แต่ยังไม่ทราบว่าต้องทำอย่างไร

มีวิธีที่ต้องการในการบรรลุเป้าหมายนี้หรือไม่และถ้าเป็นเช่นนั้นวิธีที่ดีที่สุดสำหรับฉันในการดำเนินการคืออะไร?

คำตอบ:


11

คำตอบใหม่ (2015-03-22)

( หมายเหตุ:คำตอบนี้ง่ายกว่าก่อนหน้า แต่ไม่ปลอดภัยกว่าคำตอบแรกของฉันแข็งแกร่งเพราะคุณสามารถเก็บไฟล์แบบอ่านอย่างเดียวโดยตัวเลือกการเมานท์ fs ก่อนการตั้งค่าสถานะการอนุญาตดังนั้นการบังคับให้เขียนไฟล์โดยไม่ได้รับอนุญาต เลย)

ใช่ภายใต้Debianมีแพ็คเกจ: fsprotect ( โฮมเพจ )

มันใช้ aufs (โดยค่าเริ่มต้น แต่สามารถใช้unionfsเครื่องมืออื่น) เพื่ออนุญาตการเปลี่ยนแปลงเซสชันสดแต่ใน RAM โดยค่าเริ่มต้นดังนั้นทุกอย่างจะถูกลืมเมื่อรีบูต

คุณสามารถติดตั้งได้โดยการเรียกใช้เพียง:

apt-get install fsprotect

เมื่อเสร็จแล้วจากเอกสารออนไลน์:

หลังจากนั้น:

  • แก้ไข/boot/grub/menu.lstหรือ/etc/default/grub2หรือ/etc/lilo.confและเพิ่ม "fsprotect=1G " ในพารามิเตอร์เคอร์เนล
  • แก้ไข 1G ตามต้องการ
  • ใช้การเปลี่ยนแปลง (เช่นเรียกใช้ update-grub )
  • แก้ไข/etc/default/fsprotectหากคุณต้องการปกป้องระบบไฟล์อื่นที่ไม่ใช่/กว่า
  • รีบูต

คุณอาจต้องการรหัสผ่านเพื่อป้องกัน bootloader grub หรือห้ามการเปลี่ยนแปลงใด ๆ

จากตรงนั้นหากไฟล์บางไฟล์ได้รับการปกป้องจากการเปลี่ยนแปลงตัวอย่างโดย

chmod ugo-w myfile

ถ้าคุณใช้สำหรับตัวอย่างvi myfileและลองเขียนมันด้วยคำสั่ง:w!สิ่งนี้จะได้ผลและคุณ myfileก็เปลี่ยนไป myfileคุณอาจจะเริ่มต้นใหม่เพื่อดึงข้อมูลยังไม่แปร

นั่นเป็นไปไม่ได้ด้วยวิธีแก้ปัญหาแรกของฉันต่อไปนี้:

คำตอบเก่า (แรก):

ใช่มันเป็นทางออกที่แข็งแกร่ง แต่ทรงพลัง!

ทำให้ r / o ใช้ได้

คุณจะต้องติดบางไดเรกทอรีในRWเช่น/var, และอาจจะ/etc /homeซึ่งอาจทำได้โดยใช้aufsหรือunionfs ฉันชอบวิธีนี้อีกวิธีหนึ่งโดยใช้/dev/shmและmount --bind:

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

ก่อนหน้านี้คุณสามารถย้ายไดเรกทอรีทั้งหมดที่ไม่มีการเปลี่ยนแปลงในการดำเนินการปกติในstatic-varกว่าสร้าง symlink ใน / 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

ดังนั้นเมื่อ remounting ใน RO, การคัดลอก/varใน/dev/shmจะไม่ใช้พื้นที่มากเกินไปเป็นไฟล์ส่วนใหญ่จะย้ายไป/static-varและมีเพียง symlinks จะได้รับการคัดลอกในแกะ

วิธีที่ดีกว่าในการทำสิ่งนี้อย่างประณีตคือการสร้างวงจรพลังงานเต็มวันหนึ่งของการทำงานเต็มรูปแบบและเรียกใช้คำสั่งอย่างประณีต:

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

ดังนั้นคุณจะเห็นไฟล์ที่ต้องอยู่ในพาร์ติชั่นอ่าน - เขียน

เข้าสู่ระบบ

ในโฮสต์นี้ไม่มีหน่วยความจำแบบสแตติกที่สามารถเขียนได้เพื่อเก็บประวัติและบันทึกอื่น ๆ คุณต้องกำหนดค่าsyslogเซิร์ฟเวอร์ระยะไกล

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

ด้วยวิธีนี้หากระบบของคุณผิดพลาดด้วยเหตุผลใดก็ตามทุกอย่างก่อนหน้านี้จะถูกบันทึกไว้

การอัพเกรด

เมื่อใช้งานซึ่งมีการใช้งานบางอย่างmount --bindเพื่อทำการอัปเกรดในขณะที่ระบบกำลังใช้งานอยู่ (โดยไม่จำเป็นต้องเรียกใช้init 1เพื่อลดเวลาหยุดทำงาน) วิธีที่ง่ายกว่าคือการสร้างรากใหม่ที่สะอาดสามารถทำการอัพเกรดได้:

หลังจากติดตั้ง '/' อีกครั้งในโหมดอ่าน - เขียน :

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 /

และตอนนี้:

shutdown -r now

ขอบคุณสำหรับคำตอบ. ฉันไม่เข้าใจอย่างถ่องแท้เนื่องจากทักษะลินุกซ์ของฉันไม่ดีในตอนนี้ มันยังคงมีประโยชน์มากและให้พื้นที่เพิ่มเติมแก่ฉันในการวิจัย
นักคณิตศาสตร์

แก้ไขคำตอบแล้ว! ทางออกใหม่และอธิบายต่างออกไป!
F. Hauri

นี่ไม่ได้ตอบคำถามมันเป็นคำตอบที่ดีสำหรับระบบที่ใช้เดเบียน แต่ Buildroot ไม่ได้เป็นเดเบียน
LovesTha

@LoveTha ได้ดู คำตอบเก่า (แรก) ! นี่เป็นพื้นฐานของเดเบียนน้อย และ U สามารถเข้าใจหลักการและกลไกที่เหมือนกันสำหรับการแจกจ่าย / ติดตั้งทุกชนิด (แม้ว่าส่วนการอัพเกรดจะแสดงคำสั่ง Debian ก็ตาม U สามารถทำเช่นเดียวกันสำหรับการอัปเกรดด้วยตนเองหรือการอัพเกรดอื่น ๆ ที่ใช้การ
แจกจ่าย

คำตอบเก่าของคุณจะเป็นคำตอบที่ดีสำหรับคำถามทั่วไปเกี่ยวกับการตั้งค่าระบบ Linux แบบอ่านอย่างเดียว เมื่อฉันเสร็จสิ้นการสำรวจการสร้าง buildroot ของเราเท่านั้นฉันหวังว่าจะกลับมาและให้คำตอบโดยละเอียดเกี่ยวกับคำถามเฉพาะที่นี่ Buildroot มีบิตชั่วคราวของ / var symlinked ไปที่ / tmp ซึ่งเป็น tempfs / etc ไม่ควรใช้เป็นพื้นที่เริ่มต้นสำหรับโปรแกรมดังนั้นจึงไม่จำเป็นต้องจัดการเป็นพิเศษ
LovesTha

3

ฉันมีประสบการณ์ใช้ buildroot ที่ใหม่กว่าเท่านั้น (2014-02) ในเวอร์ชันนั้นคุณสามารถปิดการใช้งาน 'บูตระบบไฟล์ root ใหม่อ่าน - เขียน duing' ในไฟล์ปรับแต่งด้วย:

ไม่ได้ตั้งค่า BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW

ฉันจัดการเพื่อสร้างภาพที่เพิ่งใช้ ext4 / พาร์ติชันเป็นแบบอ่านอย่างเดียวดังนั้นการถอดปลั๊กไฟของระบบจะไม่เป็นอันตรายเลย มันใช้งานได้ดีดังนั้นถ้าคุณไม่ต้องการเขียนไปยังระบบไฟล์ของคุณบางทีนี่อาจเป็นวิธีที่ง่ายกว่าวิธีที่กล่าวถึงข้างต้น


ขอบคุณสำหรับคำตอบ - อย่างไรก็ตามในท้ายที่สุดฉันเลือกใช้การตั้งค่าเริ่มต้นด้วยการติดตั้งเพียงไม่กี่ไดเรกทอรีที่มีตัวเลือกการซิงค์บนไดรฟ์ CF เพื่อการเก็บข้อมูล สิ่งนี้ทำให้ฉันค่อนข้างดีในช่วงเวลานั้น
mathematician1975

ในการเพิ่มสิ่งนี้: ใช้รุ่น buildroot ที่เก่ากว่าให้ตรวจสอบ/etc/inittabว่า/มีการเกิดขึ้นอีกครั้งหรือไม่ ถ้าเป็นเช่นนั้นเปลี่ยนเป็นความต้องการของคุณ
evnu

คำตอบนี้เป็นส่วนสำคัญของ 'buildroot way' คำแนะนำจำนวนมากในคำตอบที่ได้รับการยอมรับจะต้องใช้เพื่อให้ระบบที่ซับซ้อนมากขึ้นทำงานได้ โอกาสที่ว่าสิ่งที่จะต้องทำคือการตั้งค่าเชื่อมโยงพิเศษบางอย่างเพื่อ / tmp (tempfs) และทุกอย่างทำงาน
LovesTha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.