NCP-CentOS7-to-CentOS8

NCP 에선 centos8을 지원하지 않는다. 그런데 yum update 를 해서 커널이 변경되면 정상적으로 부팅되지 않는다.

이런 내용들이 인스턴스를 생성할때 안내된다.

그런데, 어제 퇴근후 Meetup과정에서 KR-2 zone은 yum update 가 가능하다는 내용을 전달 받았다. 어쩐지 가끔 yum update 해도 정상적으로 부팅되는 인스턴스가 있더라니..

퇴근길 Meetup - 퇴근길 Tech Meetup 서버 관리 자동화 자료이다.

여기에서 이상함을 느끼고 여쭤봤더니 KR-2에서 하라고 하셨다..그래서 오늘작업의 힌트를 얻었다...

최신의 OS 를 사용하고 싶은건 엔지니어의 본능이 아닌가? 그래서 테스트를 시작했다.

준비물은 다음과 같다.

서버이미지 centos 7.3으로 생성된 인스턴스 한대다.

ACG-포트포워딩-root password 확인 이런 부분은 서버생성 가이드를 참고하자.

https://docs.ncloud.com/ko/compute/compute-1-1-v2.html

인스턴스를 생성하고 인스턴스에 접속하자 마자 할일은 yum update 이다.

yum update -y

업데이트를 마무리하면 epel repo를 설치해 사용할 수 있다.

yum install epel-release -y

epel을 설치하는 이유는 dnf 를 사용하기 위함이다. yum->dnf 로 패키지 설치 방법을 변경할거다.

yum install -y yum-utils rpmconf
rpmconf -a

rpmconf -a 를 입력하면 패키지의 conf를 업데이트 할지를 물어본다.

/etc/sysctl.conf
/etc/profile
/etc/shells
/etc/login.defs
/etc/nsswitch.conf
다섯개의 파일에 대해서 물어보는데 나는 모두 새로 인스톨하는것을 택했다. centos8 로 갈꺼니까.

package-cleanup --leaves
package-cleanup --orphans

다음은 패키지를 cleanup 하고, epel 을 설치한 이유인 dnf 를 설치한다.

yum install dnf -y

dnf 는 centos8 부터 기본적용된 rpm 패키지 관리 패키지인데 yum 에서 dnf로 변경됬다.
dnf 를 설치했다면 yum 을 지우자.

dnf -y remove yum yum-metadata-parser
rm -Rf /etc/yum

yum 을 지우고,

dnf install -y http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-repos-8.2-2.2004.0.1.el8.x86_64.rpm http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-release-8.2-2.2004.0.1.el8.x86_64.rpm http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8.2-2.2004.0.1.el8.noarch.rpm

이제 centos8의 repo를 설치한다.

dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

epel7 을 epel8로 업데이트 한다. 이제 centos8 패키지를 다운받을 수 있다.

dnf clean all

dnf 캐시를 clean 한다.

rpm -e `rpm -q kernel`
rpm -e --nodeps sysvinit-tools

rpm 명령어로 커널을 지운다. 여기서 모든 패키지가 삭제되지 않기때문에 후처리가 좀 필요하다.

dnf remove kernel-devel-3.10.0-1127.13.1.el7.x86_64 kernel-devel-3.10.0-327.22.2.el7.x86_64 kernel-devel-3.10.0-514.2.2.el7.x86_64 redhat-rpm-config iprutils-2.4.17.1-3.el7_7.x86_64 sysvinit-tools-2.88-14.dsf.el7.x86_64 sysvinit-tools-2.88-14.dsf.el7.x86_64 python36-rpmconf-1.0.22-1.el7.noarch

후에 의존성이 걸릴 패키지를 미리 삭제한다. 이 경우 NCP centos7.3 인스턴스에 맞춰서 의존성 패키지를 삭제한것이다. 의존성 문제가 발생하면 더삭제 해줘야 한다. 부담감 느끼지 말고 막 날리자. 안되면 처음부터 다시하면 된다.

dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync

명령어로 centos8 패키지를 설치한다. 새로 설치되는 패키지들을 유심히 보면 el8.x86_64 로 끝난다 centos8 사용하는 패키지 명으로 RHEL8 이라는 뜻이다. centos8 패키지가 잘설치된다는 소리다.

Complete!

이 단어가 보이면 거의 다된거다.

dnf -y install kernel-core
dnf -y groupupdate "Core" "Minimal Install"

dnf groupupdate 로 Core 와 Minimal Install 까지 업데이트 해주면 이제 된거다.

[root@s17308f26023 ~]# uname -a
Linux s17308f26023 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@s17308f26023 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)

리부팅을 아직 안해서 릴리즈는 올라갔으나, 커널버전은 centos7 이다. 이제 리부팅 해주자.

[root@s17308f26023 ~]# date
Wed Jul 1 15:50:15 KST 2020
[root@s17308f26023 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@s17308f26023 ~]# uname -a
Linux s17308f26023 4.18.0-193.6.3.el8_2.x86_64 #1 SMP Wed Jun 10 11:09:32 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

이제 NCP에서 Centos8을 올렸다!

차후 커널지원이나 업데이트에 따라서 OS가 정상작동하지 않을수 있다. 모니터링이 문제가 될거라 생각했는데 잘돈다...

Centos8을 NCP에서 사용하고 싶다면 한번 진행해 보시기 바란다.

읽어 주셔서 감사하다!

AWS-userdata-glusterFS-install

#!/bin/bash
(echo n; echo p; echo 1; echo 2048; echo; echo t; echo 83; echo w) | fdisk /dev/xvdf
mkfs.xfs -i size=512 /dev/xvdf1
mkdir -p /bricks/brick1
echo "/dev/xvdf1 /bricks/brick1 xfs defaults 1 2" >> /etc/fstab
mount -a && mount
yum install -y centos-release-gluster
yum install -y xfsprogs glusterfs-server
systemctl enable glusterd
systemctl start glusterd
Setenforce 0
sed -i 's/^SELINUX=./SELINUX=disabled/g' /etc/sysconfig/selinux && cat /etc/sysconfig/selinux echo " soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
chmod 744 /etc/rc.d/rc.local

ec2 userdata glusterfs install 스크립트 입니다.

https://wiki.centos.org/SpecialInterestGroup/Storage/gluster-Quickstart

AWS-EC2-Root-volume-downsize-amazonlinux2-xfs

작업의 흐름은 위 포스팅을 참고하기 바란다.

지금 포스팅은 xfs grug2 를 사용하는 사용자를 위한 포스팅이다.

amazon linux2 에 소스(xvdg)와 대상(xvdf)볼륨을 연결한다.

디렉토리를 생성하고

# mkdir /mnt/new
# mkdir /mnt/org

파티션을 생성하고

# fdisk /dev/nvme1n1

파일시스템을 생성하고

# mkfs.xfs -f /dev/nvme1n1p1

마운트한다

# mount -t ext4 /dev/xvdf1 /mnt/new
# mount -t ext4 /dev/xvdg1 /mnt/org

rsync 로 데이터를 복사해주고

# rsync -av /mnt/org/* /mnt/new

싱크가 끝나면 마운트한 경로로 이동한다.

# cd /mnt/new

그리고 blkid 를 이용하여 UUID 를 확인한다.

/dev/nvme1n1: PTUUID="9986d28e" PTTYPE="dos"
/dev/nvme1n1p1: LABEL="/" UUID="030df8fc-fb40-4ba6-af3e-662df2f52270" TYPE="xfs" PARTUUID="9986d28e-01"
/dev/nvme0n1: PTUUID="83181c97-6d5e-43c9-9ede-e2f50ead5338" PTTYPE="gpt"
/dev/nvme0n1p1: LABEL="/" UUID="55da5202-8008-43e8-8ade-2572319d9185" TYPE="xfs" PARTLABEL="Linux" PARTUUID="591e81f0-99a2-498d-93ec-c9ec776ecf42"
/dev/nvme0n1p128: PARTLABEL="BIOS Boot Partition" PARTUUID="4908ae49-9d5b-423e-a23c-a507a47bacf5"

일반적으론 UUID가 있을거지만.. 그경우엔 UUID 를 넣어주자.

# xfs_admin -U 'uuidgen' /dev/xvdf1

명령어로 UUID 생성해서 넣어줄수 있다. UUID 가 보인다면 new / org 변수에 UUID 를 export 해주자 UUID 는 사람마다 다들테니 각각 잘확인해서 복붙하자.

# export new=’3a26abfe-67eb-49e4-922a-73f6cd132402’
# export org=’781f875d-4262-4f01-ba72-d6bd123785f5’
# sed -i -e "s/$org/$new/g" etc/fstab
# sed -i -e "s/$org/$new/g" boot/grub2/grub.cfg
# mount -B /dev dev
# mount -B /proc /proc
# mount -B /sys sys
# chroot .

위 명령어를 치면 /mnt/new 경로에서 지정한 UUID 로 fstab 안의 UUID를 변경하고 grub.cfg 안의 UUID 또한 자동으로 치환해줄거다. 그런다음 3개의 경로를 bind mount 하고 현재위치에서 chroot . 를 치면 chroot 가 현재위치로 변경된다.

# grub2-install /dev/xvdf

chroot 가 정상적으로 먹는다면 볼륨을 변경하면 정상적으로 잘부팅된다.

테스트 해보고 꼭 작업하길 바란다.

수고하시라!

AWS-EC2-Root-volume-downsize-amazonlinux1-ext4

위에서 확장한 볼륨을 축소 할거다.

축소할 인스턴스의 OS 는 amazon linux 1 로 ext4 의 파일시스템을 가지고 있고 grub1을 사용한다. 따라서 아래 과정은 amazon linux 2 에 맞지 않는다.

볼륨 확장은 엄청 간단하다. 콘솔에서 늘리고 명령어 두줄이면 쨘!
근데..축소는? 축소는...?축소는!!!!!!! 간단하지 않다.

20G -> 5G 로 축소할거다. 가즈아!!!!!!!!!! 축소하기 위해선 먼저 준비물이 필요하다.

축소할 인스턴스의 루트 볼륨 스냅샷
위에서 만든 스냅샷으로 생성한 볼륨하나
루트볼륨을 복사할 볼륨
그리고 작업할 인스턴스. amazon linux 1

간략하게 설명하자면 현재 잘도는 인스턴스는 두고, 스냅샷으로 볼륨을 만들어서 다른 인스턴스에 연결한뒤에 거기서 축소...실은 복사 작업을 한뒤에 인스턴스 중지후 루트 볼륨 교체를 진행할거다. 그럼 볼륨을 먼저 생성하자.

볼륨은 이런식으로 xvdf(new) / xvdg(org) 로 연결한다. 작업할 인스턴스는 amazon linux 1이다.

Disk /dev/xvda: 15 GiB, 16106127360 bytes, 31457280 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/xvda1 2048 31457246 31455199 15G 83 Linux

Disk /dev/xvdf: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/xvfg: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: ADC2A980-D341-46D7-9DA4-3652574FACDF
Device Start End Sectors Size Type
/dev/xvdg1 4096 41943006 41938911 20G Linux filesystem
/dev/xvdg2 2048 4095 2048 1M BIOS boot

세개의 파티션이 연결된걸 확인할수 있다.

작업전에 먼저 복사 대상 볼륨에서 파티션을 만들고 파일시스템을 생성해준다. 아래스크린샷은 이해를 돕기위해 찍은것이다.

# fdisk /dev/xvdf -> p (현재파티션확인) -> n(파티션생성) -> p(생성된 파티션확인) -> w(저장)

파티션을 만들었으면 linux dd 명령어로 복사해줘야한다.

아직 볼륨은 마운트하지 않은 상태에서 org 볼륨의 블럭사이즈를 확인해야 한다.

e2fsck -f /dev/xvdg1 명령어로 먼저 파일시스템을 체크한다.

[root@ip-172-31-12-119 mnt]# e2fsck -f /dev/xvdg1
e2fsck 1.43.5 (04-Aug-2017)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/: 40330/1310720 files (0.1% non-contiguous), 392822/5242363 blocks

[root@ip-172-31-12-119 mnt]# resize2fs -M -p /dev/xvdg1
resize2fs 1.43.5 (04-Aug-2017)
Resizing the filesystem on /dev/xvdg1 to 461003 (4k) blocks.
Begin pass 2 (max = 103395)
Relocating blocks XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 160)
Scanning inode table XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 4575)
Updating inode references XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/xvdg1 is now 461003 (4k) blocks long.

The filesystem on /dev/xvdg1 is now 461003 (4k) blocks long. 이부분에서 461003이게 현재 blockcount 다. 여기서 16MB 의 블럭사이즈를 계산해야 한다.

blockcount * 4 / (16 * 1024) 이렇게 계산해야 한다.

461003 * 4 / (16 * 1024) = 112.549560546875 로 계산되어 걍 올림해서 113이다. 이 16mb의 블록사이즈는 113개로...

dd bs=16M if=/dev/xvdg1 of=/dev/xvdf1 count=113 명령어로 블록단위 복사를 해줄거다.

[root@ip-172-31-12-119 mnt]# dd bs=16M if=/dev/xvdg1 of=/dev/xvdf1 count=113
113+0 records in
113+0 records out
1895825408 bytes (1.9 GB) copied, 29.3328 s, 64.6 MB/s
[root@ip-172-31-12-119 mnt]# resize2fs -p /dev/xvdf1
resize2fs 1.43.5 (04-Aug-2017)
Resizing the filesystem on /dev/xvdf1 to 1310464 (4k) blocks.
The filesystem on /dev/xvdf1 is now 1310464 (4k) blocks long.

[root@ip-172-31-12-119 mnt]# resize2fs -p /dev/xvdf1
resize2fs 1.43.5 (04-Aug-2017)
Resizing the filesystem on /dev/xvdf1 to 1310464 (4k) blocks.
The filesystem on /dev/xvdf1 is now 1310464 (4k) blocks long.

[root@ip-172-31-12-119 mnt]# e2fsck -f /dev/xvdf1
e2fsck 1.43.5 (04-Aug-2017)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/: 40330/327680 files (0.2% non-contiguous), 329605/1310464 blocks

정상적으로 복사가되면 resize2fs 와 e2fsck 가 먹는다. 그럼 이제 거의 다왔다.

마운트할 디렉토리를 생성한다.

# mkdir /mnt/new
# mkdir /mnt/org

파티션을 마운트한다.

# mount -t ext4 /dev/xvdf1 /mnt/new
# mount -t ext4 /dev/xvdg1 /mnt/org

마운트 확인한다.

df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 408K 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/xvda1 15G 13G 2.3G 86% /
tmpfs 389M 0 389M 0% /run/user/1000
/dev/xvdf1 4.8G 20M 4.6G 1% /mnt/new
/dev/xvdg1 20G 1.3G 19G 7% /mnt/org

정상적으로 마운트가 됬다.

amazon linux 의 path는 uuid 가 아니라 label 기반이므로 그냥 복사한 파티션에 label 을 붙여 준다. 붙여 줄 라벨은 / 다.

# e2label /dev/xvdf1 /

라벨 지정이 완료 되었다면 blkid 를 이용해서 확인한다. 아래 화면은 이해를 돕기위한 내용이다.

# blkid
/dev/xvda1: LABEL="/" UUID="781f875d-4262-4f01-ba72-d6bd123785f5" TYPE="ext4"

그리고 grub install 을 해줘야한다.

먼저 마운트를 해줘야 한다.

#cd /mnt/new
# mount -B /dev dev
# mount -B /proc /proc
# mount -B /sys sys
# chroot .

제일 중요한 부분은 /proc 부분이다. mount bind 해주지 않으면 정상적으로 파티션 포지션을 불러오지 않는다.

chroot 까지 정상적으로 마쳐 지면 이제 거의 다왔다.
그냥은 안되고 몇가지를 수정해줘야 한다. 근래에 사용하는 aws 의 HOST가 변경되어서 볼륨 포지션이 좀 변경되었기 때문이다. amazon linux 1 에서는 /boot/grub/device.map의 수정이 필요하다. 하이퍼 바이저가 디바이스를 호출하는 이름이 변경된것이므로 수정하지 않으면 grub-install 이 불가능하다.

전) device.map 이 없을수도 있다. 없으면 걍 만들어 줘도 괜찮다.

#cat /boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdf
(hd2) /dev/sdg

후)

#vi /boot/grub/device.map
(hd0) /dev/xdva
(hd1) /dev/xvdf
(hd2) /dev/xvfg
:wq!

변경을 완료하였다면 이제 grub-install 이 가능한 상태가 되었다.

# grub-install /dev/xvdf
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(hd0) /dev/xvda
(hd1) /dev/xvdf
(hd2) /dev/xvdg

이제 복구를 위해만든 인스턴스를 종료한다.

볼륨을 분리하면 정상적으로 분리가 된다. 이제 교체할 20G 볼륨인 인스턴스를 중지하고

원본 볼륨을 분리한다.

/dev/xvda 로 볼륨을 연결한다. 정상적으로 연결이 끝나면 인스턴스를 시작한다.

드디어 인스턴스가 떳다. 그럼 파티션을 확인해보자

[root@ip-172-31-43-226 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 483M 60K 483M 1% /dev
tmpfs 493M 0 493M 0% /dev/shm
/dev/xvda1 4.9G 1.3G 3.6G 27% /

정상적으로 파티션이 보이면 축소가 완료된것이다.

OS마다 방법이 다르지만 centos6 amazonlinux1 / centos7 amazonlinux2 이렇게 동일할것이다. 참고하자.

읽어주셔서 감사하다!

좋은하루 되시라!

AWS-EC2-Root-Volume-Resize-Extending-linux

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html

리눅스 볼륨 확장은 이 docs 를 참고하자. 먼저 오늘 테스트할 ami 는 amazon linux 1 이다.

[root@ip-172-31-43-226 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 483M 60K 483M 1% /dev
tmpfs 493M 0 493M 0% /dev/shm
/dev/xvda1 7.9G 1.2G 6.6G 15% /

root 볼륨은 8G 로 1.2G를 사용중이다. 이걸 20G로 늘릴거다.

먼저 볼륨 태그를 잘확인한다.

amazon linux 1 은 ext4 에 /dev/xvda1 로 / 가 설정되고
amazon linux 2 는 xfs 에 /dev/nvme1n1p1 으로 / 가 설정 된다

확장 자체는 디바이스의 파티션을 지정해서 확장하므로 일반적으로 볼륨 하나당 하나의 파티션을 사용하는것을 권장한다. on-prem 처럼 하나의 볼륨에 여러개의 파티션을 사용한다면 확장은 힘들다.

볼륨수정을 눌러서 진행한다.

볼륨을 수정하면 optimizing 과정을 거쳐서 확장된다. 디스크를 사용중에도 확장할수 있으나, 안전한 작업을 위한다면 스냅샷을 생성하고 확장하자.

Disk /dev/xvda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/xvda1 1 16777215 8388607+ ee GPT

/dev/xvda: 21.5 GB 볼륨이 확장된게 보인다.

현재 상태는 볼륨만 확장된것이고 파티션을 확장해야 한다.

# growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=41938910,end=41943006

amazon linux 1 의 경우엔 파티션이 xvda 로 보여서 xvda 의 첫번째 파티션은 1번을 확장한다.

amazon linux 2 의 경우엔 파티션이 nvme1n1p1 으로 보이므로 실제 명령어는

# growpart /dev/nvme1n1 1

로 명령어를 쳐야 한다. growpart 로 파티션을 확장하면 Disk label type: dos -> Disk label type: gpt 변경되고,

위처럼 디스크 라벨 부터 파티션 타입까지 변경된다.

fdisk -l 명령어로 확인하며 진행하자.

이제 다음은 파일시스템의 확장이 필요하다. 파일시스템 확장은 resize2fs 명령어로 확장한다.

# resize2fs /dev/xvda1
resize2fs 1.43.5 (04-Aug-2017)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvda1 is now 5242363 (4k) blocks long.

그럼 볼륨 확장이 완료된다.

볼륨확장에 대해 정리하자면 이렇다.

실제 볼륨을 확장하고 파티션을 확장하고 파일시스템을 확장한다.

# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 483M 60K 483M 1% /dev
tmpfs 493M 0 493M 0% /dev/shm
/dev/xvda1 20G 1.3G 19G 7% /

정상적으로 확장된 파티션을 확인할수 있다.

xfs 에서 파티션 확장은 xfs_growfs 명령어를 사용한다. 참고하자.

linux-jaeger-setup

jaeger를 다운 받을 위치로 이동한다. 나는 amazon linux 2를 사용했고 일부패키지는 amazon-linux-extra 를 사용했다.

cd /usr/local/src/

위치에서 시작했다.

GOPATH=`pwd`
echo $GOPATH

gopath 를 설정했으면 gopath bin 을 path 로 지정해줘야 한다. 현재위치에서 gopath/bin 은 /usr/local/src/bin 이된다.

export PATH=$PATH:$GOPATH/bin

gopath bin을 설정해줬으면 사전 설치를 한다.

amazon-linux-extras install golang1.11
amazon-linux-extras install epel
curl -sL https://rpm.nodesource.com/setup_8.x | bash -
yum install -y git npm nodejs
npm install -g yarn
go get -u github.com/mjibson/esc
go get github.com/securego/gosec/cmd/gosec

nodejs가 8버전이 필요하다. go 1.11 버전이 최소 요구 버전이다.

이제 본격적인 설치를 시작한다.

git clone https://github.com/jaegertracing/jaeger.git jaeger
cd jaeger/

git clone 뜨고 디렉토리를 이동한다.

설치전에 CONTRIBUTING.md 파일을 꼭읽자.

https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING.md

git submodule update --init --recursive
make install-tools
make build-ui

여기까지 하면 설치가 완료된거다.

go run -tags ui ./cmd/all-in-one/main.go

명령어로 실행한다.

사이트 확인은 16686 포트이다

http://IP:16686/search

으로 접근해서 서비스를 확인하자.

이 화면이 뜨면 정상적으로 설치된거다.

읽어주셔서 감사하다.

jaeger 설치를 마친다.

AWS-Linux-MariaDB-10.5-S3-Storage-Engine-install-실패

mariadb 10.5 version 에서 S3 Storage Engine을 사용하기위해 먼저 repo를 설치하고 s3 engine 를 올리려고 해봤다. 원랜 바이너리 패키지로 지원해야 하는데....

https://mariadb.com/kb/en/using-the-s3-storage-engine/

아무리 찾아봐도 없어서...찾아보니까...

https://jira.mariadb.org/browse/MDEV-22606

The S3 storage engine is included in source code distributions of MariaDB Community Server 10.5. However, it is not currently built and distributed with any of our MariaDB Community Server 10.5 binary packages.

이런내용이 있었다...제길..컴파일해야 하는구나.

그래서 컴파일을 시작했다.

mariadb 컴파일은 생각보다 엄청 오래걸린다. T2.micro 사이즈 기준으로 2시간정도.. 너무 느리다 생각되면 인스턴스 사이즈를 컴파일 할때만 잠깐 늘리거나 인스턴스가 터지지 않게 swap 을 늘려주자.

이전에 포스팅한 swap 만들기가 있다. 참고하자.

하면서 인스턴스용량 때문에 한번 메모리때문에 한번터져서 세번째엔 그냥 T3.large 유형으로 컴파일을 했다.

설치 시작전에 먼저 필요한 패키지를 설치한다.

cmake로 컴파일한다.

# amazon-linuxer-extra install epel-release
# yum install -y cmake gcc gcc-c++ ncurses-devel git curl-devel mhash-devel

먼저 기본설정으로 두가지를 설치하자. epel은 mhash-devel 때문에 설치하는거다.

# wget http://mirrors.supportex.net/mariadb//mariadb-10.5.3/source/mariadb-10.5.3.tar.gz

다운받고

tar zfxv mariadb-10.5.3.tar.gz

압축풀고

cd mariadb-10.5.3

이동하고 컴파일 한다.

# cmake \
-DWITH_READLINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=bundled \
-DWITH_ZLIB=system \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_ARIA_STORAGE_ENGINE=1 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATEDX_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DPLUGIN_S3=YES \
-DINSTALL_SYSCONFDIR=/usr/local/mariadb/etc \
-DINSTALL_SYSCONF2DIR=/usr/local/mariadb/etc/my.cnf.d \
-DMYSQL_TCP_PORT=3306 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DMYSQL_DATADIR=/usr/local/mariadb/data \
-DMYSQL_UNIX_ADDR=/usr/local/mariadb/socket/mysql.socket

CMake Error at cmake/plugin.cmake:296 (MESSAGE):
Plugin S3 cannot be built
Call Stack (most recent call first):
CMakeLists.txt:427 (CONFIGURE_PLUGINS)

-DPLUGIN_S3=YES

위 옵션이 먹지 않았다.

https://jira.mariadb.org/browse/MDEV-19416

이리저리 찾아봐도 안된다는 내용만.. source  에 있다해서 신나서 했는데..ㅠㅠ

아직 10.5.3버전에서도 정상적으로 릴리즈되진 않은것으로 보인다.

S3_STORAGE_ENGINE=1 이옵션으로 켜줘야 정상아닌가..그래서

S3_STORAGE_ENGINE옵션을 주고 컴파일 해봤는데... 컴파일은 되는데 플러그인을 확인할수 없었다.

-rwxr-xr-x 1 root root 30008 May 23 06:36 adt_null.so
-rwxr-xr-x 1 root root 22368 May 23 06:36 auth_0x0100.so
-rwxr-xr-x 1 root root 327904 May 23 06:36 auth_ed25519.so
-rwxr-xr-x 1 root root 33488 May 23 06:36 auth_test_plugin.so
-rwxr-xr-x 1 root root 51160 May 23 06:35 caching_sha2_password.so
-rwxr-xr-x 1 root root 343792 May 23 06:35 client_ed25519.so
-rw-r--r-- 1 root root 227 May 11 14:34 daemon_example.ini
-rwxr-xr-x 1 root root 31840 May 23 06:36 debug_key_management.so
-rwxr-xr-x 1 root root 23608 May 23 06:36 dialog_examples.so
-rwxr-xr-x 1 root root 51848 May 23 06:35 dialog.so
-rwxr-xr-x 1 root root 419984 May 23 06:36 disks.so
-rwxr-xr-x 1 root root 59432 May 23 06:36 example_key_management.so
-rwxr-xr-x 1 root root 184128 May 23 06:36 file_key_management.so
-rwxr-xr-x 1 root root 1239672 May 23 06:36 func_test.so
-rwxr-xr-x 1 root root 718464 May 23 06:36 ha_archive.so
-rwxr-xr-x 1 root root 682112 May 23 06:36 ha_blackhole.so
-rwxr-xr-x 1 root root 8822896 May 23 06:36 ha_connect.so
-rwxr-xr-x 1 root root 532336 May 23 06:36 ha_example.so
-rwxr-xr-x 1 root root 874792 May 23 06:36 ha_federated.so
-rwxr-xr-x 1 root root 1526136 May 23 06:36 ha_federatedx.so
-rwxr-xr-x 1 root root 28310200 May 23 06:36 ha_mroonga.so
-rwxr-xr-x 1 root root 3250752 May 23 06:36 handlersocket.so
-rwxr-xr-x 1 root root 126790184 May 23 06:35 ha_rocksdb.so
-rwxr-xr-x 1 root root 1806592 May 23 06:36 ha_sphinx.so
-rwxr-xr-x 1 root root 11633920 May 23 06:36 ha_spider.so
-rwxr-xr-x 1 root root 363776 May 23 06:36 ha_test_sql_discovery.so
-rwxr-xr-x 1 root root 84016 May 23 06:36 libdaemon_example.so
-rwxr-xr-x 1 root root 415792 May 23 06:36 locales.so
-rwxr-xr-x 1 root root 592512 May 23 06:36 metadata_lock_info.so
-rwxr-xr-x 1 root root 29352 May 23 06:36 mypluglib.so
-rwxr-xr-x 1 root root 35656 May 23 06:35 mysql_clear_password.so
-rwxr-xr-x 1 root root 29568 May 23 06:36 qa_auth_client.so
-rwxr-xr-x 1 root root 39152 May 23 06:36 qa_auth_interface.so
-rwxr-xr-x 1 root root 24592 May 23 06:36 qa_auth_server.so
-rwxr-xr-x 1 root root 587624 May 23 06:36 query_cache_info.so
-rwxr-xr-x 1 root root 731952 May 23 06:36 query_response_time.so
-rwxr-xr-x 1 root root 234272 May 23 06:36 server_audit.so
-rwxr-xr-x 1 root root 28576 May 23 06:36 simple_password_check.so
-rwxr-xr-x 1 root root 31152 May 23 06:36 sql_errlog.so
-rwxr-xr-x 1 root root 1281352 May 23 06:36 test_versioning.so
-rwxr-xr-x 1 root root 689104 May 23 06:36 type_test.so
-rwxr-xr-x 1 root root 720048 May 23 06:36 wsrep_info.so

플러그인 리스트를 첨부하는것으로 포스팅을 마친다...

하....이번에도 역시 실패

aws-ec2-user-data-cloud-watch-metric-memory-disk

오늘 포스팅은 사용자 데이터에 대한 포스팅을 할거다.

오늘 추가하는 내용은 cloudwatch 사용자 매트릭을 이용하는것이므로 비용이발생한다.

정말 미미한 비용이지만 비용발생의 거부감이 있다면 따라하지 말것.

이전에 Cloud Watch 를 이용하여 메모리를 모니터링 하는법과 경보를 만드는 방법을 포스팅 했었다.

이건 기본매트릭엔 memory/disk 모니터링이 안되므로 스크립트로 매트릭을 Watch로 전송하는 방식이다. agent 방식도 있으나 내가 선호하는 방식이 아니다.

먼저 사용할 inline 정책이다.

필요 권한

필요한 권한
cloudwatch:PutMetricData
cloudwatch:GetMetricStatistics
cloudwatch:ListMetrics
ec2:DescribeTags

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "ec2:DescribeTags",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics"
            ],
            "Resource": "*"
        }
    ]
}

일단 정책 생성누르고 json 으로 넣는다.

그리고 정책의 이름을 정해서 넣는다

사용권한

나는 ec2-monitoring-policy 로 대충 입력했다. 상황과 사용자에 따라 다르다.

이제 역할을 생성한다.

신뢰 할수있는 유형의 서비스에서 EC2를 선택한다.

미리 생성한 정책을 선택한다.

태그는 사실 대충 입력했다. 하지만 각각 사용자마다의 태그 규칙을 정하고 사용하는것이 좋다.

정상적으로 만들면 신뢰 정책 태그가 생성한 순으로 잘보일것이다.

하나라도 빠져있다면 이상한거다.

오늘의 대상이 되는 인스턴스의 OS는 ubuntu 와 amazon linux2 / contos 이다.

user data 에 사용할 스크립트다

amazon linux2 / contos7

#!/bin/bash
sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64 unzip
cd ~
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip
echo "#disk metric" >> /etc/crontab
echo "#*/5 * * * * root /root/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron" >> /etc/crontab
systemctl restart crond

ubuntu 14 - 18

#!/bin/bash
sudo apt-get install unzip libwww-perl libdatetime-perl
cd ~
curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip
echo "#disk metric" >> /etc/crontab
echo "#*/5 * * * * root /root/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron" >> /etc/crontab
systemctl restart crond

위의 스크립트는 UserData 에 넣어주면 된다.

현재 스크립트는 주석처리되어 삽입까지만 되고 crontab 에서는 주석처리되어 돌지 않는다. 동작시키려면

echo "#*/5 * * * * root /root/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron" >> /etc/crontab
echo "*/5 * * * * root /root/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron" >> /etc/crontab

변경하고 crontab 을 재시작하자.

crontab 에 삽입되며, 5분마다 memory와 disk 사용량에 대한 매트릭을 CloudWatch 로 전송한다.

인스턴스 세부정보 구성에서 아까 생성한 역할을 부여하고, 사용자 데이터에서 위에 올려둔 스크립트를 붙여넣기 한다.

[root@ip-172-31-47-207 ~]# yum history
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
ID | Command line | Date and time | Action(s) | Altered
2 | install -y perl-Switch p | 2020-04-25 00:27 | Install | 50
1 | -t -y --exclude=kernel - | 2020-04-25 00:27 | Update | 1
history list

yum history를 보면 정상적으로 패키지 설치가 된게 보이고,

[root@ip-172-31-47-207 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#disk metric
*/5 * * * * root /root/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron

정상적으로 crontab에 스크립트도 들어간게 보인다.

그래서 CloudWatch 에서 모두 > linux 시스템 이라는 이름으로 사용자 매트릭이 생성된것이 보일것이다.

여기까지 되면 이제 인스턴스의 메모리와 디스크 모니터링이 가능해졌다.

aws 에서는 기본 매트릭으로 여러가지 모니터링 환경을 제공하는데 memory 와 disk 는 모니터링이 되지 않아 불편한 부분이 있었다.

-_-; 이 포스팅이 도움이 되길 바란다.!

linux-ubuntu-auto-update-diable

vi /etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Unattended-Upgrade "1";

1로 설정된 옵션을 수정하면 자동업데이트는 꺼진다.

그렇다고 해서 업데이트를 할수없는것은 아니고 수동으로 명령어를 쳐서 가능하다.

#unattended-upgrade --dry-run

명령어를 이용해서 확인하자.