Giảm dung lượng Amazon EBS Volume trên Linux
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 ...
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ỏ: