Giảm dung lượng Amazon EBS Volume trên Linux
Bài đăng này đã không được cập nhật trong 3 năm
Bạn đã bao giờ lauch một EC2 instance với một Amazon EBS Volume có dung lượng lớn so với dung lượng cần thiết để sử dụng và bạn không có cách nào để giảm bớt dung lượng? EBS Volume tương đối dễ sử dụng và mở rộng, tuy nhiên lại rất khỏ để giảm bớt dung lượng của nó. Đặc biết nếu nó được mount vào root. Mình đã tìm hiểu rất nhiều cách giảm dung lượng EBS Volume trên internet, đa số sẽ hoạt động tốt nếu nó không được mount vào root, dối với Root Volume thì hầu hết không start EC2 instance được.
Bạn đừng quá lo lắng. Trong bài viết này mình sẽ hướng dẫn bạn rất chi tiết làm thế nào để giảm dung lượng EBS Volume mà không mất dữ liệu giúp bạn tiết kiệm được một chút chi phí.
Tóm tắt một số bước mà chúng ta sẽ phải làm:
- Stop EC2 instance.
- Tạo một snapshot của Volume gốc.
- Tạo một volume từ snapshot.
- Tạo một EC2 instance mới với một EBS Root Volume với dung lượng mong muốn. Volume này sẽ được sử dụng làm Boot Volume sau này.
- Stop EC2 instance mới và sau đó detach EBS Root Volume từ instance mới này.
- Attach tất cả volumes vào EC2 instance.
- Copy data từ volume lớn vào volume nhỏ.
- Detach tất cả volumes từ EC2 instance và attach chỉ volume nhỏ.
- Start EC2 instance.
- Xoá volume cũ, volume được tạo từ snapshot, snapshot và terminate instance mới.
Tất cả cá bước sẽ được giải thích chi tiết dưới đây.
Bắt đầu nhé! Tôi có một EC2 instance tại US East (N.Virginia)
region:
Instance có 1 volume đã được attach, dung lượng của volume là 30GB. Volume được attach tại /dev/xvda
. Instance được launch tại us-east-1d
Availability Zone (AZ). Bạn cần phải nhớ tất cả sẽ chỉ làm việc tốt khi cùng AZ:
Dưới đây là một số chi tiết về volume. Như bạn có thể thấy, tôi đã đặt tên cho Volume gốc là LARGE_VOL
, vì vậy chúng ta có thể xác định nó sau khi có thêm các Volume khác:
Bây giờ hãy stop EC2 instance:
Tiếp theo chúng ta cần tạo snapshot của volume gốc. Chọn volume, click chuột phải sau đó chọn Create Snapshot
:
Ở màn hình tiếp theo, bạn cần nhập vào tên và mô tả cho snapshot. Click Create
để tiếp tục:
Bây giờ snapshot đã được tạo và bạn có thể thấy nó trong mục snapshot:
Tiếp tục, bạn tạo một volume từ snapshot, tôi đặt tên là SNAP_LARGE_VOL
. Chọn snapshot, click chuột phải và chọn Create Volume
:
Trong màn hình tiếp theo, bạn sẽ cần nhấp vào một số thông tin. Điều quan trọng nhất là chọn đúng AZ bạn thấy trước đó. Click Create
để tạo volume:
Bây giờ chúng ta có 2 volumes: volume gốc và volume được tạo từ snapshot. Như bạn có thể thấy, chỉ volume gốc đã được sử dụng, nghĩa là nó đã được được attach vào một EC2 instance:
Bây giờ chúng ta cần tạo một instance với một EBS root volume với dung lượng mong muốn. Tại mục Instances
, click Launch Instance
và chọn một Amazon Machine Image(AMI). Hãy chọn AMI bạn đã sử dụng để launch instance cũ. Trong trường hợp của tôi, tôi chọn Amazon Linux
. Sau đó click Select
để chọn AMI:
Trong màn hình tiếp theo, click vào 4. Add Storage
trên progress tracker để chuyển tới bước Add Storage:
Trong màn hình Add Storage
, bạn cần nhập vào dung lượng mong muốn trong cột Size (GiB)
. Click vào Review and Launch
để chuyển tới bước Review:
Trong màn Review
, click Launch
để launch instance:
Trong màn hình tiếp theo chọn một key pair có sẵn hoặc tạo mới sau đó click Launch Instance
để kết thúc:
Trong màn hình tiếp theo, click vào View Instances
để xem instance của bạn đã được tạo. Bây giờ chúng ta có 2 instances: một instance gốc và một instance mới được tạo dùng để tạo volume nhỏ:
Stop instance mới:
Detach volume nhỏ đã được attach trên instance mới:
Bây giờ chúng ta đã có thể attach các volume mới vào EC2 instance. Click chuột phải vào volume được tạo từ snapshot và chọn Attach Volume
:
Chọn EC2 instance:
Và sau đó chọn Device, nơi mà bạn sẽ attach volume này vào EC2 instance. Bạn có thể giữ giá trị mặc định. Bạn chỉ cần nhớ rằng /dev/sdf
sẽ convert thành /dev/xvdf
. /dev/sdg
sẽ convert thành dev/xvdg
và tương tự. Sau đó click vào Attach
:
Làm tương tự đối với volume nhỏ:
Bây giờ tất cả các volumes đã được attach:
Start EC2 instance:
Chúng ta cần xác nhận các volumes đã được attach đã hoạt động tốt, để làm điều này chúng ta cần ssh tới EC2 instance:
FFW:~ thinhhung$ ssh -i AMAZON_LINUX.pem ec2-user@54.242.29.184
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
No packages needed for security; 2 packages available
Run "sudo yum update" to apply all updates.
Hãy xem các volumes đã được attach tới EC2 instance như thế nào:
[ec2-user@ip-172-31-52-60 ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 30G 0 disk
`-xvda1 202:1 0 30G 0 part
xvdf 202:80 0 30G 0 disk
`-xvdf1 202:81 0 30G 0 part /
xvdg 202:96 0 20G 0 disk
`-xvdg1 202:97 0 20G 0 part
EC2 instance đã được boot từ partition /dev/xvdf1
, chính là partition của volume đã được tạo từ snapshot thay vì volume gốc. Chúng ta sẽ copy dữ liệu từ partition của volume gốc /dev/xvda1
tới volume nhỏ /dev/xvdg
. Trong trường hợp EC2 instance boot từ partition /dev/xvda1
của volume gốc, chúng ta sẽ copy dữ liệu từ parition /dev/xvdf1
của volume được tạo từ snapshot.
Chúng ta sử dụng quyền root:
[ec2-user@ip-172-31-52-60 ~]$ sudo su
[root@ip-172-31-52-60 ec2-user]#
Chúng ta tạo file system trên /dev/xvdg1
: (Chú ý: partition /dev/xvdg1
, không phải volume /dev/xvdg
)
root@ip-172-31-52-60 ec2-user]# mkfs -t ext4 /dev/xvdg1
mke2fs 1.42.12 (29-Aug-2014)
/dev/xvdg1 contains a ext4 file system labelled '/'
last mounted on / on Tue Jun 21 07:33:36 2016
Proceed anyway? (y,n) y
Creating filesystem with 5242363 4k blocks and 1310720 inodes
Filesystem UUID: a9d09ea9-aeb2-416d-af8f-cff5ec29d3f5
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
Bây giờ chúng ta cần tạo 2 directories dùng để mount 2 paritions của volume lớn và nhỏ:
[root@ip-172-31-52-60 ec2-user]# mkdir /mnt/small_vol /mnt/large_vol
[root@ip-172-31-52-60 ec2-user]#
Tiếp theo chúng ta mount các paritions tới các directories mới đã tạo:
[root@ip-172-31-52-60 ec2-user]# mount /dev/xvdg1 /mnt/small_vol
[root@ip-172-31-52-60 ec2-user]# mount /dev/xvda1 /mnt/large_vol
[root@ip-172-31-52-60 ec2-user]#
Kiểm tra xem chúng đã được mount hay chưa:
[root@ip-172-31-52-60 ec2-user]# mount | grep xvd
/dev/xvdf1 on / type ext4 (rw,noatime,data=ordered)
/dev/xvdg1 on /mnt/small_vol type ext4 (rw,relatime,data=ordered)
/dev/xvda1 on /mnt/large_vol type ext4 (rw,relatime,data=ordered)
[root@ip-172-31-52-60 ec2-user]#
Tiếp theo chúng ta cần copy dữ liệu từ directory large_vol sang directory small_vol như thế này:
[root@ip-172-31-52-60 ec2-user]# rsync -ax /mnt/large_vol/ /mnt/small_vol
[root@ip-172-31-52-60 ec2-user]#
Chú ý lệnh rsync
: directory large_vol kết thúc bởi /
trong khi directory small_vol thì không.
Unmount các paritions:
[root@ip-172-31-52-60 ec2-user]# umount /mnt/large_vol
[root@ip-172-31-52-60 ec2-user]# umount /mnt/small_vol
[root@ip-172-31-52-60 ec2-user]#
Chắc chắn rằng parition của volume nhỏ có e2label giống với root partition. Hãy xem e2label trên root partition:
[root@ip-172-31-52-60 ec2-user]# e2label /dev/xvdf1
/
[root@ip-172-31-52-60 ec2-user]#
Update e2label trên parition của volume nhỏ:
[root@ip-172-31-52-60 ec2-user]# e2label /dev/xvdg1 /
[root@ip-172-31-52-60 ec2-user]#
Và bây giờ bạn có thể logout khỏi EC2 instance và stop nó.
Detach tất cả volumes từ EC2 instance:
Và attach chỉ volume nhỏ:
Bạn cần cẩn thận khi chọn device. Nó phải giống với device đã được sử dụng bởi volume gốc bạn đã thấy trong những phần đầu bài viết:
Start EC2 instance:
Và nó đã boot thành công, bạn có thế ssh tới nó:
FFW:~ thinhhung$ ssh -i AMAZON_LINUX.pem ec2-user@54.233.154.216
The authenticity of host '54.233.154.216 (54.233.154.216)' can't be established.
ECDSA key fingerprint is e2:b3:87:1f:21:4b:5c:3f:d9:1a:87:17:df:3e:d9:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '54.233.154.216' (ECDSA) to the list of known hosts.
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
No packages needed for security; 2 packages available
Run "sudo yum update" to apply all updates.
Tất cả đã hoàn thành. Bây giờ bạn đã có root volume với dung lượng mong muốn.
Xoá volume gốc và volume được tạo từ snapshot:
Xoá snapshot:
Terminate EC2 instance mới dùng để tạo volume nhỏ:
All rights reserved