내 임무는 임베디드 장치에서 Linux를 운영 체제로 실행하는 것입니다.
대상에는 x86 프로세서와 8GB CompactFlash 저장 장치가 있습니다.
나는 커널 이미지와 크로스 컴파일 도구를 생성하기 위해 buildroot를 성공적으로 사용했습니다. CF 장치를 커널 이미지와 syslinux
부팅 구성, ext3
파일 시스템이 포함된 작은 FAT 파티션으로 분할했으며, 여기에 buildroot에 의해 생성된 루트 파일 시스템을 추출했습니다.
syslinux
내 빌드 루트 파일 시스템이 있는 CF ext3 파티션으로 루트 디렉터리를 설정하면 시스템이 성공적으로 부팅됩니다.
내 질문은 정전 후 장치가 성공적으로 시작되는 것이 중요하기 때문에 즉각적이고 빈번한 정전이 발생하는 경우 견고성의 필요성에 중점을 두고 있습니다. 루트 파일 시스템을 읽기 전용으로 마운트하는 것이 데이터 무결성을 보장하는 한 가지 방법이라는 것을 읽었습니다. 계속 진행하는 것이 현명한 방법인가요?
또한 동일한 목적을 달성하기 위해 루트 파일 시스템을 RAM에 로드할 수 있는 가능성에 대해 읽었지만 아직 이를 수행하는 방법을 모릅니다.
이를 달성하는 데 선호되는 방법이 있습니까? 그렇다면, 내가 앞으로 나아갈 수 있는 가장 좋은 방법은 무엇입니까?
답변1
새로운 답변(2015-03-22)
(노트:이 답변은 이전보다 간단하지만 더 안전하지는 않습니다. 파일을 저장할 수 있기 때문에 첫 번째 대답이 더 강력합니다.읽기 전용통과파일 시스템 마운트 옵션 앞으로허가 플래그. 그래서힘허가 없이 파일에 쓰는 것은 전혀 작동하지 않습니다. )
응, 내려더반, 패키지가 있습니다:FS 보호(홈페이지).
aufs
(기본적으로 다른 unionfs
도구를 사용할 수도 있음)을 사용하여 허용합니다.라이브 세션 변경그러나 기본적으로 RAM에 있으므로 재부팅 시 모든 내용이 지워집니다.
다음 명령을 실행하여 간단히 설치할 수 있습니다.
apt-get install fsprotect
완료되면 온라인 설명서에서 다음을 수행합니다.
이후:
/boot/grub/menu.lst
또는 편집하여/etc/default/grub2
커널 매개변수에/etc/lilo.conf
" "를 추가합니다.fsprotect=1G
- 필요에 따라 1G를 수정합니다.
- 변경 사항 적용(예: run
update-grub
)/etc/default/fsprotect
보호하고 싶다면/
.- 재시작
grub 부트로더를 비밀번호로 보호하거나 변경 사항을 비활성화할 수도 있습니다.
여기에서 특정 파일이 변경되지 않도록 보호되는 경우(예:
chmod ugo-w myfile
예제를 사용 vi myfile
하고 명령을 사용하여 작성을 시도하면 :w!
이것이 작동하고 내용이 myfile
변경됩니다. 수정되지 않은 를 검색하려면 재부팅할 수 있습니다 myfile
.
아래의 첫 번째 솔루션으로는 가능하지 않습니다.
이전(첫 번째) 답변:
예, 이것은 강력한 솔루션이며 훌륭하게 작동합니다!
r/o를 사용 가능하게 설정
일부 디렉터리를 설치해야 합니다.읽고 쓰기, 아마 ./var
이 작업은 다음을 사용하여 수행할 수 있습니다./etc
/home
오브또는동맹. 나는 이것을 좋아한다다른 방법, 사용 /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
답변2
나는 최신 빌드 루트(2014-02)에 대해서만 경험이 있습니다. 이 버전에서는 구성 파일에서 "부팅 시 루트 파일 시스템 읽기/쓰기 다시 마운트"를 비활성화할 수 있습니다:
BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW가 설정되지 않았습니다.
ext4/파티션을 읽기 전용으로만 사용하는 이미지를 생성할 수 있었으므로 시스템을 분리해도 전혀 손상이 발생하지 않습니다. 잘 작동하므로 파일 시스템에 쓸 필요가 없다면 위에서 언급한 것보다 더 간단한 솔루션일 수도 있습니다(apt -get을 참조하므로 데비안 시스템에서 어느 정도 작동하는 것 같습니다).