Gömülü kurulum için salt okunur bir kök dosya sistemi kullanmak iyi bir fikir midir?


15

Gömülü bir cihazda Linux'u işletim sistemi olarak çalıştırmakla görevlendirildim.

Hedef x86 işlemciye ve depolama için 8 GB CompactFlash cihaza sahip.

Çekirdek görüntüsü ve çapraz derleme araçlarını oluşturmak için buildroot kullanmayı başardım. CF cihazını çekirdek görüntüsünün yanı sıra syslinuxönyükleme yapılandırması ve ext3buildroot tarafından oluşturulan kök dosya sistemini açtığım bir dosya sistemi bulunan küçük bir FAT bölümüne ayırdım.

Sistem syslinuxkök dizini, buildroot dosya sistemimin bulunduğu CF ext3 bölümüne ayarlayarak başarıyla başlatılır.

Sorum, elektrik kesintilerinden sonra cihazın başarılı bir şekilde önyükleme yapması çok önemli olduğundan, acil (ve sık sık) güç kaybı karşısında sağlamlık ihtiyacı etrafında odaklanıyor. Kök dosya sistemini salt okunur olarak bağlamanın veri bütünlüğünü sağlamanın bir yolu olduğunu okudum. Bu benim ilerlemem için mantıklı bir yol mu?

Aynı şeyi elde etmek için kök dosya sistemini RAM'e yükleme olasılığını da okudum ama henüz nasıl yapılacağını bilmiyorum.

Bu hedefe ulaşmanın tercih edilen bir yolu var mı ve eğer öyleyse ilerlememin en iyi yolu nedir?

Yanıtlar:


11

Yeni cevap (2015-03-22)

( Not: . Bu cevap, önceki daha basit ama daha güvenli dosyaların tutmak çünkü Benim ilk cevap güçlüdür salt okunur tarafından seçenekleri fs monte önce . İzni bayrakları Yani zorlayarak yazma izni olmadan dosyaları yazmak için olmaz işler hiç.)

Evet, Debian altında bir paket var: fsprotect ( ana sayfa ).

Canlı oturum değişikliklerine izin vermek için aufs(varsayılan olarak RAM'de unionfs) varsayılan olarak (varsayılan olarak, ancak başka bir araç kullanabilir ) kullanır , böylece yeniden başlatma sırasında her şey unutulur.

Bunları basitçe çalıştırarak yükleyebilirsiniz:

apt-get install fsprotect

Tamamlandığında, çevrimiçi dokümandan:

Daha sonra:

  • Düzenleme /boot/grub/menu.lstveya /etc/default/grub2veya /etc/lilo.confve add " fsprotect=1G" parametreleri çekirdek.
  • 1G'yi gerektiği gibi değiştirin.
  • Değişiklikleri uygula (yani çalıştır update-grub)
  • Düzenleme /etc/default/fsprotectdışında başka dosya sistemlerini korumak istiyorsanız /.
  • reboot

Ayrıca grub önyükleyicisini parola ile korumak veya üzerinde değişiklik yapmaktan vazgeçmek de isteyebilirsiniz.

Oradan, bazı dosya değişikliklere karşı korunuyorsa,

chmod ugo-w myfile

örnek için kullanırsanız vi myfileve komutla üzerine yazmaya çalışırsanız :w!, bu işe yarayacak ve myfiledeğişmiş olacaksınız . Değiştirilmemiş almak için yeniden başlatabilirsiniz myfile.

Aşağıdaki ilk çözümümle bu bile mümkün değil:

Eski (ilk) cevap:

Evet, güçlü bir çözüm ama güçlü!

R / o'yu kullanılabilir yapma

Sen bazı dizinleri monte etmek zorunda rw gibi /var, /etcbelki ve /home. Bu, aufs veya unionfs kullanılarak yapılabilir . Bunu kullanarak başka bir şekilde seviyorum /dev/shmve mount --bind:

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

Daha önce, static-var/ var içinde semboller oluşturmak yerine, normal işlemde değişmesi gerekmeyen tüm dizinleri a :

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

Yani kopyalama, ro yeniden mount zaman /variçinde /dev/shmen dosyalar taşınır olarak çok fazla yer almayacağız /static-varve sadece sembolik bağlar ram kopyalanan edilecektir.

Bunu ince bir şekilde yapmanın en iyi yolu, tam bir güç döngüsü, bir günlük tam çalışma yapmak ve aşağıdakine benzer bir komutu çalıştırmaktır:

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

Böylece hangi dosyaların okuma-yazma bölümünde bulunması gerektiğini göreceksiniz.

Kerestecilik

Bu ana bilgisayarda olduğu gibi, yazılabilir bir statik bellek yoktur, geçmişi ve diğer günlükleri saklamak için uzak bir syslogsunucu yapılandırmanız gerekir .

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

Bu şekilde, sisteminiz herhangi bir nedenle bozulursa, önceki her şey günlüğe kaydedilir.

Yükseltme

Bazıları mount --bindkullanımdayken çalışırken, sistem kullanımdayken böyle bir yükseltme yapmak için (çalıştırma ihtiyacı init 1olmadan, çalışmama süresini azaltmak için), daha basit bir yol, yükseltmeyi yapabilen temiz bir kök oluşturmaktır :

'/' Okuma-yazma modunda yeniden bağlandıktan sonra :

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 /

Ve şimdi:

shutdown -r now

Cevabınız için teşekkürler. Linux becerilerim şu anda büyük olmadığı için bunu tam olarak anlamıyorum. Yine de çok yararlı ve bana araştırma yapmak için biraz daha alan sunuyor.
mathematician1975

Yanıt düzenlendi! Yeni çözüm ve açıklanan farklar!
F. Hauri

Bu soruya cevap vermiyor, debian tabanlı bir sistem için harika bir cevap, ama Buildroot debian tabanlı değil.
LovesTha

@LovesTha Eski (ilk) yanıtı inceleyin ! Bu daha az Debian tabanlıdır ve U prensibi anlayabilir ve her türlü dağıtım / kurulum için aynı mekanizmayı uygulayabilir. ( Yükseltme bölümünde Debian komutları gösterilse bile U, manuel yükseltme veya diğer dağıtım tabanlı yükseltme için de aynısını yapabilir.)
F. Hauri

Eski cevabınız, salt okunur Linux sistemlerinin kurulması ile ilgili genel bir soruya harika bir cevap olacaktır. Buildroot'umuzun sadece okunmasını sağlama keşfimi bitirdikten sonra, geri dönmeyi ve buradaki özel soruya ayrıntılı bir cevap vermeyi umuyorum. Buildroot zaten geçici olarak / var symlinked / var olarak kullanılan geçici değişkenlere sahiptir. / etc, programlar için bir çizik alanı olarak kullanılmamalıdır, bu nedenle özel olarak ele alınması gerekmez.
LovesTha

3

Sadece daha yeni bir buildroot (2014-02) kullanma deneyimim var. Bu sürümde, yapılandırma dosyasında 'remount root dosya sistemi okuma-yazma duing önyüklemesini' devre dışı bırakabilirsiniz:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW ayarlanmadı

Ben sadece ext4 / bölümünü sadece okunan olarak kullanan bir görüntü oluşturmayı başardım, bu yüzden sistemin gücünü çıkarmak hiç zarar vermez. Harika çalışıyor, bu yüzden dosya sisteminize yazmanız gerekmiyorsa, belki de yukarıda belirtilenlerden çok daha basit bir çözümdür (apt-get'i ifade ettiği için bir Debian sistemi için az çok uygulanabilir gibi görünüyor).


Cevabınız için teşekkürler - ancak sonunda veri kalıcılığı için CF sürücüsünde senkronizasyon seçeneğiyle sadece birkaç dizin monte eden bir initramfs kurulumu seçtim. Bu şimdilik bana oldukça iyi hizmet etti.
mathematician1975

Buna eklemek için: eski buildroot sürümlerini kullanarak, orada /etc/inittabyeniden montajın olup olmadığını kontrol edin /. Eğer öyleyse, ihtiyaçlarınıza göre değiştirin.
evnu

Bu cevap, bunu yapmak için 'yapıcı kök yolunun' önemli bir parçasıdır. Daha karmaşık sistemlerin çalışması için kabul edilen cevaptaki tavsiyelerin çoğuna ihtiyaç duyulacaktır. Muhtemelen yapılması gereken tek şey / tmp (tempfs) için birkaç ekstra sembol kurmak ve her şeyin işe yaramasıdır.
LovesTha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.