라즈베리파이, 루트를 read-only로 마운트하는 방법

|

왜 이 짓을 하냐구? 아니, 난 사실 왜 이게 기본이 아닐까에 대해서 무척 궁금해하던 중이라.

본질적으로 라즈베리파이는 가벼운 OS를 추구하거든. 전원도 그리 안정적이진 않고. 얘가 갑자기 훅 꺼지는 경우도 다반사일듯 한데, 문제는 이놈이 리눅스 베이스로 동작하는거라 예기치 않은 전원 다운이 파일 시스템을 잡아먹는 경우도 생길거란 말이지. (라즈베리파이로 이를테면 nas를 만들었는데 이걸 끌때마다 터미널로 들어가서 shutdown을 날려주는것도 웃기잖아?)


참고 사이트 : http://raspberrypi.stackexchange.com/questions/14657/is-sd-card-corruption-still-an-issue (구글형님한테 raspberry sd card corruption을 찾아달라고 요청하면 이런 비슷한 글들이 쏟아진다.)


궁극적으로 회피하는 방법은 루트를 read only로 마운트하고, OS 가동시 자동으로 생성되는 (로그라던가 임시 파일이라던가) 파일들은 모두 휘발성 메모리에 쓰도록 하는게 (이를테면 램드라이브) 기본적인 이론이다.


그러면 SD카드를 못 쓰지 않냐?


아니지. linux에는 remount라는 좋은 제도가 있거든.


참고 사이트 : http://askubuntu.com/questions/175739/how-do-i-remount-a-filesystem-as-read-write (read-only 에서 read-write로 remount 하는 방법. 그런 후에 쓸꺼 쓰고 정상 shutdown 후 reboot 하면 루트는 다시 read-only로 변경되는거다. 다시 read-only로 remount는 안하는게 낫다. 프로세스 한놈이라도 파일을 쓰기 권한을 열어버리는 순간 불가능해지거든. 맘편하게 리붓이 낫지.)


아참. 곁가지 이야기나 하고 말이지.


참고 사이트 : http://blog.pi3g.com/2014/04/make-raspbian-system-read-only/ (이것이 메인 주제다)


아직 해보진 않았으니 요약만 설명하는 걸로.


1) 스왑을 비활성화 한다.


dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable


2) UnionFS를 설치한다.


apt-get install unionfs-fuse


3) mount 스크립트를 만든다.


/usr/local/bin/mount_unionfs 요 파일을 아래 내용으로 만든다.


#!/bin/sh
DIR=$1
ROOT_MOUNT=$(awk '$2=="/" {print substr($4,1,2)}' < /etc/fstab)
if [ $ROOT_MOUNT = "rw" ]
then
  /bin/mount --bind ${DIR}_org ${DIR}
else
  /bin/mount -t tmpfs ramdisk ${DIR}_rw
  /usr/bin/unionfs-fuse -o cow,allow_other,suid,dev,nonempty ${DIR}_rw=RW:${DIR}_org=RO ${DIR}
fi


그리고 실행 가능하게 수정하고 (sudo chmod +x /usr/local/bin/mount_unionfs)

/etc/fstab에다가 빨간색으로 표시된 내용을 추가한다. (mmcblk0p1, 2가 ro로 mount 되어야 한다)


/dev/mmcblk0p1  /boot           vfat    ro                0       2
/dev/mmcblk0p2  /               ext4    ro,noatime        0       1

mount_unionfs   /etc            fuse    defaults          0       0
mount_unionfs   /var            fuse    defaults          0       0


4) 디렉토리를 준비한다.


cp -al /etc /etc_org
mv /var /var_org
mkdir /etc_rw
mkdir /var /var_rw
reboot


etc는 런타임에서 수정이 안되니까 복사로 넣은듯 하고, var는 쿨하게 mv 시켜버렸다. 보시다시피 /var 나 /etc 안 내용들에 수정이 필요하면 /var_org나 /etc_org 에서 원본 파일을 수정하면 리붓 후에도 바뀌게 되는 구조다. /var나 /etc를 수정하면 리붓 후에는 날라가고. (반드시 기억하자)


이후에 로그 정리하고 그런게 있긴 한데, 굳이 필수적인 동작은 아니라 필요한 것만 정리해봤다.

아참. 패키지를 새로 깔아야 한다거나 root에 뭔가 수정을 하고 싶다면 아래 커맨드를 날려준 다음에 평소와 같이 하면 되겠다.


mount -o remount,rw /


만일 etc나 var를 디렉토리 그대로 수정해야겠다면 (update-rc.d 같은 스크립트를 돌리거나 make install 대상에 etc가 있거나 등등)


mount --bind /var_org /var

mount --bind /etc_org /etc (이렇게 바인딩을 했으면 꼭 리붓 전에 umount /etc로 바인딩을 날려버리자. 내려가면서 뭔가 에러가 나더라)


빠진 패키지가 있어서 마운트 바꾸고 apt-get install로 패키지 몇개 깐 후에 리붓하니 오류가 엄청나더라. 결국 이미지는 밀어버렸고. 이 작업을 하려면 필요한건 다 설치한 후에 하자.

retropie나 OpenMediaValut 같은 이미지를 쓰고 있으면 etc나 var 이외에 다른 디렉토리의 read-write 권한이 필요할 수도 있다. 그런건 알아서 연구해보자. (...)


끗.


2015. 4. 29. 수정) aptitude라고 표시된 부분을 apt-get으로 변경, /etc/fstab 내용 수정, remount 커맨드 추가, *_org bind 하는 법 추가


And