RHEL6 AMIでブート領域を拡張する
背景
RHEL6系のAMIからEC2を起動する際にブート用EBSのサイズを大きくしても、OSからは認識されない。(Amazon Linuxは起動時に自動的にサイズを合わせてくれる)
考察
パーティションがGPTになっている。かつ、起動時に対応してくれるようなスクリプトがAMIに仕込まれていない。
対処方法(サマリ)
- 該当インスタンスのBoot EBSを100GBに指定して起動
- 該当インスタンス( A)をstopして /dev/sda1 にアタッチされているEBSをデタッチ
- 作業用インスタンス(B)を別途起動し、上記EBSを/dev/sdb にアタッチ
- 作業用インスタンス(B)にて作業 ( パーティションサイズ変更※ & ファイルシステムサイズ拡張※)
- 上記EBSを作業用インスタンス(B)からデタッチし、該当インスタンス(A)の /dev/sda1にアタッチ
- 該当インスタンス(A)をstartする
対処方法(詳細)
肝はこちらに書いてあるが、gdiskを使った。
作業用インスタンス(B)にて
まずはgdiskをインストール
$ sudo yum -y install gdisk
gdiskを使用して、まずはパーティション情報を表示させる。赤字はメモっとく。
$ sudo gdisk /dev/svdb
Command (? for help): p
Disk /dev/xvdb: 209715200 sectors, 100.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 20971486
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 20971486 10.0 GiB EF00 Linux
パーティションを削除する
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): Y
新しいパーティションを作成する
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-209715166, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'
Expert モードに入って、ディスクGUIDを元に戻す(最初に表示した時のやつ)
Command (? for help): x
Expert command (? for help): g
Enter the disk's unique GUID ('R' to randomize): C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4
The new disk GUID is C0E76C1A-B601-48A7-A1E0-CC49DEFF6CB4
変更をディスクに書き込む
Expert command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/xvdb.
The operation has completed successfully.
念の為、ファイスシステムのチェック。
$ sudo e2fsck -f /dev/xvdb1
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 10G 0 disk
└─xvda1 202:1 0 6G 0 part /
xvdb 202:16 0 100G 0 disk
└─xvdb1 202:17 0 100G 0 part
lsblkの結果を見る限り、これだけだと、パーティションは拡張したがファイルシステムは拡張していないので、拡張しておく。
$ sudo resize2fs /dev/xvdb1
この、ファイルシステム拡張についてだけが、こっち↓に書いてあって、ハマるポイント。
うまくいったら、元のインスタンスの/dev/sda1 にアタッチする。
C4.8xlarge対応 HVM AMI ( SR-IOVも対応)
2015/8/15 CentOS6.7, RHEL6.7が出ているので、こちらのAMIは公開を取りやめます。
ーーー
C4.8xlargeでも起動するRHEL6.6とCentOS6.6を公開。
(もちろん、それ以外のHVM対応インスタンスタイプでも起動する。)
簡単な内容
(作成方法は別エントリ)
- カーネル 2.6.32-504.3.3.el6.x86_64
- SR-IOV Driver ixgbevf-2.16.1 設定済み
- 追加パッケージ : gcc,make,kernel-deve,perl,man,pciutils
- ログインアカウント: ec2-user
- Cloud-init未対応
RHEL
RHEL6.6_maxcpus-32-20150113
- Virginia:ami-4a562422
- Oregon: ami-d3f0ace3
- Tokyo:ami-64e1f165
RHEL6.6_HVM_SR-IOV_ixgbevf-2.16.1-maxcpus-18-20150113
- Virginia:ami-1451237c
- Oregon:ami-bdf0ac8d
- Tokyo:ami-92e8f893
CentOS
CentOS6.6_maxcpus-32-20150114
- Virginia: ami-d2166bba
- Oregon: ami-5d356a6d
- Tokyo: ami-c66b78c7
CentOS6.6_HVM_SR-IOV_ixgbevf-2.16.1-maxcpus-18-20150114
- Virginia: ami-e0106d88
- Oregon: ami-fb356acb
- Tokyo: ami-c26b78c3
(ブートパラメータにmaxcpus=18 を記載しているので、c4.8xlargeを物理18コアで使える。c3.8xlarge, cc2.8xlargeでは 物理16コアで利用可能)
注意
yum updateでカーネルアップデートして、SR-IOVドライバが読み込めなくなった時は、こちらを参照のこと。
SR-IOV対応版AMIでのカーネルアップデート時は注意 (自分用メモ) - matetsuだもんで
RHEL7.0, 6.5でタイムゾーン設定
忘れないようにメモ。
こちらも参考に
実践でも役立つLPICドリル(8):Linux時刻管理の仕組みと設定 (1/4) - @IT
RHEL6.5 HVM AMI (RHEL-6.5_HVM_GA-x86_64-7-HVM-Hourly2 - ami-53641e52 Tokyo Region)の場合
$ ls -l /etc/localtime -rw-r--r--. 1 root root 3519 4月 21 15:49 2014 /etc/localtime $ diff /etc/localtime /usr/share/zoneinfo/America/New_York $ date 2014年 8月 5日 火曜日 21:32:29 EDT
と、/etc/localtime がシンボリックリンクではなく実体コピーとなっていてEDTとなる。
$ sudo ln -f -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime $ ls -l /etc/localtime lrwxrwxrwx. 1 root root 30 8月 6 10:34 2014 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo $ date 2014年 8月 6日 水曜日 10:34:27 JST
となる
注意: /etc/adjtime にUTCと書いてあること(LOCALと書いていないこと)を確認する。EC2の物理マシンはUTCで設定されているので念の為。
RHEL7.0 HVM AMI (ami-87206d86 Tokyo Region)の場合
ls -l /etc/localtime
lrwxrwxrwx. 1 root root 38 5月 22 15:16 /etc/localtime -> ../usr/share/zoneinfo/America/New_York
となっているので、タイムゾーンは以下のようにEDTとなっている
$ date 2014年 8月 5日 火曜日 21:11:40 EDT
そこで
$ sudo timedatectl set-timezone Asia/Tokyo
とすると、
$ ls -l /etc/localtime lrwxrwxrwx. 1 root root 32 8月 6 10:37 /etc/localtime -> ../usr/share/zoneinfo/Asia/Tokyo $ date 2014年 8月 6日 水曜日 10:18:18 JST
となる
参考 Chapter 2. Configuring the Date and Time
t2.microでNATインスタンスを作る
2015/12/18追記
マネージドNATが出たので、わざわざNATを建てずにこちらをまず検討すると良いと思う。
Amazon Web Services ブログ: 【新機能】マネージドNATゲートウェイが利用可能に
ーーー
t2.microでNATインスタンスを建てようとするも、NAT用AMIは PVしかない(2014年7月11日時点)という理由で諦めてる人向けのメモ。
(NATインスタンスの建て方自体は、このページ末尾のSlideshareを参考に)
基本的にやることはPVもHVMも変わらず、
- ip_forward有効にしているLinuxを起動
- EC2の設定で src/dst checkをdisabledにしておく
- routing tableを適切に設定しておく
これさえキチンとしていれば、たいていのLinuxで( Vyatta等を含む)動作するので、HVMかPVかはそもそも関係ない。(NAT用AMIは、ip_forwardが有効になっている Amazon Linuxでしかない)
ip_forwardを有効にするためにはこのスクリプトを流す。(動作確認は Amazon Linux AMI 2014.03.2 HVM で実施)
NAT Instances - Amazon Virtual Private Cloud
SESの 送信クオータについて
SESチームのブログが出ていた。
All about SES daily quota - Amazon SES Blog
項目だけメモ。
- なぜ送信クオータがあるのか?
- どのようにして自分のクオータを確認するのか?
- クオータとTPS制限に関係はあるのか?
- いつクオータはリセットされるのか?
- クオータを超えて送信するとどうなるのか?
- 同報送信の場合、1通とカウントされるのか?
- クオータの段階はあるのか?
- どうしたらクオータを増やせるのか?
参考資料
よくある質問 - Amazon SES(クラウドベースのメールサービス Amazon Simple Email Service) | アマゾン ウェブ サービス(AWS 日本語)
Amazon Web Services ブログ: 【AWS発表】Trusted Advisor アップデート - 新しいチェックと新しいCloudTrailのリージョン ( 2014/5/23 Daily quotaを確認できるようになった)
[AWSマイスターシリーズ] Amazon Simple Email Service
VM ImportしたCentOS6.5のAMIを作る前の手順
VM Importで持ってきたCentOS5.6のインスタンスからそのままAMIを作成してもよいが、いくつかEC2ぽくない部分があるので、AMI作成前にこれらを施す。
- key pairのpublickeyデプロイスクリプトを仕込む
- rootパスワードを起動時にランダム生成・セットするスクリプト
- udev で eth0のMACアドレスを保持しないようにする
- sshdで rootのパスワードログイン禁止、DNS checks無効化
- ホストキーペアを削除
- historyを削除
- ~/.ssh/ 以下を削除
- cloud-init の仕組みを入れる
- 別ユーザ(例: ec2-user)を作成し、rootログインを禁止する
参考 : http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/building-shared-amis.html
手順
rootパスワードのランダム化を /etc/rc.d/rc.localに追記
# set a random pass on first boot if [ -f /root/firstrun ]; then dd if=/dev/urandom count=50|md5sum|passwd --stdin root passwd -l root rm /root/firstrun fi
このスクリプトを動作させるためにフラグファイルを作っておく
touch /root/firstrun
publickeyの埋め込み処理を、 /etc/rc.d/rc.localに追記
if [ ! -d /root/.ssh ]; then mkdir -m 0700 -p /root/.ssh restorecon /root/.ssh fi # Get the root ssh key setup ReTry=0 while [ ! -f /root/.ssh/authorized_keys ] && [ $ReTry -lt 5 ]; do sleep 2 curl -f http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /root/.ssh/authorized_keys ReTry=$[Retry+1] done chmod 600 /root/.ssh/authorized_keys && restorecon /root/.ssh/authorized_keys
udevでのethX MACアドレス 自動保存の無効化
rm /etc/udev/rules.d/70-persistent-net.rules cp /lib/udev/rules.d/75-persistent-net-generator.rules ~ vi /lib/udev/rules.d/75-persistent-net-generator.rules diff /lib/udev/rules.d/75-persistent-net-generator.rules ~/75-persistent-net-generator.rules 93c93 < #DRIVERS=="?*", IMPORT{program}="write_net_rules" --- > DRIVERS=="?*", IMPORT{program}="write_net_rules" reboot
上記手順を終えて、create imageする
LVMなEBSを別インスタンスにアタッチして中身を見る
EC2インスタンスで、grubをいじったり、ドライバをいじったりしてrebootするとうまくいかない場合は、一旦インスタンスをstopし、/dev/sda1 にアタッチされているEBSをでタッチし、別インスタンスの/dev/sdf などにアタッチして、dmesgなどを確認することができる。
# mount /dev/sdf /mnt # cd /mnt/var/log/
古典的なパーティション・フォーマットであれば上記手順でよいが、 LVMなEBSの場合はデバイスがすぐに出てこないので、上記手順では参照できない。
# pvs PV VG Fmt Attr PSize PFree /dev/sdf2 VolGroup lvm2 a-- 7.51g 0 # lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_root VolGroup -wi-ao---- 6.71g lv_swap VolGroup -wi------- 816.00m # ls /dev/VolGroup ls: cannot access /dev/VolGroup: No such file or directory
そこで、lvchange(8)を使う
### デバイスを有効にしてマウント # lvchange --available y /dev/VolGroup/lv_root # mount /dev/VolGroup/lv_root /mnt
# cd /mnt/var/log ### 作業が終了したらアンマウントしてデバイスを無効化 # umount /mnt # lvchange --available n /dev/VolGroup/lv_root