SSD하면 몇 십만원 하던 시절이 있었는데 요새 SSD 가격은 무척 저렴합니다.
4만원도 안 되는 가격으로 웨스턴 디지털(WD)사의 SSD을 구입했는데요.
리눅스의 부팅에 걸리는 시간과 프로그램 실행 시간이 오래 걸려서 SSD로 교체를 위해서죠.
기존에 쓰던 리눅스 디스크를 HDD에서 SSD로 교체하면서 쉽고 편리하게 리눅스 디스크를 교체하는 방법을 알아보겠습니다.
이 문서는 dm-crypt, RAID, LVM을 다루지 않습니다. 개인용 데스크탑 리눅스의 디스크 교체에 대해서만 다룹니다.
제 시스템입니다.
9년쯤 된 노트북 : 인텔 i7, 메모리 8GB, FHD, USB 3.0 지원
우분투 리눅스 18.04.3 LTS
내장 디스크 첫번째 (/dev/sda) : SSD 256GB (윈도7)
내장 디스크 두번째 (/dev/sdb) : HDD 1TB (자료, 리눅스) - 복사할 원본
외장 디스크 (/dev/sdc) : SSD 240GB (새로 구입) - 복사할 대상
옮기는 순서는 다음과 같습니다.
1. HDD의 리눅스 파티션을 참고해서 SSD에 파티션을 만들기
2. HDD에서 SSD로 복사하기
3. 부트로더를 SSD에 설치하기
4. 추가 작업
내장 디스크 두번째 (HDD)의 파티션 구조입니다.
파티션 테이블 형식 : msdos (MBR)
파티션 파일시스템 마운트지점 크기 사용중
/dev/sdb1 ntfs - 775GB 303GB
/dev/sdb2 extended - 155GB -
/dev/sdb7 ext4 / 58GB 10GB
/dev/sdb6 ext4 /home 95GB 25GB
/dev/sdb5 linux-swap - 1.9GB 0GB
위 파티션을 살펴보면 /dev/sdb1는 기본 파티션, /dev/sdb2는 확장 파티션입니다.
확장 파티션 /dev/sdb2 안에는 리눅스 파티션이 논리 파티션으로 존재합니다.
sdb5 리눅스 스왑, sdb6 홈 디렉토리, sdb7 루트 디렉토리가 있습니다.
새로운 SSD에서 파티션 크기는 각각 58GB, 95GB와 똑같거나 커야하므로 조금 크게 루트(/) 60GB와 홈(/home) 100GB 정도로 만들었습니다.
참고.
파티션을 복사하기 위해서 기존 리눅스 파티션 크기보다 새로운 리눅스 파티션이 커야합니다.
실제 사용 중인 크기와 상관 없이 파티션 크기로 따지며 새로운 파티션 크기가 적으면 복사를 할 수 없습니다.
만일 새로운 디스크 크기가 기존 디스크보다 적어서 파티션 복사가 쉽지 않다면?
자체 부팅이 가능한 GParted 프로그램을 내려받아 파티션 크기를 줄일 수 있습니다.
단, 시간적 여유가 있어야 하고, 혹시 모를 데이터 손실의 위험을 감수해야 할 수도 있습니다.
새로운 디스크의 용량이 커서 파티션 크기를 줄일 필요가 없다면 이 과정은 필요치 않습니다.
1. HDD의 리눅스 파티션을 참고해서 SSD에 파티션을 만들기
GParted를 이용해서 새 SSD를 파티션합니다. fdisk가 편리하신 분들은 fdisk를 사용하세요.
GParted가 없으면 우분투 소프트웨어 센터에서 GParted 0.30.0을 설치합니다.
GParted - 장치 - 새 파티션 테이블 만들기... - 새 파티션 테이블 형식 선택 : msdos (MBR)를 선택합니다.
※ 경고 : 전체 디스크 /dev/sdc에 있는 모든 데이터를 지웁니다!
/dev/sdc1를 60GB (60000 입력)크기의 기본 파티션을 만듭니다. (리눅스가 설치될 크기를 제외한 크기)
파일 시스템 형식은 용도에 따라 fat32 또는 ntfs 또는 ext4를 선택합니다.
/dev/sdc2를 나머지 전체 크기(178GB)의 확장 파티션(extended)을 만듭니다.
GParted - 파티션 - 플래그 관리 - boot로 설정합니다.
/dev/sdc2 확장 파티션에 3개의 논리 파티션을 만듭니다.
/dev/sdc5를 2GB (2048 입력) 크기의 리눅스 스압(linux-swap) 파티션을 만듭니다. 뒷 부분의 여유 공간을 0으로. (제 경우)
/dev/sdc6를 100GB (100000 입력)크기의 리눅스 파티션을 만듭니다. 뒷 부분의 여유 공간을 0으로. (제 경우)
/dev/sdc7를 나머지 전체 크기(76GB)의 리눅스 파티션을 만듭니다. 앞 부분의 여유 공간을 201으로. (제 경우 1+200)
공간이 부족하여 마지막 파티션을 만들 때 실패하는 경우가 있어서 여유공간을 100MB 정도 준 것입니다. 고질적 문제.
새로 구입한 외장 디스크(SSD)의 파티션 순서는 HDD를 만들 때와 똑같이 했습니다.
파티션을 저장하지 않으면 모든 과정은 물거품이 되므로 저장합니다.
GParted - 편집 - 모든 작업 진행
※ 경고 : 파티션을 편집하면 잠재적인 데이터 손실을 야기할 수 있습니다. 진행하기 전에 데이터를 백업해 두는 것이 좋습니다.
새로 구입한 외장 디스크(SSD)이므로 걱정할 필요 없이 적용을 누릅니다.
2. HDD에서 SSD로 복사하기
HDD의 리눅스 파티션을 새로 만든 SSD의 리눅스 파티션에 복사하는 방법은 크게 2가지입니다.
가장 기본적인 도구인 dd 또는 그래픽 사용자 환경의 GParted를 이용해서 명령어 입력 없이 이미지로 복사하는 방법입니다.
dd를 사용하면 간단하지만 디스크 또는 파티션 전체를 복사하다보니 시간이 오래 걸립니다.
GParted를 이용한 이미지 복사는 사용 중인 부분만 복사하기 때문에 시간이 줄어듭니다.
예를들어 파티션 크기는 60GB이지만 사용중인 크기가 10GB 라면 dd보다 이미지 복사가 빠릅니다.
이미지 복사로 진행하려고 하지만 GParted에서 파티션 복사(이미지 복사)가 불가능합니다.
! 왜냐하면 현재 사용 중인 파티션은 복사할 수 없기 때문입니다.
터미널에서 강제 옵션을 붙여서 이미지 복사를 시작합니다.
$ sudo e2image -ra -p -f '/dev/sdb7' '/dev/sdc7'
$ sudo e2image -ra -p -f '/dev/sdb6' '/dev/sdc6'
※경고 : 디바이스 이름을 정확히 확인해야 합니다. 복사 원본과 복사 대상(복사할 곳)이 바뀌면 큰일납니다.
dd 또는 이미지 복사 후 파티션에 할당하지 않은 공간이 발생할 수 있습니다.
파일 시스템을 체크하고 크기를 조정합니다.
$ sudo e2fsck -f -y -v -C 0 '/dev/sdc7'
$ sudo resize2fs -p '/dev/sdc7'
$ sudo e2fsck -f -y -v -C 0 '/dev/sdc6'
$ sudo resize2fs -p '/dev/sdc6'
3. 부트로더를 SSD에 설치하기
실컷 복사하고 부팅이 불가능하다면 난감하겠죠?
$ sudo mount /dev/sdc7 /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
$ sudo chroot /mnt
$ sudo update-grub
$ sudo grub-install /dev/sdc
$ exit
$ sudo umount /mnt/dev /mnt/proc /mnt/sys /mnt
시스템 종료 후 기존 HDD를 SSD로 교체합니다.
4. 추가 작업
/etc/fstab의 linux-swap UUID 수정하기
hdd로 부팅하는 시간이 1분 20초였는데 ssd로 부팅하는 시간이 2분 이상으로 느려졌을 때!
스왑 파티션은 복사하지 않고 새로 생성한 것이라서 /etc/fstab에 등록된 linux-swap 파티션의 uuid가 달라서 그런 것입니다.
blkid 명령으로 리눅스 스왑 파티션의 uuid를 알아내서 /etc/fstab을 수정하면 됩니다.
$ sudo blkid /dev/sd*
/dev/sdb5: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="swap" PARTUUID="yyyyyyyy-yy"
hdd를 제거하였기에 ssd의 이름이 /dev/sdc에서 /dev/sdb로 바뀐 것을 볼 수 있습니다.
$ sudo vim.tiny /etc/fstab
...
...
# swap was on /dev/sdb5 during installation
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none swap sw 0 0
저장하고 재시동하면 부팅 시간이 40초 대로 줄어듭니다.
현재 부팅 시간은 20초로 줄어들었는데 이렇게 크게 줄어든 이유를 모르겠습니다.
다른 디스크로 테스트를 여러번 했지만 부팅시간은 40초 대에서 줄어들지 않았습니다.
부트로더 업데이트
필요없는 부팅 목록을 제거하기 위해서 다시 한 번 부트로더를 업데이트 합니다.
$ sudo update-grub
$ sudo grub-install /dev/sdb
리눅스에서 SSD TRIM 사용은?
ssd는 구조적으로 쓰고 지우는 과정 중에서 느려질 수 있기 때문에 필요할 때 TRIM을 해야합니다.
최근 리눅스 배포판은 SSD TRIM을 지원하고 있습니다. 확인하는 방법은
$ sudo hdparm -I /dev/sd* | grep TRIM
* Data Set Management TRIM supported (limit 8 blocks) # 데이터 세트 관리 TRIM 지원
* Deterministic read data after TRIM # TRIM 후 결정적 읽기 데이터
디스크 작업량이 적고, SSD의 여유 공간이 많을 경우!
가끔 fstrim 명령을 내리는 방법도 있습니다. (매주 또는 더 길게)
$ sudo fstrim -a -v
/: 48.4 GiB (51950313472 bytes) trimmed # 1~2분 이내.
/: 0 B (0 bytes) trimmed # 최근에 트림을 했다면 금방 0으로 나옵니다.
많은 파일을 읽고 쓰고, 비디오 파일 등을 자주 편집하거나 SSD가 거의 가득차서 여유가 없는 경우!
/etc/fstab에 discard 옵션을 추가하는 것입니다. noatime, nodiratime 옵션도 함께 추가합니다.
noatime은 파일 시스템에서 inode 액세스 시간을 업데이트하지 않도록 합니다. nodiratime은 디렉토리.
※ (옵션),discard,noatime,nodiratime 쉼표 사이에 빈 공간이 있으면 안 됩니다.
$ sudo vim.tiny /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sdb7 during installation
UUID=xxx... / ext4 errors=remount-ro,discard,noatime,nodiratime 0 1
# /home was on /dev/sdb6 during installation
UUID=xxx... /home ext4 defaults,discard,noatime,nodiratime 0 2
# swap was on /dev/sdb5 during installation
UUID=xxx... none swap sw 0 0
아래 명령으로 트림 동작 여부를 알 수 있다고 하는데 저는 0으로 나옵니다.
$ cat /sys/block/sda/queue/discard_zeroes_data
해피 리눅스!
'리눅스' 카테고리의 다른 글
리눅스에서 안드로이드 폰의 파일 가져오기 (0) | 2021.07.22 |
---|---|
리눅스에서 USB 외장SSD의 TRIM (0) | 2019.12.18 |
우분투 리눅스 10.10에서 컴피즈 기본 지원 (뛰어난 화면 효과) (0) | 2010.10.20 |
우분투 10.04를 새로 설치 (0) | 2010.07.21 |
그루브 grub 2 사용 하기 (우분투 10.04) (0) | 2010.07.21 |