Amazon EC2(Amazon Linux2)での色々設定

最近Redhatのサーバ構築案件があり、練習がてらAmazon EC2(Amazon Linux2)で色々お試ししましたので、備忘録がてら記事にします。利用したAMIはAmazon Linux2ですがRedhat系とほぼ同じコマンドで行けるので、練習環境があるのはありがたいです。

#前提条件
- 使用するインスタンスはAmazon Linux2 です。
- コマンド入力はEC2にログインして、Rootユーザに昇格した状態で行うものとします。
- 各種ファイル（/etc/fstabなど）を設定するときは必ずバックアップを取得してから中身を変更してください。
- 実行しているコマンドについては詳細な解説までは載せません。他に詳しく記載されている記事があるのでそちらを参照してください。LPIC Lv2まで勉強した人は何となく見たことがあるコマンドだと思います。

#複数EBSをアタッチして、LVM論理ボリュームを設定する
###概要
EC2(Amazon Linux2)のルートボリュームはデフォルト=/dev/xvda というデバイス名になっています。
追加でEBSをアタッチすると/dev/xvdb,/dev/xvdcという形でデバイス認識されます。
今回は追加で2つのEBSをアタッチして、LVM論理ボリュームとして設定したいと思います。
なおEBSの追加アタッチ方法やEC2初期設定については割愛します。

イメージ図
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/fb7bdd0a-f53e-0e42-df96-6e20bda2461a.png)

###手順

①アタッチしたEBSがどういうデバイス名で認識されているか確認する

     [root@AWS ec2-user]# lsblk　　→認識されているデバイスの一覧を表示
     NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
     xvda    202:0    0   8G  0 disk 
     └─xvda1 202:1    0   8G  0 part /
     xvdb    202:16   0   8G  0 disk 
     xvdc    202:32   0   8G  0 disk 

xvdaというディスクにxvda1で１つパーティションが割り当てられており、マウント先はルート（”/”）になっており、
追加で割り当てたEBSはxvdbとxvdcというディスク名で認識されていることがわかりました。

②パーティションを設定する

 ではxvdbにパーティションを設定していきます。

    [root@AWS ec2-user]# parted /dev/xvdb
    GNU Parted 3.1
    Using /dev/xvdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
      (parted) mklabel gpt　→パーティションのタイプをGPTに指定します。
      (parted) mkpatrt
               Partition name?  []? test-xvdb　　　→適当に名前を付けます
               File system type?  [ext2]? ext4　　→任意のファイルシステムを設定します
               Start? 0%　　　→ディスクのどこから利用し始めるかを記載します。今回はディスクの先頭から使っていくので0％で指定します。
               End? 100%　　→ディスクのどこまで利用するか記載します。今回はディスクの最後まで使うので100％で指定します。
      (parted) p　→今の設定状況の確認

    Model: Xen Virtual Block Device (xvd)
    Disk /dev/xvdb: 8590MB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 

    Number  Start   End     Size    File system  Name       Flags
     1      1049kB  8589MB  8588MB               test-xvdb


       (parted) set 1 lvm on　　→対象となるパーティションナンバー「1」に対してLVMを有効にします。
       (parted) p
    Model: Xen Virtual Block Device (xvd)
    Disk /dev/xvdb: 8590MB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 

    Number  Start   End     Size    File system  Name       Flags
     1      1049kB  8589MB  8588MB               test-xvdb  lvm

      (parted) q　→終了
    Information: You may need to update /etc/fstab.　→/etc/fstabの修正も忘れずに！と注意されるので、覚えておきましょう。

xvdcも同様にパーティションを設定しておきます。

もう１度認識されてデバイスの一覧を表示させて、パーティション設定を確認します。

    [root@AWS ec2-user]# lsblk
    NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0   8G  0 disk 
    └─xvda1 202:1    0   8G  0 part /
    xvdb    202:16   0   8G  0 disk 
    └─xvdb1 202:17   0   8G  0 part 
    xvdc    202:32   0   8G  0 disk 
    └─xvdc1 202:33   0   8G  0 part 

xvdbとxvdcの下にTYPEがpartになっているxvdb1とxvdc1が追加されているのでＯＫです。




③物理ボリュームの作成
xvdb1に物理ボリュームを設定します。

    [root@AWS ec2-user]# pvcreate /dev/xvdb1
      Physical volume "/dev/xvdb1" successfully created.
xvdc1に対しても同様に設定します。
では物理ボリュームを認識できているかを確認します。

    [root@AWS ec2-user]# pvdisplay
      "/dev/sdc1" is a new physical volume of "<8.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdc1
      VG Name               
      PV Size               <8.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               R2E3qM-mnNS-ixxx-RI1d-S9Yd-SeuP-xxxxx
   
      "/dev/sdb1" is a new physical volume of "<8.00 GiB"
      --- NEW Physical volume ---
      PV Name               /dev/sdb1
      VG Name               
      PV Size               <8.00 GiB
      Allocatable           NO
      PE Size               0   
      Total PE              0
      Free PE               0
      Allocated PE          0
      PV UUID               kt238d-oMLJ-xxxx-81yZ-Tvvh-iW1K-xxxxx

新しく/dev/sdb1と/dev/sdc1が出来ていることがわかりました。





④ボリュームグループの作成
物理ボリュームをボリュームグループとして登録していきます。ボリュームグループ名はtest-vgとします。

    #ボリュームグループtest-vgを作成し/dev/sdb1 を追加します。
    [root@AWS ec2-user]# vgcreate test-vg /dev/sdb1
    Volume group "test-vg" successfully created

    #test-vgに/dev/sdc1も追加します
    [root@AWS ec2-user]# vgextend test-vg /dev/sdc1
    Volume group "test-vg" successfully extended



⑤論理ボリュームの作成
ボリュームグループを使って、論理ボリュームを作成します。

    [root@AWS ec2-user]# lvcreate -l 100%VG test-vg -n test-lvg　　
    #lオプションで 容量指定（test-vgの容量100%使用）し、nオプションで論理ボリューム名をtest-lvgに設定
    Logical volume "test-lvg" created.

では論理ボリュームが作成されたか確認します。

    [root@AWS ec2-user]# lvdisplay
      --- Logical volume ---
      LV Path                /dev/test-vg/test-lvg
      LV Name                test-lvg
      VG Name                test-vg
      LV UUID                GjcYa1-kNKy-hll3-oxnT-xxxx-Phri-xxxxx
      LV Write Access        read/write
      LV Creation host, time AWS.ap-northeast-1.compute.internal, 2021-07-26 15:15:22 +0000
      LV Status              available
      # open                 0
      LV Size                15.99 GiB
      Current LE             4094
      Segments               2
      Allocation             inherit
      Read ahead sectors     auto
      - currently set to     256
      Block device           253:0


上記からサイズ15.99Gibの論理ボリュームが作成されていることがわかります。
今回は8GibのEBSを２つ使ったので約16GiBとなっています。


⑥ファイルシステムの作成
では作成した論理ボリュームにファイルシステムを作成しましょう。

    [root@AWS ec2-user]# mkfs -t ext4 /dev/test-vg/test-lvg
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    1048576 inodes, 4192256 blocks
    209612 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2151677952
    128 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000

    Allocating group tables:   0/128       done                            
    Writing inode tables:   0/128       done                            
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information:   0/128       done





⑦ファイルシステムのマウント
ファイルシステムが作成できたら、マウントしてみます。
マウント用ディレクトリをまず/home下にtestという名前で作成します。 

    [root@AWS ec2-user]# cd /home
    [root@AWS home]# mkdir test
    [root@AWS home]# ls -l
    total 0
    drwx------ 3 ec2-user ec2-user 74 Jul 26 14:53 ec2-user
    drwxr-xr-x 2 root     root      6 Jul 26 15:24 test


上記で作成したtestフォルダに先ほど作成したファイルシステムをマウントします。マウントする際のデバイス名はlvdisplayで表示されたLV Pathをを指定します。
[root@AWS home]# mount  /dev/test-vg/test-lg test

ではどのようにディスクが認識されているか確認します。

    [root@AWS home]# df -h
    Filesystem                     Size  Used Avail Use% Mounted on
    devtmpfs                       482M     0  482M   0% /dev
    tmpfs                          492M     0  492M   0% /dev/shm
    tmpfs                          492M  488K  492M   1% /run
    tmpfs                          492M     0  492M   0% /sys/fs/cgroup
    /dev/xvda1                     8.0G  1.6G  6.5G  20% /
    tmpfs                           99M     0   99M   0% /run/user/1000
    tmpfs                           99M     0   99M   0% /run/user/0
    /dev/mapper/test--vg-test--lg   16G   45M   15G   1% /home/test

上記より/home/testに約16Gの容量の論理ボリュームが存在することがわかります。
※LVMのデバイスマップ表示は/dev/mapper/ボリュームグループ名-論理ボリューム名となります。

これで２つの8GibのEBSをまとめて１つのLVM論理ボリュームとして設定できました。
ただし/etc/fstabを修正していないので、再起動するとマウントが外れてしまいます。
必要に応じて/etc/fstabに追記してあげましょう。





#SWAPを設定する
###概要
Amazon Linux2ではデフォルトでSWAPは作成されていないので、手動で作成していきます。
SWAPに割り当てる容量は以下を参考にしてください。
[スワップ領域](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-swapspace)

今回はメモリ1GBのサーバなので、SWAPは2GBで設定します。

###手順
①SWAPファイルの作成
swap用のファイルを作成します。その前にまず現状メモリの状態がどうなっているか調べります。

    [root@AWS ec2-user]# free
                  total        used        free      shared  buff/cache   available
    Mem:        1006892       86564      729660         480      190668      783736
    Swap:             0           0           0

上記から現状SWAP領域は割り当てられていないことがわかります。

ではSWAP用ファイルを作成します。ファイルは「/swapfile」で、ファイルサイズは2GBで作成します。

    [root@AWS ec2-user]# dd if=/dev/zero of=/swapfile bs=1024K count=2048
    2048+0 records in
    2048+0 records out
    2147483648 bytes (2.1 GB) copied, 31.0973 s, 69.1 MB/s

これでSWAP用ファイルが作成されました。ファイルのアクセス権を読み書きできるように変更します。
    
    [root@AWS ec2-user]# chmod 600 /swapfile

②作成したファイルをSWAP用に設定する

    [root@AWS ec2-user]# mkswap /swapfile
    Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
    no label, UUID=06116f11-77d6-xxxx-b180-xxxxxxxxx

③SWAP設定を有効化する

    [root@AWS ec2-user]# swapon /swapfile

ここで再度現状メモリの状態を確認します。

    [root@AWS ec2-user]# free
                  total        used        free      shared  buff/cache   available
    Mem:        1006892       80752       80328         480      845812      777576
    Swap:       2097148           0     2097148

上記からSWAP料金が約2GBで設定されていることがわかります。

④再起動しても自動的に利用されるようにする

このままでは再起動したら設定が消えてしまうので、/etc/fstabに追記して、再起動後も自動的にSWAPが利用できるようにします。

    [root@AWS ec2-user]# vi /etc/fstab
    ###以下を追記###
    /swap /swap swap defaults 0 0






#NFSを使って、他サーバのボリュームをネットワークマウントする
###概要
サーバのボリュームを他のサーバからもアクセスできるように設定します。Windowsでいうところの共有の設定みたいなものです。

イメージ図
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/a1ae3ef5-b461-14b2-fb76-63ed538f01ad.png)


今回は上記図でいうとEC2#2の/home/nfs-testにEC2#1の/home/testをマウントしてみます。

###手順
①設定したいボリュームがあるサーバ（NFSサーバ）で以下のコマンドを実行し、必要なサービスがインストールおよび動作しているか確認します。

    [root@AWS ec2-user]#systemctl status rpcbind nfs-server
    起動していない、もしくはインストールされていなければ起動、インストールしてください。
    [root@AWS ec2-user]#systemctl enable rpcbind nfs-server
    再起動後も自動でサービスが起動するようにします。

②同様にNFSクライアントで以下のコマンドを実行し、必要なサービスがインストールおよび動作しているか確認します。

    [root@AWS ec2-user]#systemctl status rpcbind nfs-server
    [root@AWS ec2-user]#systemctl enable rpcbind nfs-server

③NFSサーバで以下コマンドを実行し、ディレクトリを他サーバがマウントすることを許可します。

    #/etc/exports に外部からのマウント許可を記述します。
    [root@AWS ec2-user]#vi /etc/exports
     ####以下を追記####
     /home/test 10.0.0.0/24(rw,no_root_squash)　　→/24の後ろにスペースはいれない！

     [記述例]
    マウント許可するディレクトリ　マウント許可するホストもしくはNW（マウントオプション）
    "no_root_squash"はクライアントの root のアクセスをサーバ上の root として扱うオプション

    #記述できたら保存して、設定反映させるためにサービス再起動
    [root@AWS ec2-user]#exportfs -ra

④NFSクライアントでマウントコマンドを実行します。

    #10.0.0.223がNFSサーバのIPで、/home/testが被マウントディレクトリ
    [root@AWS ec2-user]#mount -t nfs 10.0.0.223:/home/test /home/nfs-test
    
⑤再起動してもアンマウントされてないようにNFSクライアント側の/etc/fstabに追記しておきます

    [root@AWS ec2-user]vim /etc/fstab

    ####以下追記####
    10.0.0.223:/home/test /home/nfs-test nfs rw,auto 1 1




 ではマウント出来ているか確認します。NFSクライアント側で以下コマンドを実行します。

    [root@AWS ec2-user]#df -h
    Filesystem             Size  Used Avail Use% Mounted on
    devtmpfs               482M     0  482M   0% /dev
    tmpfs                  492M     0  492M   0% /dev/shm
    tmpfs                  492M  412K  492M   1% /run
    tmpfs                  492M     0  492M   0% /sys/fs/cgroup
    /dev/xvda1             8.0G  1.5G  6.5G  19% /
    10.0.0.223:/home/test   16G   44M   15G   1% /home/nfs-test
    tmpfs                   99M     0   99M   0% /run/user/1000

/home/nfs-testにNFSサーバの/home/testがマウントされているのが見えました！

#終わりに
CentOSの設定についてPING-Tの問題をやってただけでは全然理解でていなかったんだなぁ～というのが身に染みて分かりました...実機でコマンド打ってみるって大切です！


#参考にしたサイト
https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-lv-on-ebs-volume/
https://hara-chan.com/it/infrastructure/how-to-mount-server/
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/
https://www.server-world.info/query?os=Ubuntu_20.04&p=nfs&f=2
https://qiita.com/rikudai/items/f9900e4865ce25a8464e
https://hara-chan.com/it/infrastructure/how-to-mount-server/