btrfs snapshot을 이용한 안전한 do-release-upgrade 실험
루트파일시스템으로 Btrfs를 사용하는 경우, 스냅샷 기능을 이용하면
시스템 안정성에 다소 위험이 있는 시도를 마음편하게 할 수 있다.

잘 동작하는 상태의 스냅샷을 떠 두고 실험하거나
실험용 스냅샷을 떠서 그 스냅샷으로 임시부팅하여 실험하는 방식 등을 쓰면 된다.

나는 Ubuntu 12.04에서 14.04로 업그레이드를 해 보고 싶은 상황이었는데,
업그레이드중 시스템이 이도 저도 아닌 상태로 꼬이는 일이 염려되어
12.04 버전의 스냅샷과 14.04 업그레이드용 스냅샷 등을 만들고
각 스냅샷으로 부팅할 수 있게 해 둔 상태로 업그레이드를 하기로 했다.

기록이 산만하고 불완전하다.

------

원래 서브볼륨 @가 루트파티션, 서브볼륨 @home이 /home 파티션으로 설정되어 있었는데,
업그레이드 전/후 등 용도별로 사용할 여러 개의 스냅샷들을 만들었다.

$ sudo mount /dev/sdh1 a
$ ls -al a
total 4
dr-xr-xr-x 1 root   root   184 Nov  3 20:57 .
drwx------ 1 chanik chanik 446 Nov  4 09:00 ..
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home
$ sudo btrfs subvolume snapshot @ @_12.04
$ sudo btrfs subvolume snapshot @home @home_12.04
$ sudo btrfs subvolume snapshot @ @_14.04
$ sudo btrfs subvolume snapshot @home @home_14.04
$ sudo btrfs subvolume snapshot @ @_12.04_20151104_083500
$ sudo btrfs subvolume snapshot @home @home_12.04_20151104_083500
$ sudo btrfs subvolume list a
ID 257 top level 5 path @home
ID 266 top level 5 path @
$ ls -al a
total 4
dr-xr-xr-x 1 root   root   184 Nov  3 20:57 .
drwx------ 1 chanik chanik 446 Nov  4 09:00 ..
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04_20151104_083500
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_14.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04_20151104_083500
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_14.04
$ sudo btrfs subvolume list a
ID 257 top level 5 path @home
ID 266 top level 5 path @
ID 267 top level 5 path @_12.04
ID 268 top level 5 path @home_12.04
ID 269 top level 5 path @_14.04
ID 270 top level 5 path @home_14.04
ID 271 top level 5 path @_12.04_20151104_083500
ID 272 top level 5 path @home_12.04_20151104_083500


이제 새로 만든 스냅샷들로 부팅할 수 있게 grub 설정 및 설치한다.
아래와 같이 하면 오류가 생겼음. 알아둘것.

$ for a in proc sys dev; do sudo mount --bind /$a a/@_14.04/$a; done
$ sudo chroot a/@_14.04
# update-grub
/usr/sbin/grub-probe: error: cannot find a device for / (is /dev mounted?).
# exit
$ for a in proc sys dev; do sudo umount `pwd`/a/@_14.04/$a; done
$ sudo umount a


아래와 같이 하면 잘 되었다.
먼저 /dev/sdg 로 부팅할 경우 14.04로 부팅되도록 설정.

$ sudo mount /dev/sdh1 a -o subvol=@_14.04
$ for a in proc sys dev; do sudo mount --bind /$a a/$a; done
$ sudo chroot a
# update-grub
( 이 명령 실행결과로, /boot/grub/grub.cfg 내용물이 @ -> @_14.04 식으로 정돈된다 )
# grub-install /dev/sdg
( 여기서 vim /dev/fstab 해서 @ -> @_14.04, @home -> @home_14.04 식으로 수정해두자 )
# exit
$ for a in proc sys dev; do sudo umount `pwd`/a/$a; done
$ sudo umount a


그리고, /dev/sdh 로 부팅할 경우 12.04로 부팅되도록 함.

$ sudo mount /dev/sdh1 a -o subvol=@_12.04
$ for a in proc sys dev; do sudo mount --bind /$a a/$a; done
$ sudo chroot a
# update-grub
( 이 명령 실행결과로, /boot/grub/grub.cfg 내용물이 @ -> @_12.04 식으로 정돈된다 )
# grub-install /dev/sdh
( 여기서 vim /dev/fstab 해서 @ -> @_12.04, @home -> @home_12.04 식으로 수정해두자 )
# exit
$ for a in proc sys dev; do sudo umount `pwd`/a/$a; done
$ sudo umount a


여기까지 해 두면, 재부팅시 @_14.04로 부팅하게 된다.
여기서 sudo do-release-upgrade 해보다가 실패하면 /dev/sdh로 부팅하여 @_12.04를 띄울 수도 있고,
스냅샷을 이용해 업그레이드 시도 전 시점으로 되돌아가는 등 다양한 작업이 가능하다.

일단 @_14.04로 부팅한 상태에서 아래와 같이 기존의 @, @home의 이름을 바꿔두었다.
나중에 업그레이드가 성공하면 나면 @_orig, @_12.04, @_12.04_20151104_083500 등은 없애도 될 것이다.
(sudo btrfs subvolume delete a/@_orig 식으로 하면 됨)

$ sudo mount /dev/sdg1 a
$ cd a
$ ls -al
total 4
dr-xr-xr-x 1 root   root   184 Nov  3 20:57 .
drwx------ 1 chanik chanik 446 Nov  4 09:30 ..
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04_20151104_083500
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_14.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04_20151104_083500
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_14.04
$ sudo mv @ @_orig
$ sudo mv @home @home_orig
$ ls -al
total 4
dr-xr-xr-x 1 root   root   204 Nov  4 09:35 .
drwx------ 1 chanik chanik 446 Nov  4 09:30 ..
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_12.04_20151104_083500
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_14.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_12.04_20151104_083500
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_14.04
drwxr-xr-x 1 root   root    12 Apr 29  2013 @home_orig
drwxr-xr-x 1 root   root   260 Nov  3 19:27 @_orig
$ sudo btrfs subvolume list .
ID 257 top level 5 path @home_orig
ID 266 top level 5 path @_orig
ID 267 top level 5 path @_12.04
ID 268 top level 5 path @home_12.04
ID 269 top level 5 path @_14.04
ID 270 top level 5 path @home_14.04
ID 271 top level 5 path @_12.04_20151104_083500
ID 272 top level 5 path @home_12.04_20151104_083500
$ cd ..
$ sudo umount a


by 시험さま | 2015/11/04 09:19 | 컴퓨터 | 트랙백 | 핑백(1) | 덧글(0)
트랙백 주소 : http://chanik.egloos.com/tb/4099097
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 시험さま : Ubuntu 14.. at 2016/05/09 18:37

... 기능을 믿었기 때문이다. btrfs snapshot을 이용한 안전한 do-release-upgrade 실험 http://chanik.egloos.com/4099097 업그레이드는 위 글에 나온 식으로 @_16.04, @home_16.04 snapshot을 만들고 그 스냅샷으로 부팅한 상태에서 진행했다 ... more

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >