..

우분투 파티션 재조정 후 home 날릴뻔한 경험

root 파티션의 공간이 부족해서 home 파티션을 백업한 뒤 지우고 root 파티션의 공간을 늘리려고 했습니다.

이 과정에서 home 파티션을 지워버린듯한 경험을 했습니다.

배경

데스크톱 머신에서 우분투 22.04를 사용하고 있습니다. 처음 설치할 때 일반적인 권고에 따라 root 파티션을 50GB로 설정했습니다. 홈 파티션은 root 파티션 바로 뒤에 시작하여 약 300GB를 확보했습니다. (FYI, 옛날에 디스크 공간이 부족한 시절의 관습인 듯하고, 최근에는 굳이 이렇게 할 필요가 없는 듯 합니다.)

시간이 지나면서 도커를 사용하여 무언가를 설치할 때마다 공간 부족 메시지가 자주 나타났습니다. 도커 이미지나 볼륨이 home 파티션에 저장되지 않고 root 아래에 저장되어 50GB로 설정된 파티션이 너무 작은 것 같았습니다.

Gparted를 사용하여 root 파티션을 확장하려고 했지만, gparted는 파티션을 확장할 때 오른쪽 방향으로만 확장할 수 있는 것으로 나타났습니다. 기존의 파티션 구조는 root와 home 사이에 아무 공간도 없었습니다. 이전에 root 파티션 바로 뒤에 home 파티션을 배치했기 때문에 root 파티션을 확장할 수 있는 공간이 없었습니다.

포맷을 고려할 수도 있었지만, 업무용으로 사용하고 있었고 이전에 여러 설정을 해 놓은 상태여서 복구하는 작업에 시간을 투자하고 싶지 않았습니다. (게임을 할 시간도 필요했구요.)

Home 파티션에는 약 100GB의 여유 공간이 있었습니다. 정리를 조금 더 하고 나니 50GB를 더 확보할 수 있었습니다. 이를 줄이면 root 파티션에 더 많은 공간을 할당할 수 있을 것으로 보였습니다. 따라서 root 파티션에 더 많은 공간을 할당하기 위해 home 파티션을 삭제한 후 위치를 조정하기로 결정했습니다.

전개

“Two is one and one is none” 이라는 격언이 있습니다. 이는 항상 한 개는 없는 셈 치고 실패할 경우를 대비하라는 뜻입니다. 데이터의 경우에는 백업을 항상 만들어두는 것이 되겠습니다. 이 격언을 기억하며 home 파티션을 포맷하기 전에 별도의 하드 디스크에 home 아래의 모든 유저의 데이터를 복사해두었습니다.

sudo cp -r /home/* /mnt/hdd0/Home_bk/

이후 우분투 부팅 디스크 이미지를 담은 USB로 다시 부팅했습니다. 이 때 우분투를 새로 설치해버리면 root가 전부 지워져서 세팅을 복구해야 했기 때문에 새로 설치하지 않았습니다. 대신 설치 과정에서 home 파티션을 지우기만 하고 root 파티션을 늘렸습니다. 이후 설치 과정이 아니라 “Try Ubuntu”에서 gparted를 사용하여 작업을 진행했습니다. 성공적으로 root 파티션의 크기를 변경하고 home을 할당 해제한 후에 재부팅했습니다.

위기

그런데 부팅이 안 된다.

부팅이 안 됩니다. 우분투를 쓰다보면 이러한 상황은 이미 여러 번 겪을 수 있어서 부팅 과정에서 safe mode로 진입해 터미널 화면을 볼 수 있었습니다. 이후 reboot을 시도했지만, 이번에는 처음 보는 에러가 발생했습니다.

Failed to start reboot.target: Transaction is destructive.
See system logs and 'systemctl status reboot.target' for details.

“Transaction is destructive”라는 문구가 대체 무엇을 의미하는지 궁금증이 생겼습니다. 왜 재부팅하는데 파괴적인 요소가 있는 것일까요? 이 의문으로 혼란이 더 커졌습니다.

제시된 명령어대로 “reboot.target”의 상태를 확인했을 때, “reboot.target”이 비활성화되어있고 죽어있는 상태임을 확인할 수 있었습니다.

$ systemctl status reboot.target
● reboot.target - Reboot
   Loaded: loaded (/lib/systemd/system/reboot.target; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd.special(7)

이후 절망적인 기분에 의미 없이 여러 번 동일한 과정을 반복했지만 별 다른 소득은 없었습니다.

다행히도 인터넷을 찾아보니 fstab에 등록된 내용이 없을 경우 부팅에 문제가 발생할 수 있다는 힌트를 얻었습니다. 생각해보니 홈 파티션을 포맷하고 완전히 제거했다면, 부팅이 되지 않을 수도 있다는 생각이 들었습니다. 이전에 조사한 내용에 따르면 fstab에 등록된 정보가 부적절하면 부팅이 이루어지지 않을 수 있다고 합니다.

따라서 확인해보니 /etc/fstab에 home 파티션 관련 등록 정보가 아직 남아 있었고, uuid를 확인해보니 fstab에 등록된 uuid는 존재하지 않았습니다.

sudo blkid

fstab의 해당 위치를 주석처리하고 재부팅했습니다. 이번에는 부팅이 잘 되었습니다!

Takeaway: /etc/fstab에 있는 내용을 불러올 수 없으면 부팅이 안 된다.

그러나, 천천히 좀 하라는 뜻일지, 이번에는 로그인이 되지 않았습니다. 로그인 화면에서는 원래 존재했던 유저들이 잘 표시되고 있었습니다. 아마도 root 파티션은 잘 유지되고 있고, root 파티션에 유저 정보가 등록되어 있기 때문인 것으로 생각됩니다.

/home을 백업해둔 위치로 심볼릭 링크를 걸어주면 유저 홈 파일들을 찾을 수 있을 것으로 기대했습니다. 그러나 아직 로그인이 되지 않았습니다.

이에 home 파티션을 제거했으니 다시 만들어주면 로그인이 잘 될 것이라고 생각하여 생성을 시도했습니다. 이 과정에서도 gparted 관련해서 일부 어려움이 있었지만, 결국 home 파티션을 gparted를 통해 다시 생성하고 fstab을 수동으로 변경하여 성공적으로 마운트했습니다. 그러나 여전히 로그인이 되지 않았습니다.

새로운 유저로는 로그인할 수 있을 것으로 예상하여 새 유저를 생성해보았습니다. “adduser” 커맨드를 사용하여 새 유저를 추가하니 홈 위치에 자동으로 유저의 홈 디렉토리가 생성되었습니다. 다행히 이렇게는 로그인이 잘 되었습니다. 그러나 기존 유저로 로그인할 수 없다면 그것은 문제입니다.

sudo adduser username

새 유저로는 로그인이 되는 것을 확인했으니, 기존 유저의 백업된 데이터를 원래 위치에 넣으면 로그인이 되지 않을까 싶어 터미널로 진입해 백업된 데이터를 찾아보았습니다.

그런데 이게 웬걸, 백업된 데이터가 보이지 않았습니다.

절정

잠깐 설명하자면, 백업된 데이터에는 크기가 크지 않을지 몰라도(총합 ~200GB) 여러 세팅 값들이 들어있습니다. 간단하게는 zsh이나 asdf와 같은 설정 내용부터 설치한 앱들이 포함되어 있을 것이고, 회사에서 사용하는 VPN 설정 등도 홈 디렉토리에 담겨 있을 것입니다. 다행히도 프로젝트 파일들은 별도 하드에 보관되어 있고 git으로 연동되어 있으므로 문제는 없습니다.

그러나 제일 큰 문제는 다시 세팅하는 데 들이는 시간입니다. 아무리 중요한 데이터라도 다시 가져올 수 있지만, 그 과정은 정말로 지치는 일입니다. 앞으로 휴일이 며칠이나 있는데 이 좋은 휴일을 “안 해도 됐지만 굳이 건드려서 다시 해야하는 세팅 정리하기”로 날리고 싶지 않았습니다.

원래는 크게 당황하는 사람이 아닙니다. 당황해도 “이 상황에서는 좀 당황해야 사람같겠구나”라고 의식적으로 생각하면서 조금은 의도적으로 패닉 상태에 빠진달까요. 이번에는 달랐습니다.

진짜 손이 떨리고 뿌리부터 당혹감이 올라왔습니다. 지금 생각해보면 아까까지 2시간 동안 잠 늦게 자면서 파티션 크기 좀 늘려보겠다고 고생한게 수포로 돌아간것 같아 더 그랬던 것 같습니다.

커맨드 히스토리를 확인했지만, 내가 실수로 지운 것인지 확인할 수 없었습니다. 생성한 위치에 무엇이 있는지 확인해봤는데, 새로 생성한 유저들이 들어있었습니다. 아마도 내가 뭔가를 잘못 설정하여 새로 생성한 유저들이 그쪽으로 들어간 것으로 생각했습니다.

무슨 생각이었는지 루트 리덱토리를 리스트업 해봤습니다.

sudo ls -al /

그런데 이게 웬걸, 아까 생성했던 /home이 아직도 심볼릭 링크였습니다. 이게 매우 이상했습니다.

심볼릭 링크를 지우고 재부팅했는데.. 원래 데이터가 여전히 살아있었습니다! 내가 뭘 잘못한 것은 아니었다는 생각이 들어 그 순간 깊은 안도감이 들었습니다.

이후 알게 된 것은 리눅스에서는 기존 디스크 A의 물리적으로 데이터가 있는 위치에 다른 디스크 B를 마운트하면, B의 데이터만 보이게 된다는 것입니다.

디스크 B가 액자라면 벽화는 그대로 있는데, 액자를 걸어서 벽화가 안 보이게 되는 것과 같습니다.

Takeaway: 리눅스에서는 기존 디스크 A의 물리적으로 데이터가 있는 위치에 다른 디스크 B를 마운트하면 B의 데이터만 보인다.

결말

다만 아직 로그인은 되지 않았습니다. 이번에는 앞선 장애들보다는 간단하게 복사해둔 파일들의 소유권 문제였습니다.

askubuntu를 참고하여 힌트를 얻었습니다. 로그인이 제대로 이루어지지 않을 때는 파일 소유권 문제를 의심해볼 필요가 있다고 합니다.

실제로 복사된 홈의 소유권을 확인해보니 전부 root로 설정되어 있었습니다. 아마도 특정 유저로 로그인하려고 할 때 그 유저의 홈 디렉토리에 있는 파일을 사용하려고 했지만, 권한이 부족하여 로그인이 실패한 것으로 보입니다.

stat /path/to/file`

디렉토리의 소유권을 변경해준 뒤 로그인을 다시 시도했습니다.

sudo chown -R username: /home/username

이번에는 로그인이 잘 되었습니다. 설정도 전부 그대로이며, 원래 사용하던 환경 그대로 사용할 수 있었습니다.

Takeaway: 우분투는 로그인 화면에서 사용자의 파일 소유권을 확인하여, 본인 권한이 아니면 로그인을 제한하는 듯합니다.