읽기 전용 루트 파일 시스템을 사용하는 것이 임베디드 설정에 좋은 아이디어입니까?


15

임베디드 장치에서 Linux를 운영 체제로 실행하는 임무를 수행했습니다.

대상에는 x86 프로세서가 있으며 스토리지 용 8GB CompactFlash 장치가 있습니다.

나는 buildroot를 사용하여 커널 이미지와 크로스 컴파일 도구를 만들었습니다. CF 장치를 커널 이미지가있는 작은 FAT 파티션과 syslinux부트 구성 및 ext3buildroot에 의해 생성 된 루트 파일 시스템의 압축을 해제 한 파일 시스템으로 분할했습니다.

syslinux루트 디렉토리를 내 buildroot 파일 시스템이있는 CF ext3 파티션으로 설정하면 시스템이 성공적으로 부팅 됩니다.

내 질문은 정전 후 장치를 성공적으로 부팅하는 것이 중요하기 때문에 즉각적인 (그리고 빈번한) 전원 손실에 대비 한 견고성에 대한 요구에 중점을두고 있습니다. 루트 파일 시스템을 읽기 전용으로 마운트하는 것이 데이터 무결성을 보장하는 방법이라는 것을 읽었습니다. 이것이 진행하기에 현명한 방법입니까?

또한 루트 파일 시스템을 RAM에로드하여 동일한 것을 달성 할 수있는 방법에 대해서는 아직 알지 못했습니다.

이 목표를 달성하는 데 선호되는 방법이 있습니까? 그렇다면 진행하는 가장 좋은 방법은 무엇입니까?

답변:


11

새로운 답변 (2015-03-22)

( 참고 : .이 대답은 이전보다 간단,하지만 더 안전한 당신이 파일을 유지할 수 있기 때문에 내 첫 번째 대답이 더 강하다 읽기 전용 으로 옵션을 FS 마운트 하기 전에 . 허가 플래그 그래서 강제로 쓰기에 허가없이 파일을 작성하지 않습니다 일 조금도.)

예, 데비안 에는 fsprotect ( homepage ) 패키지가 있습니다.

그것은 사용 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이외의 파일 시스템을 보호하려면 편집하십시오 /.
  • 재부팅

grub 부트 로더를 비밀번호로 보호하거나 변경을 금지 할 수도 있습니다.

거기에서 일부 파일이 변경으로부터 보호되는 경우

chmod ugo-w myfile

sample에 사용 vi myfile하고 command로 작성하려고하면 :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/ 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

그래서 복사, RO에 다시 마운트 할 때 /var/dev/shm대부분의 파일로 이동으로 너무 많은 공간을 차지하지 않습니다 /static-var만 심볼릭 링크가 램에 복사 할 수 있습니다.

이 작업을 제대로 수행하는 더 좋은 방법은 전체 전원을 껐다가 켜서 하루 동안 전체 작업을 수행하고 다음과 같은 명령을 실행하는 것입니다.

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

답변 주셔서 감사합니다. 현재 Linux 기술이 좋지 않기 때문에 완전히 이해하지 못합니다. 그것은 여전히 ​​매우 유용하며 연구 할 더 많은 영역을 제공합니다.
수학자

답변이 수정되었습니다! 새로운 솔루션과 설명 차이!
F. Hauri

이것은 질문에 대한 답변이 아니며 데비안 기반 시스템에 대한 훌륭한 답변이지만 Buildroot는 데비안 기반이 아닙니다.
LovesTha

@LovesTha Old (첫 번째) 답변을 살펴보십시오 ! 이것은 데비안 기반 이 아니며 U는 모든 종류의 배포 / 설치에 대해 동일한 메커니즘을 이해하고 원리를 이해할 수 있습니다. ( 업그레이드 섹션에 데비안 명령이 표시 되더라도 U는 수동 업그레이드 또는 다른 배포 기반 업그레이드에 대해 동일하게 수행 할 수 있습니다.)
F. Hauri

이전 답변은 읽기 전용 Linux 시스템 설정에 대한 일반적인 질문에 대한 훌륭한 답변입니다. 빌드 루트를 읽기만하는 탐색을 마치면 돌아와서 여기서 특정 질문에 대한 자세한 답변을 드리겠습니다. Buildroot에는 이미 tempfs 인 / tmp에 링크 된 / var의 임시 비트가 있습니다. / etc를 프로그램의 스크래치 공간으로 사용해서는 안되므로 특별히 처리 할 필요가 없습니다.
LovesTha

3

최신 빌드 루트 (2014-02)를 사용한 경험이 있습니다. 해당 버전에서는 다음을 사용하여 구성 파일에서 '루트 파일 시스템 읽기 / 쓰기 듀팅 부팅 마운트 해제'를 비활성화 할 수 있습니다.

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW가 설정되지 않았습니다

ext4 / 파티션을 읽기 전용으로 사용하는 이미지를 만들었으므로 시스템의 전원을 뽑아도 전혀 해를 끼치 지 않습니다. 잘 작동하므로 파일 시스템에 쓸 필요가 없다면 위에서 언급 한 것보다 훨씬 간단한 해결책 일 것입니다 (apt-get을 참조하는 데비안 시스템에 다소 적용 가능합니다).


대답에 감사드립니다. 그러나 결국에는 데이터 지속성을 위해 CF 드라이브에 동기화 옵션이있는 몇 개의 디렉토리 만 마운트하는 initramfs 설정을 선택했습니다. 이것은 당분간 저에게 꽤 잘되었습니다.
수학자

이것에 추가하려면 : 이전 buildroot 버전을 사용하여 /etc/inittab다시 마운트가 /발생 하는지 확인하십시오 . 그렇다면 필요에 따라 변경하십시오.
evnu

이 답변은이를 수행하는 '빌드 루트 방식'의 중요한 부분입니다. 더 복잡한 시스템이 작동하려면 허용 된 답변의 많은 조언이 필요합니다. 그러나 필요한 모든 것은 / tmp (tempfs)에 대한 몇 가지 추가 심볼릭 링크를 설정하고 모든 것이 작동한다는 것입니다.
LovesTha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.