/etc/fstab 에서 변경한 root 파일시스템이 인식되지 않을 때??

Btrfs Snapshot 공부 중, 또 새로운 사실을 알게 됐다. (아.. 어렵고 어렵구나. 그래도 원인을 파악할 수 있는 기본기(?)가 생겼음에 감사해야할지.)

** 글 끝에 써 있지만, 이 문제를 피하기 위해선 rEFInd 를 사용하는 편이 좋다. 아래 방법은, 꼭 Grub 을 써야만 할 때를 위해 남겨둔다.

아래 글은, Btrfs 의 Subvolume Set Default 기능을, GRUB 과 사용할 때 발생할 수 있는 문제점을 담고 있다.


예를 들어, snapshot 을 사용하다가, 특정 스냅샷으로 되돌아가고 싶을 때, (Snapper 등등을 사용하지 않고 그냥 수동으로 하려고 한다면) 원하는 서브볼륨(snapshot)을 디폴트로 정해주기만 하면 된다.
예를 들어, ID 269 인 다음 서브볼륨을 디폴트로 바꾸려면,

> btrfs subvolume list /
ID 259 gen 5030 top level 5 path @
ID 260 gen 5037 top level 5 path @home
ID 261 gen 20 top level 5 path @opt
ID 262 gen 5041 top level 5 path @var
ID 264 gen 4945 top level 259 path @-old/.snapshots
ID 265 gen 4669 top level 264 path @-old/.snapshots/1/snapshot
ID 266 gen 4914 top level 264 path @-old/.snapshots/2/snapshot
ID 267 gen 4945 top level 260 path @home/.snapshots
ID 268 gen 4915 top level 5 path @-temp
ID 269 gen 5036 top level 268 path @-temp/snapshot
ID 270 gen 4916 top level 267 path @home/.snapshots/1/snapshot
ID 271 gen 4917 top level 264 path @-old/.snapshots/3/snapshot

> btrfs subvolume set-default 269 /
<아무 문구도 표시되진 않는다.>

그리고 재부팅하면, 루트 디렉토리는 이전까지 사용하던 서브볼륨(@)에서 새서브볼륨 @-temp/snapshot 으로 바뀌게 된다. 사용자는 루트가 바뀐 점을 눈치채지 못한다. (이 표현엔 조금 모순이 있긴 하지만..)

바로 이 개념을 OpenSuse 가 사용하고 있다.
그런데, 우분투에선 이렇게 해도 계속 이전 루트시스템으로만 부팅이 된다.

왜 이럴까..
30분정도 짜증을 내다가, 저녁을 지어먹고(표현이 예스럽네) 다시 컴퓨터를 째려보기 시작했다.
부엌으로 가기 바로 전, grub 과 관련된 문제가 아닐까.. 하는 의문을 품었었고, 돌아와서 부팅 초기 화면에서 Grub 메뉴로 들어가 봤다.

답은 바로 거기에 있었다.
기본 커널 옵션으로, Set Defalut 를 해주면 불필요한 rootflags=subvol=@ 가 붙어있었다.
이걸 수동으로 떼어내려면 /boot/grub/grub.cfg 를 편집해야 하는데, 그렇게 되면 커널 에 변화가 있을 때마다, 또는 set-default 를 할 때마다 건드려야하는 불편함이 생긴다.

OpenSuse 최신판에서는 이 부분을 어떻게 처리하고 있는지는 모르겠으나, 몇년 전에는 이렇게 해결했었던 듯 하다.

이 글은, 구글에서 “edit grub rootflags” 이란 검색어의 1순위 결과였다. 제대로된 방법을 딱 한번에 찾아낼 수 있었다니!
어찌됐든, 이렇게 하면, (해법은 아닌 우회책이지만) 위 문제를 해결할 수 있다.

/etc/default/grub 을 열고, 다음 항목을 아래와 같이 수정한다.

....
GRUB_CMDLINE_LINUX_DEFAULT="rootflags=discard"

그리고 나서 update-grub 을 해주면 끝.

> update-grub

또는, 우분투가 아니라면,
> grub-mkconfig -o /boot/grub/grub.cfg

다시 정리하면 이렇다.

  • btrfs sub set-default 로, 원하는 서브볼륨을 기본값으로 설정한다.
  • (/etc/fstab 의 / 설정엔, subvol 항목이 필요없다.)
  • /etc/default/grub 에서, rootflags=discard 을 추가한다.
  • update-grub 으로 내용을 저장한다.

** 다른 스냅샷으로 이동했을 때, 그 위치의 /etc/default/grub 에 rootflags=discard 가 없다면, 역시 그곳에서도 해줘야할 필요가 있다.

** 이런 저런 귀찮은 면을 생각해보면, refind 를 쓰는 편이 훨씬 낫다. refind 를 사용한 뒤, refind_liux.conf 에 rootflags=subvol= 를 아예 주지 않으면, 이런 저런 문제를 생각할 필요가 전혀 없어진다.
다만, 이동할 Snapshot 이 다른 디스크에 있다면, 즉 UUID 가 원래 있던 곳과 다른 UUID 에 있다면, /boot/refind_linux.conf 를 수정해야한다. (아마도..)

이건 Btrfs Subvolume Set Default 기능을 사용할 때 얘긴데, 사용하지 않을 때(우분투 기본값)는..?


Default 가 ID 5 일 경우, 즉 우분투 기본값일 경우엔, 좀 더 번거로운 작업을 해야 한다.

먼저, /etc/fstab 에서, / 를 정확히 설정한다. 예를 들어,

UUID=d192ab6f-db8e-4d97-92a4-d5d1ee301828 / btrfs defaults,subvol=.snapshots/2/snapshot 0 0

다음, 두가지 방법이 있다.

  • 재부팅 하지 않은 상태에서, /boot/grub/grub.cfg 를 수동 편집하거나,
  • 재부팅 하여, Grub 부팅 화면에서 ‘e’ 를 누르고, 커널 옵션을 편집

재부팅하지 않고 하려면, /boot/grub/grub.cfg 에서 rootflags 항목을 찾아, 원하는대로 고쳐준다. 위와 같다면, rootflags=.snapshots/2/snapshot 가 된다.
그리고 역시, update-grub 을 해준다.

재부팅하고 하려면, Grub 화면에서 e 를 눌러 편집화면으로 간 뒤, 마찬가지로 rootflags 를 찾아 고쳐준다.
제대로 부팅이 되어 우분투로 진입했다면, 이 상태에서 update-grub 을 해준다.

이렇게 번거로우므로, Set Default 를 하는 편이 훨씬, 정신 건강에 이롭다. OpenSuse 가 괜히 이런 방식을 택한게 아니다.
다만, OpenSuse 에선 /etc/default/grub 에 rootflags=discard 항목이 없어도 잘 작동하는데, 위 링크에 보면 이런 문구를 볼 수가 있다.

“While SUSE is in the process of developing a final fix for this, a workaround would be to:”

저 글이 쓰여진 시기는 15년 9월, 약 3년 전이므로, 아무도 지금은 저 문제를 해결한 듯 한데, 우분투에선 이 개념을 쓰지 않고 있으므로, 이 우회책을 써야만 하는 상황이 아닐런지.

One Comment

Leave a Reply