우분투 tar 복원

이번에 윈도우 포맷을 하다가 우분투 파티션도 날라갔는데요(분명히 포맷한 것은 윈도운데…)…

전에 tar를 이용한 백업(인터넷 검색해서 흔히 나오는 방식)을 했는데요, 그걸 이용해서 복구하려고 일단 우분투를 설치하고 다시 우분투가 설치된 ext4 파티션을 포맷하고 그 자리에 tar를 풀고 없는 폴더도 생성했는데…

재부팅하니 grub 화면이 까만색으로 뜨고 누르면 오류가 뜨면서 안됩니다. 그래서 windows 쪽으로 눌러봐도 오류…

grub 문제인 듯 해서 grub 복구라든지, 재설치라든지 등은 안되더라구요. 그래서 포기했습니다.

일단 윈도우에서의 지식으로,

변한 것은 1. 우분투가 설치돼 있던 파티션의 용량, 2. 우분투의 스왑 파티션이 변했습니다.

원인이 무엇일까요? 아시는 분은 말씀좀 해주세요… 설마 파티션은 전혀 건들지 않고 딱 자료만 날라갔을때 사용만 가능한가요?

p.s. grub2라도 좀 알면 나을텐데… 한글로 자세히 설명된 곳이 없어서 어렵네요ㅣ. grub1은 설명된 곳이 많던데…grub4dos나… 그리고 된다면 안정적인 백업방법도 알려주세요. 백업할 것은 시스템 설정(컴피즈 설정 포함), 프로그램 및 프로그램 설정들

우선 파일 시스템이라는 것은 파일을 관리하기 위한 것입니다.
그리고, 파티션이라는 것은 디스크를 관리하는 것으로, 디스크를 분할하고, 이것은 볼륨이라는 개념으로 사용됩니다.
많은 리눅스의 백업 도구들은 파일 단위로 백업합니다.
그렇지만 일부 백업 도구들은 이미지 백업이라고 하여, 파티션 단위나, 디스크 단위로 백업하기도 합니다.

tar나 rsync 등으로 백업하셨다면, 파일 단위 백업이죠.

파일 백업과 이미지 백업은 각기 장단점이 있습니다.
이전 상태로 원상복귀를 원한다면, 이미지 백업 도구로 풀 백업해야 하지요.
하지만, 이 경우는 말 그대로 원상복귀입니다. 즉, 파티션이 변경되거나, 디스크가 변경되면…
어려운 점이 생깁니다.
파일 백업은 그렇게 원상복귀는 안되지만, 파티션이나 디스크가 변경되어도, 그 상태에 맞춰 적용이 가능합니다.

실제 서비스 용도로 사용되는 서버의 경우, 풀 백업 및 예약 작업에 따라 증분백업을 함께 합니다.

하지만, 일반 데스크탑 용도로 사용되는 경우, 문제 발생시 재설치를 전제로 하는 편이 편합니다.
왜냐면… 어자피 릴리즈에 따라가면서, 업그레이드하거나, 설치를 하게 되니까요.
/home을 파티션 분할하여, 이 파티션 만을 주로 백업하고, 루트 파일 시스템에 문제가 생기면…
리눅스를 다시 설치하고, 이전 /home 파티션을 그대로 사용하는 거죠.
이때, /var/lib/dpkg/status 파일과 /etc 내에 설치 이후 수정한 설정, 글꼴 정도만 백업해 두시고,
이것을 바탕으로 다시 설치한 리눅스 시스템에 이전 설정을 반영해 주면 됩니다.

[code:3vlx3b1t]
#!/bin/sh

exclude() {
grep -v kde
}
cat ${1:-~/status}|sed ‘/^Package:.*/!d;s/^Package: //g;s/$/ install/g’|exclude|sudo dpkg --set-selections && sudo apt-get dselect-upgrade
[/code:3vlx3b1t]

이와 같은 형태의 스크립트로 이전 설치했던 패키지 목록을 바탕으로 프로그램들을 설치하실 수 있습니다.

만약, 파티션도 멀쩡하고 부팅만 안되는 경우는, 라이브시디로 부팅하여

[code:3vlx3b1t]
mkdir t
sudo mount /dev/sda5 t
sudo mount --bind /proc t/proc
sudo mount --bind /sys t/sys
sudo mount --bind /dev t/dev
sudo mount --bind /dev/pts t/dev/pts
sudo chroot t /bin/bash
sudo grub-install /dev/sda
sudo update-grub
exit
sudo umount t/dev/pts
sudo umount t/proc t/sys t/dev
sudo umount t
[/code:3vlx3b1t]
위와 같은 명령으로, grub 부트로더만 설치하시면 되구요…

파티션 포맷이나 크기 조정 등을 하셨다면, uuid가 바뀌기 때문에… sudo update-grub 명령으로
grub 부트메뉴를 변경해주셔야 부팅이 가능합니다.

만약, 백업을 통한 원상복귀를 원하신다면… clonezilla등을 찾아보시면 됩니다.

[quote="protochaos":35yzsovn]우선 파일 시스템이라는 것은 파일을 관리하기 위한 것입니다.
그리고, 파티션이라는 것은 디스크를 관리하는 것으로, 디스크를 분할하고, 이것은 볼륨이라는 개념으로 사용됩니다.
많은 리눅스의 백업 도구들은 파일 단위로 백업합니다.
그렇지만 일부 백업 도구들은 이미지 백업이라고 하여, 파티션 단위나, 디스크 단위로 백업하기도 합니다.

tar나 rsync 등으로 백업하셨다면, 파일 단위 백업이죠.

파일 백업과 이미지 백업은 각기 장단점이 있습니다.
이전 상태로 원상복귀를 원한다면, 이미지 백업 도구로 풀 백업해야 하지요.
하지만, 이 경우는 말 그대로 원상복귀입니다. 즉, 파티션이 변경되거나, 디스크가 변경되면…
어려운 점이 생깁니다.
파일 백업은 그렇게 원상복귀는 안되지만, 파티션이나 디스크가 변경되어도, 그 상태에 맞춰 적용이 가능합니다.

실제 서비스 용도로 사용되는 서버의 경우, 풀 백업 및 예약 작업에 따라 증분백업을 함께 합니다.

하지만, 일반 데스크탑 용도로 사용되는 경우, 문제 발생시 재설치를 전제로 하는 편이 편합니다.
왜냐면… 어자피 릴리즈에 따라가면서, 업그레이드하거나, 설치를 하게 되니까요.
/home을 파티션 분할하여, 이 파티션 만을 주로 백업하고, 루트 파일 시스템에 문제가 생기면…
리눅스를 다시 설치하고, 이전 /home 파티션을 그대로 사용하는 거죠.
이때, /var/lib/dpkg/status 파일과 /etc 내에 설치 이후 수정한 설정, 글꼴 정도만 백업해 두시고,
이것을 바탕으로 다시 설치한 리눅스 시스템에 이전 설정을 반영해 주면 됩니다.

[code:35yzsovn]
#!/bin/sh

exclude() {
grep -v kde
}
cat ${1:-~/status}|sed ‘/^Package:.*/!d;s/^Package: //g;s/$/ install/g’|exclude|sudo dpkg --set-selections && sudo apt-get dselect-upgrade
[/code:35yzsovn]

이와 같은 형태의 스크립트로 이전 설치했던 패키지 목록을 바탕으로 프로그램들을 설치하실 수 있습니다.

만약, 파티션도 멀쩡하고 부팅만 안되는 경우는, 라이브시디로 부팅하여

[code:35yzsovn]
mkdir t
sudo mount /dev/sda5 t
sudo mount --bind /proc t/proc
sudo mount --bind /sys t/sys
sudo mount --bind /dev t/dev
sudo mount --bind /dev/pts t/dev/pts
sudo chroot t /bin/bash
sudo grub-install /dev/sda
sudo update-grub
exit
sudo umount t/dev/pts
sudo umount t/proc t/sys t/dev
sudo umount t
[/code:35yzsovn]
위와 같은 명령으로, grub 부트로더만 설치하시면 되구요…

파티션 포맷이나 크기 조정 등을 하셨다면, uuid가 바뀌기 때문에… sudo update-grub 명령으로
grub 부트메뉴를 변경해주셔야 부팅이 가능합니다.

만약, 백업을 통한 원상복귀를 원하신다면… clonezilla등을 찾아보시면 됩니다.[/quote:35yzsovn]

정말…정말 감사드립니다…
예전에 윈도우 처음 설치할 때의 감동이 느껴지네요. 감사합니다.
포기하고 다시 깔려다가 grub 라이브 시디로 다시 까는 것 했더니 잘… 그것도 너무 잘… 되네요.
제가 아직 리눅스에 대해 접한지 얼마 되지 않아서… 명령어는 조금 알겠어도 grub을 설치할 때 마운트 하는 이유 등등을 공부해봐야 겠군요…
그런데 단점이… 제 윈도우7로 진입하는게 grub에 뜨지 않네요… 음… 이건 또 음…

윈도우는 어떻게 스누피님 등 설명된 곳이 꽤 되는데, 리눅스는 한글로 된 곳이 별로라 아쉽네요. 영어를 열심히 공부해야하나…
혹시 한글로 잘 설명된 곳이 있으면 아무 곳이나 알려주세요…ㅜㅜ

원래 sudo update-grub 명령을 내리면… 자동으로 설치된 운영체제들을 인식합니다.

[code:hgwy5ajo]Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.6.5-030605-generic
Found initrd image: /boot/initrd.img-3.6.5-030605-generic
Found linux image: /boot/vmlinuz-3.5.0-18-generic
Found initrd image: /boot/initrd.img-3.5.0-18-generic
Found Windows 7 (loader) on /dev/sda1
[/code:hgwy5ajo]
이런식으로 나오면서, 자동으로 커널들과 윈도우즈를 부트메뉴에 추가해줍니다.
그런데 이게 안 된다고 하시니…
의심스러운것은 윈도우즈 시스템예약파티션 100M짜리가 혹시 존재하지 않습니까?

[code:hgwy5ajo]#/boot/grub/custom.cfg
menuentry "Microsoft Windows 7" {
insmod part_msdos
insmod ntfs
insmod search
insmod ntldr
search -s -f /bootmgr
ntldr /bootmgr
}[/code:hgwy5ajo]
이런 내용으로 저장을 하시고 부팅해보세요…
마지막에 추가될 것입니다.

그리고, grub-install을 하는데 왜 마운트하는지 궁금하시다구요?

먼저 chroot라는 것을 이해하셔야 합니다.
이것은 root(최상위디렉토리)를 변경하는 명령입니다.
사실 /파티션이라는 것은, 루트디렉토리에 마운트되는 파티션입니다.
그러니까 다른 파티션을 /파티션과 비슷한 구성으로 해놓고, 루트디렉토리에 마운트할 수도 있는 것입니다.
실제로, initrd.img가 읽혀지는 initramfs 단계에서, root파일시스템을 /디렉토리에 마운트하는 과정이 있습니다.
좀 더 정확히 말하자면 /root라는 디렉토리에 마운트한 후, /root라는 디렉토리를 루트디렉토리로 인식하게 합니다.
그렇게 루트디렉토리를 바꾸는 명령이 chroot(change root)입니다.

라이브시디로 부팅하면, 램디스크가 루트디렉토리가 됩니다.
그렇기 때문에, /에 어떤 것을 변경하더라도 메모리에서만 변하지 디스크에 저장되지는 않는 것입니다.
그래서, t라는 디렉토리를 만든 후, 이곳에 기존의 루트파티션을 마운트한것입니다.

그런데, 왜 바로 chroot하지 않고, 다른 것들도 마운트한 후에, chroot하는지 궁금하실 수 있습니다.

/proc, /sys, /dev, /dev/pts 이것들은 실제 디스크내에 존재하는 것이 아닙니다.
리눅스 커널이 부팅시에 장치를 자동으로 인식하고, 그 결과를 반영한 것입니다.
예를들어 cat /proc/meminfo를 해보시면 메모리 정보가 출력됩니다만…
실제 디스크 내에 이 정보를 갖고 있는 것이 아니라, 메모리 내에 존재하는 것입니다.
하드웨어가 언제든 변할 수 있다고 가정한다면 당연하잖아요?

그런데, 위에서 설명했듯, /proc,/sys,/dev,/dev/pts등은
매번부팅할때 마다 초기화되고, 메모리내서만 저장된 내용이고 실제 루트파티션내에 존재하는 것이 아니기 때문에…
이미 부팅해서 사용하고 있는 정보를 이용해야합니다.
그래서 mount -o bind 옵션이나, mount --bind 옵션을 사용하여,
기존의 디렉토리를 다른 디렉토리 위에 겹쳐보이게 마운트하는 것입니다.
쉽게 생각하시면, 디렉토리를 링크한것과 비슷한 것입니다.

그렇게 t 디렉토리에 루트파티션을 마운트하고,
/proc,/sys,/dev,/dev/pts등을 라이브시스템의 것으로 연결하면…
온전한 모양이 되는 것입니다.
물론, home을 따로 파티션을 분리하였고, home 파티션에 접근하는 프로그램을 실행하실 것이라면…
chroot 하시기 전에, home 파티션도 /home에 마운트해 주셔야 합니다.

이렇게 모든 작업을 한 후, sudo chroot t /bin/bash 명령을 내리면…
t 디렉토리가 새로운 루트 디렉토리가 되고, 그 안에서 /bin/bash를 실행하게 됩니다.
이 경로도 역시 새로운 루트 디렉토리를 기반으로 합니다.
이것이 쉘이지요. 쉘은 커널과 사용자나 어플들 사이에서 다리 역할을 하는 것입니다.
어떤 것을 하던지 간에 사용자가 무언가 명령을 내리려면 쉘이 있어야 합니다.
그래서 여기선 bash(born-again shell)를 실행한 것이고, 이 쉘 안에서는 새로운 루트 디렉토리가 적용되는 것입니다.
이 쉘이 종료될때, chroot도 끝나게 됩니다.
chroot가 끝나면, 당연히, 이전의 루트디렉토리 환경으로 복귀됩니다.
왜냐면 이 새로운 루트디렉토리는 그 쉘 내에서만 인식하는 것이기 때문이죠.

하지만, chroot가 끝나도, chroot하기 전에 mount한 내용은 존재하기 때문에…
umount 명령으로 언마운트해줘야 합니다.