參考資料:
https://www.caseylabs.com/remove-the-aws-marketplace-code-from-a-centos-ami/
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/storage_expand_partition.htmlhtml
背景介紹:
在AWS EC2中,從Marketplace裏面能夠很方便的選擇最新的CentOS6的官方Minimal版本的AMI,來建立Instance。
可是這裏面卻埋了一個大坑,那就是,全部基於Marketplace裏面的AMI所建立的Instance,都會帶有一個Marketplace code。
它會致使你沒法經過爲現有根分區所在的EBS Volume建立Snapshot和新的Volume的方式來對其擴容。
在Detach了現有的根分區所在的Volume後,將沒法再次將其Attach到Instance當中,在Attach新的Volume時也會遇到相同的報錯:node
1 |
Client.OperationNotPermitted: |
2 |
'vol-xxxxxxx' with Marketplace codes may not be attached as a secondary device. |
這個Marketplace code,顧名思義,應該就是爲了保護一些付費的AMI不被隨意的克隆,但不知道爲何沒有對費用爲$0的CentOS6 AMI作單獨的處理。
上面的限制,主要影響到的是,默認建立好的CentOS6 Instance的EBS Volume只有8G,即便在建立時指定了50G的EBS Volume,建立後的根分區空間也只有8G。這樣的大小是沒法知足線上需求的,只能對其進行擴容,而由於有上面的Marketplace code的限制,又使擴容變得很艱難。
還好最終我經過參考上面的兩篇文章,從官方的CentOS6 AMI中移除了Marketplace code,併成功的對根分區進行了擴容並建立了相應的AMI。linux
具體步驟:
1. 從現有的CentOS6 AMI中移除Marketplace code
1.1 從AWS的Marketplace搜索CentOS6 AMI,並建立一個根分區所在的EBS Volume爲8G(默認大小)的Instance;
1.2 在AWS EC2 web console中,再建立一個新的大小爲8G的EBS Volume;
1.3 將新建立的EBS Volume Attach到Instance上,一般會默認識別爲/dev/xvdj(HVM版本的AMI會識別爲/dev/xvdf);
1.4 經過SSH登錄到Instance,並經過dd克隆根分區所在的EBS Volume(HVM版本的AMI會將根目錄所在的EBS Volume識別爲/dev/xvda):web
1 |
dd bs=65536 if=/dev/xvde of=/dev/xvdj |
1.5 當克隆完成之後,關閉Instance;
1.6 Detach現有根分區所在的EBS Volume;
1.7 Detach新建立的EBS Volume,並從新Attach到Instance,做爲/dev/sda(HVM版本的AMI須要指定爲/dev/sda1);
1.8 啓動Instance;
1.9 在確認Instance正常啓動後,在EC2 web console中右鍵點擊Instance,並選擇Create Image,便可建立一個新的不含Marketplace code的CentOS6 AMI了,我通常將其命名爲official_centos6_x86_64_minimal_ebs8g。centos
2. 將現有的AMI根分區所在的EBS Volume擴容爲50G,並建立新的AMI official_centos6_x86_64_minimal_ebs50g
2.1 基於AMI official_centos6_x86_64_minimal_ebs8g建立一個Instance;
2.2 爲Instance所在的EBS Volume建立一個Snapshot;
2.3 建立一個新的大小爲50G的Volume,幷包含剛剛建立的Snapshot;
2.4 將新建立的Volume Attach到Instance,做爲第二塊EBS Volume,默認會識別爲/dev/xvdj(HVM版本的AMI會識別爲/dev/xvdf);
2.5 在Instance上對第二塊EBS Volume進行擴容,詳細步驟以下(HVM版本的AMI會將根目錄所在的EBS Volume識別爲/dev/xvda):ide
01 |
[root@ip-172-17-4-12 ~]# parted /dev/xvdj |
04 |
Welcome to GNU Parted! Type 'help' to view a list of commands. |
07 |
Model: Xen Virtual Block Device (xvd) |
08 |
Disk /dev/xvdj: 104857600s |
09 |
Sector size (logical/physical): 512B/512B |
10 |
Partition Table: msdos |
12 |
Number Start End Size Type File system Flags |
13 |
1 2048s 16777215s 16775168s primary ext4 boot |
16 |
(parted) mkpart primary 2048s 100% |
18 |
Model: Xen Virtual Block Device (xvd) |
19 |
Disk /dev/xvdj: 104857600s |
20 |
Sector size (logical/physical): 512B/512B |
21 |
Partition Table: msdos |
23 |
Number Start End Size Type File system Flags |
24 |
1 2048s 104857599s 104855552s primary ext4 |
26 |
(parted) set 1 boot on |
28 |
Model: Xen Virtual Block Device (xvd) |
29 |
Disk /dev/xvdj: 104857600s |
30 |
Sector size (logical/physical): 512B/512B |
31 |
Partition Table: msdos |
33 |
Number Start End Size Type File system Flags |
34 |
1 2048s 104857599s 104855552s primary ext4 boot |
37 |
Information: You may need to update /etc/fstab. |
39 |
[root@ip-172-17-4-12 ~]# e2fsck -f /dev/xvdj1 |
40 |
e2fsck 1.41.12 (17-May-2010) |
41 |
Superblock needs_recovery flag is clear, but journal has data. |
42 |
Run journal anyway<y>? yes |
44 |
/dev/xvdj1: recovering journal |
45 |
Pass 1: Checking inodes, blocks, and sizes |
46 |
Pass 2: Checking directory structure |
47 |
Pass 3: Checking directory connectivity |
48 |
Pass 4: Checking reference counts |
49 |
Pass 5: Checking group summary information |
51 |
/dev/xvdj1: ***** FILE SYSTEM WAS MODIFIED ***** |
52 |
/dev/xvdj1: 18425/524288 files (0.2% non-contiguous), 243772/2096896 blocks |
54 |
[root@ip-172-17-4-12 ~]# lsblk |
55 |
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT |
56 |
xvde 202:0 0 8G 0 disk |
57 |
└─xvde1 202:1 0 8G 0 part / |
58 |
xvdj 202:80 0 50G 0 disk |
59 |
└─xvdj1 202: 0 50G 0 part |
61 |
[root@ip-172-17-4-12 ~]# resize2fs /dev/xvdj1 |
62 |
resize2fs 1.41.12 (17-May-2010) |
63 |
Resizing the filesystem on /dev/xvdj1 to 13106944 (4k) blocks. |
64 |
The filesystem on /dev/xvdj1 is now 13106944 blocks long. |
2.6 關閉Instance;
2.7 Detach現有根分區所在的EBS Volume;
2.8 Detach擴容後的第二塊EBS Volume,並從新Attach到Instance,做爲/dev/sda(HVM版本的AMI須要指定爲/dev/sda1);
2.9 啓動Instance;
2.10 在確認Instance正常啓動後,在EC2 web console中右鍵點擊Instance,並選擇Create Image,便可建立一個新的根分區大小爲50G的CentOS6 AMI了,我通常將其命名爲official_centos6_x86_64_minimal_ebs50g。
來源:http://heylinux.com/archives/3434.html
ui