블로그

Uncategorized

[AWS]아마존 웹서비스 EC2 EBS 스토리지 확장시 문제가 있을때

안녕하세요 ?
국내 최초의 아마존 웹서비스를 이용한 워드프레스 쇼핑몰 웹호스팅을 시작한 다보리의 “아마존 웹서비스 매뉴얼”입니다. 다보리의 아마존 웹서비스 매뉴얼은 이미 아마존 매뉴얼에 있는 내용을 낚시밑밥처럼 만든 것이 아니라 매뉴얼에 나오지 않지만 유용한 팁이나 쓸데없는 노가다를 줄여줄 수 있는 내용들로만 구성하고 있습니다.
오늘은 아마존 웹서비스 확장시 resize2fs  /dev/xvda 시 (일반적으로는 안되니까 빨리 진행하려면 바로  fdisk 작업부터 들어갈 것 !)
resize2fs 1.42 (29-Nov-2011)
resize2fs: Device or resource busy while trying to open /dev/sda5
Couldn’t find valid filesystem superblock.
와 같은 후덜덜한 에러가 나서 어쩌지 못할때 유용한 팁이 되겠습니다.

EC2 centOS 인스턴스 스토리지 확장시 방법
원문 링크 : http://adrenal.tistory.com/11
아마존에서 특별한 설정변경없이 EC2 인스턴스를 생성하면 기본적으로 8G의 디스크용량을 가지게 된다. 이렇게 사용하다가 용량이 부족하다 싶으면 사용하던 데이터를 손대지 않고 스토리지의 공간을 확장할 수 있다.
기본적인 개념은 아래와 같다.
EC2를 정지시킨다.
연결되어 있는 EBS를 detach 시킨다.
detach 된 EBS volume의 snapshot을 생성한다.
생성된 snapshot으로 새로운 EBS volume을 생성한다. 이때 생성되는 EBS volume의 크기를 원하는 사이즈로 지정한다.
EC2에 새로 생성된 EBS volume을 attach 한다.
EC2 인스턴스에 접속해서 디스크크기를 재설정한다.
대략 위와 같은 과정이라고 보면 된다.
쉽게 설명하면 서버에서 기존의 저장장치를 때어내고 새로만든 큰 저장장치를 붙이는 과정이다. 이과정에서 새로만든 저장장치에 기존 데이터가 그대로 들어있도록 만드는 것이 포인트라고 할 수 있다.
아마존 웹 서비스 콘솔에서 위와 같은 과정으로 EC2 인스턴스의 스토리지를 확장할 수 있다.
위 그림만 이해하면 콘솔의 메뉴를 열어 보고 어렵지 않게 진행할 수 있다. 이럴 경우 6번 과정만 주의 해서 봐도 된다. 처음에 5번까지만 하고 인스턴스 공간이이 확장이 안되어 있어서 해맸었다.
설치된 OS: centOS 6.5
상세과정을 살펴보자.
1. EC2를 정지시킨다.
아마존 EC2콘솔 INSTANCES -> instances 메뉴에서 실행하려는 인스턴스 선택후 마우스오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 뜬다.
여기서 Stop을 실행한다.
2. 연결되어 있는 EBS를 detach 시킨다.
아마존 EC2콘솔 ELASTIC BLOCK STORE -> Volumes 메뉴에서 정지시킨 인스턴스의 볼륨을 찾아서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.
여기서 Detach Volume을 선택한다. 참고로 볼륨의 상태가 in-use 상태여야만 Detach Volume을 실행할 수 있다.
만약 확장하려는 인스턴스가 사용중인 볼륨이 어떤것인지 확인하려면 Volume 목록에서 Attachement Information 항목을 보면 된다. 이곳에 인스턴스의 이름과 Id가 표시된다.
그리고 위 그림의 오른쪽 끝에 적힌 /dev/sda1.. 과 같은 경로를 기억해두거나 적어둔다. 새로 Attach할때 이 경로를 입력해야 한다.
3. detach 된 EBS volume의 snapshot을 생성한다.
정지된 볼륨에서 다시 마우스 오른쪽 버튼을 눌려서 아래와 같이 Create Snapshot을 선택한다.
(인스턴스 실행중에도 스냅샷을 만들 수 잇으나 disk IO가 있는중일 수 있기때문에 문제가 될 수 있을 것으로 판단하고 인트턴스 정지후에 스냅샷을 생성하였다.)
4. 생성된 snapshot으로 새로운 EBS volume을 생성한다. 이때 생성되는 EBS volume의 크기를 원하는 사이즈로 지정한다.
아마존 EC2콘솔 ELASTIC BLOCK STORE -> Snapshots 메뉴에서 방금 생성한 스냅샵을 찾아서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.
여기서 Create Volume을 선택한다.
다음으로 볼륨 생성팝업차이 뜨는데 이때 아래와 같이 Size를 확장하려는 사이즈로 지정해준다. 기본값이 현재 사이즈 이므로 방심하면 그냥 넘어가서 크기가 같은 볼륨을 생성해버리게 되니 주의
5. EC2에 새로 생성된 EBS volume을 attach 한다.
새로 생성된 볼륨은 상태가 available 상태로 되어 있다. 여기서 마우스 오른쪽 버튼을 누르면 아래와 같이 팝업 메뉴가 나온다.
여기서 Attach Volume을 선택한다.
다음으로 나오는 어태치 팝업에서 아래와 같이 instance를 지정해준다. 최초에 stop 시킨 인스턴스의 아이디나 이름 등을 입력하면 된다.
그리고 Device에서 원래의 볼륨이 마운트되어 있던 경로를 똑같이 적는다. 2번과정에서 /dev/sda1 경로 였다.
EC2 인스턴스에 접속해서 디스크크기를 재설정한다.
기본적으로 EC2와 연결된 EBS Volume의 용량을 늘려주면 스토리지 확장이 된다고 하는데 여기까지 진행하고 인스턴스를 재시작한후
막상 디스크 용량을 확인해보면 전혀 늘어나지 않았다.
아래와 같이 command 처리로 늘어난 EBS 스토리지 공간을 OS에서 인식 할 수 있게 되었다.
위와 같이 처음에 df -h 로 디스크 공간을 확인해보면 7.9G만 잡혀있는 상태이다.
그러나 fdisk -l로 확인해보면 /dev/xvda 디스크용량이 107.4G 인것이 확인된다.
이상태에서 resize2fs /dev/xvda 명령을 실행해서 파일시스템을 재구축해야 한다. (오래 걸림)
다시 df -h 로 용량을 확인해보면 전체 디스크 용량이 모두 사용가능한 공간이 되었음을 확인 할 수 있다.
저 명령실행전에 몽고 디비가 실행중이었는데 용량 제산정 과정이나 진행후에 프로세스에 전혀 지장이 없었다.
파일 시스템 재구축 작업은 서비스 운영중에도 사용할 수 있을 것으로 판단된다.
스토리지 확장관련 아마존 레퍼런스 문서: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html#d0e52667
아마존의 위 문서에서 스토리지 확장하는 방법이 자세하게 나와 있다. (영어)
자 그러면 위의 resize2fs가 통하지 않는 경우는 어떻하나요 ?
아래와 같은 방식으로 fdisk에서 파티션을 늘여준다음 진행합니다. 보시죠.
중간에 보면 start sector를 2048로 잡아주는 것이 나오는데 매우 중요한 포인트 입니다. 잘은 모르지만 Linux boot sector의 여유값을 반드시 줘야 하는 것처럼 보이는데 비슷하게 하지 않으면 reboot후 로그인 안되므로 감안하시기 바랍니다. 시간되는대로 fdisk에 대해 좀더 상세히 공부해서 추가하도록 하겠습니다.
원문출처 : http://unix.stackexchange.com/questions/138090/cant-resize-a-partition-using-resize2fs
http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ebs-expand-volume.html
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 6.0G 2.0G 3.7G 35% /
tmpfs 15G 0 15G 0% /dev/shm
# fdisk -l
Disk /dev/xvda: 21.5 GB, 21474836480 bytes
97 heads, 17 sectors/track, 25435 cylinders
Units = cylinders of 1649 * 512 = 844288 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003b587
Device Boot Start End Blocks Id System
/dev/xvda1 * 2 7632 6291456 83 Linux
# fdisk /dev/xvda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command '
c') and change display units to
sectors (command '
u').
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): p
Disk /dev/xvda: 21.5 GB, 21474836480 bytes
97 heads, 17 sectors/track, 25435 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003b587
Device Boot Start End Blocks Id System
/dev/xvda1 * 2048 12584959 6291456 83 Linux
Command (m for help): d
Selected partition 1
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p <>
Partition number (1-4): 1
First sector (17-41943039, default 17): 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): <>
Using default value 41943039
Command (m for help): p
Disk /dev/xvda: 21.5 GB, 21474836480 bytes
97 heads, 17 sectors/track, 25435 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003b587
Device Boot Start End Blocks Id System
/dev/xvda1 2048 41943039 20970496 83 Linux
Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
# reboot
(!!중요) reboot 후에는 반드시 resize2fs /dev/xvda1 한 후 확장이 마무리된다.
# resize2fs /dev/xvda1
resize2fs 1.41.12 (17-May-2010)
The filesystem is already 5242624 blocks long. Nothing to do!
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 20G 2.0G 17G 11% /
tmpfs 15G 0 15G 0% /dev/shm

Leave a Reply

Your email address will not be published. Required fields are marked *