Golden Image 생성

인프라 구축

Compartment 생성

클라우드 리소스를 논리적으로 분리하여 관리하기 위해 그룹 생성

OCI Console > Identity & Security > Identity > Compartments

 

Virtual Cloud Networks 생성

리소스들이 상호 통신할 수 있도록 네트워크 인프라 설정

OCI Console > Networking > Virtual cloud networks > ‘Create VCN’ 클릭

 

Security Lists 생성

VCN 생성 시, 기본 생성되는 Default Security List를 퍼블릭 서브넷에 사용한다.

프라이빗 서브넷에 사용할 보안 목록을 생성한다.

'생성한 VCN 이름' 클릭 > Resources > Security Lists > ‘Create Security Lists’ 클릭 > Allow Rules for Ingress에서 퍼블릭 서브넷 대역대의 ssh 접속 허용 규칙 추가


Internet Gateway 생성

Networking > Virtual and networks > Internet Gateway

 

Route Tables 생성

Networking > Virtual and networks > ‘Create Route Table’ 클릭

Route Tables > ‘Add Route Rules’ 클릭 > Route Rules > Target Type ‘Internet Gateway’ 클릭 > Destination CIDR Block ‘0.0.0.0/0’ 입력 > Target Internet Gateway > ‘생성한 인터넷 게이트웨이 이름 클릭’ > ‘Add Route Rules’ 클릭

 

Subnet 생성
퍼블릭 서브넷과 프라이빗 서브넷을 생성한다.
  • VCN 구성 (10.0.0.0/16)
    • Public Subnet: 인터넷에 통신이 필요한 Bastion Host를 배치 (10.0.1.0/24)
    • Private Subnet: 내부 통신이 필요한 리소스를 배치 (10.0.0.0/24)

'생성한 VCN 이름' 클릭 > Resources > Subnets > 'Create Subnet' 클릭

 

퍼블릭 서브넷 생성
프라이빗 서브넷 생성

 

Bastion Host 생성

Private Subnet에 위치한 리소스에 접근하기 위한 중계 서버를 생성하고 기본 서버 설정(root/패스워드 로그인 허용)

 

 

디스크 증설

시나리오

추가 볼륨을 붙이지 않고, 하나의 볼륨으로 파티션을 증설

/ - 30GB
/var - 30GB
/tmp - 30GB

 

서버 기본 설정 후 로그인

OCI RHEL OS의 default user은 “cloud-user” 이다.

[root@j-test-0005 ~]# ssh root@10.0.1.84
root@10.0.1.84's password:
Last login: Thu Jul 18 07:24:11 2024
[root@j-test-0005 ~]#

 

 

부트 볼륨

RHEL 환경에서는 Boot volume 증설 시, 모든 용량이 '/' 로 할당되는 문제가 있다. 기본 구조에는 /tmp, /var에 마운트 된 파티션이 없으므로 디스크를 분할해야 한다.

OCI 블록 스토리지 종류에는 블록 볼륨, 부트 볼륨이 있다. 부트 볼륨은 VM 생성 시 자동으로 부착되며, 이미지를 기반으로 OS를 설치한다. 블록 볼륨을 추가하면 블록을 2개 사용하게 되어 시나리오에 부적합하다. RHEL 7.9에서는 부트 볼륨을 증설하면 “/”에 모든 용량이 할당되어 파티셔닝이 불가능하다.

부트 볼륨을 분리하고 다른 VM에 부착하면 OS 설치를 유지한 상태로 파티션이 가능하기 때문에, VM 2개를 생성해서 파티셔닝을 진행한다.

VM2는 용량 증설을 하기 위해 VM1과 동일한 환경으로 생성하고 VM2의 부트 볼륨을 분리하여 VM1에 부착한다.

VM1에서 VM2의 블록(VM3.Standard3.Flex 기준, /dev/sdb)을 부착하여 파티셔닝 한다.

파티셔닝 후 원래대로 VM1의 블록을 VM1에 부착하여 파티셔닝 환경을 구성한다.

  • VM 구성 요약: RHEL 7.9가 설치된 VM 2개 사용
    • Image: RHEL 7.9
    • Shape: VM.Standard3.Flex
    • VM1: 파티션 할 VM (j-test-0005)
    • VM2: 파티션 하기 위해 부착하는 VM (j-test-0006)

 

부트 볼륨 분리

VM1 중지 후 부트 볼륨을 분리한다.

Compute > Instances > Instance detail > Boot volume > Detach boot volume

 

볼륨 크기 조정

VM1의 볼륨 크기를 조정한다.

Block Storage > Boot Volumes > ‘Edit’ 클릭 > Volume size and performance > Volume size 입력 > 'Save changes' 클릭

 

부트 볼륨 부착

VM2에 VM1의 부트 볼륨을 부착한다.

Boot volume > Attached Instances > 'Attach to Instance' 클릭 > Attachment type > Paravitualized 선택 > Instance 선택 > Attach 클릭

  • Attachment type
    • SCSI: 베어 메탈 인스턴스
    • Paravirtualized: 반가상화 방식. 불륨이 자동으로 연결되어 바로 인스턴스에서 사용 가능

 

기본 블록 구조 확인

VM2에 접속하여 기본 블록 구조를 확인한다.

[root@j-test-0006 ~]$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0 46.6G  0 disk
└─sda1   8:1    0 46.6G  0 part /

 

VM2 볼륨 부착 확인

[root@j-test-0006 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0 46.6G  0 disk
└─sda1   8:1    0 46.6G  0 part /
sdb      8:16   0  140G  0 disk
└─sdb1   8:17   0 46.6G  0 part

 

 

파티셔닝

fdisk를 이용해서 VM1의 블록을 파티셔닝 한다.

  • 블록 구조
    • /dev/sda (VM1)
    • /dev/sdb (VM2)
[root@j-test-0006 dev]# fdisk /dev/sdb

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (2-4, default 2):
First sector (97677279-293601279, default 97677312):
Using default value 97677312
Last sector, +sectors or +size{K,M,G} (97677312-293601279, default 293601279): +30G
Partition 2 of type Linux and of size 30 GiB is set

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (3,4, default 3):
First sector (97677279-293601279, default 160591872): +30G
Value out of range.
First sector (97677279-293601279, default 160591872): p
First sector (97677279-293601279, default 160591872): print
First sector (97677279-293601279, default 160591872):
Using default value 160591872
Last sector, +sectors or +size{K,M,G} (160591872-293601279, default 293601279): +30G
Partition 3 of type Linux and of size 30 GiB is set

Command (m for help): p

Disk /dev/sdb: 150.3 GB, 150323855360 bytes, 293601280 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disk label type: dos
Disk identifier: 0x000b2b6b

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048    97677278    48837615+  83  Linux
/dev/sdb2        97677312   160591871    31457280   83  Linux
/dev/sdb3       160591872   223506431    31457280   83  Linux

Command (m for help): w

 

파일 시스템 설정

Linux 파일 시스템으로 파티셔닝

[root@j-test-0006 dev]# mkfs.xfs /dev/sda2
Discarding blocks...Done.
meta-data=/dev/sda2              isize=512    agcount=4, agsize=1966080 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=7864320, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3840, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@j-test-0006 dev]# mkfs.xfs /dev/sda3
Discarding blocks...Done.
meta-data=/dev/sda3              isize=512    agcount=4, agsize=1966080 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=7864320, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3840, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
  • Linux 파일 시스템 종류
    • ext4: 초기 Unix에서 사용하던 파일 시스템을 보완하여 설계된 파일 시스템으로, 대용량 파일의 메타데이터를 줄이고 성능을 향상
    • xfs: 대용량 디스크 사용이 보편화되면서 RHEL7 기본 파일 시스템으로 채택됨
  • xfs 파일 시스템의 특징
    • 파일 시스템 크기 축소 불가
    • ext4 보다 대용량 파일 지원
    • 파일 시스템이 마운트 되어 활성화 있는 동안 확장 가능

 

파티셔닝 확인

[root@j-test-0006 dev]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  140G  0 disk
├─sda1   8:1    0 46.6G  0 part /
├─sda2   8:2    0   30G  0 part
└─sda3   8:3    0   30G  0 part

 

볼륨 부착

파티셔닝 완료 후, VM1 블록 재부착

 

 

백업

기존 /var, /tmp 구성 파일들을 유지하기 위해서 백업한다.

/home/cloud-user에 백업 디렉터리를 만들고 파일들을 복사한다.

 

백업 디렉터리 생성

[root@j-custom-0002 cloud-user]# ls -lart
total 16
drwxr-xr-x. 3 root       root        24 Jul 22 14:50 ..
drwx------. 2 cloud-user cloud-user  29 Jul 23 15:40 .ssh
-rw-------. 1 cloud-user cloud-user  15 Jul 23 15:46 .bash_history
-rw-r--r--. 1 root       root       176 Jul 23 15:51 .bashrc
-rw-r--r--. 1 root       root       176 Jul 23 15:51 .bash_profile
-rw-r--r--. 1 root       root        18 Jul 23 15:51 .bash_logout
drwxr-xr-x. 2 root       root         6 Jul 23 15:51 backup_24040722
drwx------. 4 cloud-user cloud-user 118 Jul 23 15:52 .

 

 

[root@j-test-0006 backup_24040722]# mkdir ./var_backup_$(date +%Y%m%d%H%M%S)
[root@j-test-0006 backup_24040722]# mkdir ./tmp_backup_$(date +%Y%m%d%H%M%S)
[root@j-test-0006 backup_24040722]# ls -lart
합계 0
drwxr-xr-x. 3 root       root       24  7월 22 01:50 ..
drwxr-xr-x. 2 root       root        6  7월 22 02:54 tmp_backup_20240722025416
drwxr-xr-x. 2 root       root        6  7월 22 02:54 var_backup_20240722025423
drwx------. 4 cloud-user cloud-user 72  7월 22 02:54 .

 

 

기존 파일 복사

[root@j-test-0006 cloud-user]# cp -pr /tmp/* /home/cloud-user/tmp_backup_20240722025416/
[root@j-test-0006 cloud-user]# cp -pr /var/* /home/cloud-user/var_backup_20240722025423/

 

파일 시스템 포맷

[root@j-test-0006 ~]# mkfs.xfs /dev/sda2
Discarding blocks...Done.
meta-data=/dev/sda2              isize=512    agcount=4, agsize=1966080 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=7864320, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3840, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@j-test-0006 ~]# mkfs.xfs /dev/sda3
Discarding blocks...Done.
meta-data=/dev/sda3              isize=512    agcount=4, agsize=1966080 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=7864320, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3840, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

 

마운트

[root@j-test-0002 tmp]# blkid
/dev/sda1: UUID="989ac477-64f2-449f-8415-25b1a5f7d47f" TYPE="xfs"
/dev/sda2: UUID="2c906a0c-9aad-4adc-9405-e806569ce53b" TYPE="xfs"
/dev/sda3: UUID="f0f4fd9e-2e5d-4a44-9910-cbca3974e2d9" TYPE="xfs"
[root@j-test-0002 tmp]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Sep 17 19:11:37 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=989ac477-64f2-449f-8415-25b1a5f7d47f /                       xfs     defaults        0 0
UUID=2c906a0c-9aad-4adc-9405-e806569ce53b /var                    xfs     defaults        0 0
UUID=f0f4fd9e-2e5d-4a44-9910-cbca3974e2d9 /tmp                    xfs     defaults        0 0

 

마운트 확인

[root@j-test-0005 tmp]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  120G  0 disk
├─sda1   8:1    0 46.6G  0 part /
├─sda2   8:2    0   30G  0 part /var
└─sda3   8:3    0   30G  0 part /tmp
[root@j-test-0005 home]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  472M     0  472M   0% /dev
tmpfs          tmpfs     496M     0  496M   0% /dev/shm
tmpfs          tmpfs     496M  6.8M  489M   2% /run
tmpfs          tmpfs     496M     0  496M   0% /sys/fs/cgroup
/dev/sda1      xfs        47G  943M   46G   2% /
tmpfs          tmpfs     100M     0  100M   0% /run/user/0
/dev/sda2      xfs        30G   90M   30G   1% /var
/dev/sda3      xfs        30G   33M   30G   1% /tmp

 

재부팅하여 마운트 적용

reboot

 

 

복원

/cloud-user/backup에 백업한 /var, /tmp 내의 모든 파일과 디렉토리 복원

cp -pr /tmp/* /home/cloud-user/tmp_backup_20240722025416/
cp -pr /var/* /home/cloud-user/var_backup_20240722025423/

 

 

SELinux 컨텍스트 복원

restorecon -R /var
restorecon -R /tmp

 

 

Golden Image 생성

골든 이미지(마스터 이미지): 가상 머신(VM)의 이미지를 정형화하여 일관되게 유지 관리하며 배포하기 위해 사용한다. 골든 이미지를 통해 여러 VM이 동일한 서버 설정, OS, 필수 패키지 보안 설정을 적용한다.

 

이미지 생성

Compute > Instances > ‘이미지를 생성할 Instance’ 클릭 > More actions > Create custom image

 

이미지 생성 확인

Compute > Custom Images

 

 

어려웠던 점 🐹

파일 시스템 포맷하는 이유

문제:

파티셔닝 후, 파일 시스템 포맷 없이 디바이스를 /etc/fstab에 등록하여 마운트 실패

 

정리: 

파일 시스템 포맷을 하는 이유: 새로운 디스크 또는 파티션을 사용하기 전에는 파일 시스템을 생성해야 데이터를 저장할 수 있다.

파일 시스템을 포맷하여 파일 시스템이 생성되지 않으면 마운트가 실패한다.

포맷을 하면 파일 시스템의 구조와 메타데이터가 설정되어서 디스크가 데이터를 저장, 검색할 수 있는 상태가 된다.

 

 

/etc/fstab와 automount의 차이

문제:

디스크 마운트 시, /etc/fstab를 사용하는데 이전에 진행 했었던 오토 마운트 설정과 차이점 정리가 필요했다.

 

정리:

/etc/fstab은 로컬 디스크 등 부팅 시 항상 마운트되어야 하는 파일 시스템에 적합하다.

automount는 네트워크 파일 시스템(NFS)처럼 동적으로 마운트되고 사용되지 않을 때 자동으로 언마운트되어야 하는 경우에 적합하다.

 

(1) mount: 수동 마운트

mount 명령을 사용하여 파일 시스템을 수동으로 마운트하면 그 설정은 일시적이다. 서버가 재부팅되면 수동으로 마운트한 파일 시스템은 더 이상 마운트 되지 않는다. 이 경우 파일 시스템을 다시 마운트하려면 부팅 후 다시 수동으로 마운트 명령을 실행해야 한다. 로그인 세션이 로그아웃은 마운트에 영향을 주지 않는다. 종료되어도 파일 시스템은 계속 마운트된 상태로 남아있다.

 

이를 방지하기 위해 자동 마운트 설정을 한다.

automount 설정과 /etc/fstab에서 마운트 설정은 파일 시스템을 자동으로 마운트하기 위한 두 가지 다른 방법이다.

 

(2) /etc/fstab: 파일 시스템을 부팅 시 자동 마운트 설정

 

(3) automount: 사용자가 특정 디렉터리에 접근할 때 파일 시스템을 동적 마운트하는 설정. 주로 NFS(네트워크 파일 시스템)에 많이 사용한다. 동적 마운트는 파일 시스템에 접근할 때 자동으로 마운트하고, 일정 시간 동안 사용되지 않으면 자동으로 언마운트한다.

  • 설정 파일:
    • /etc/auto.master: 오토 마운트 마스터 파일
    • /etc/auto.user: 실제 마운트 정보를 포함한 파일

요약:

 
마운트 시점 부팅 시 접근 시
용도 정적인 파일 시스템 동적, 네트워크 파일 시스템
설정 변경 수동으로 파일 수정 설정 파일을 통한 자동화
유연성 고정적 동적, 사용되지 않으면 자동 언마운트 가능
예시 로컬 디스크 NFS

 

 

백업 시, restore 명령어를 사용하는 이유

디스크나 파티션을 포맷하면 기존 데이터를 삭제하고 이를 통해 새로운 데이터를 저장할 준비가 된다.

 

restorecon: 'Restore Context'의 약자. SELinux 환경에서는 인증된 사용자와 프로세스만 접근할 수 있도록 파일과 디렉터리에 라벨을 부여하여 접근을 제한한다. restorecon은 SELinux 환경에서 서버 부팅 시 초기 SELinux Context로 복원하는 명령어다.

cp 명령어로는 SELinux 컨텍스트가 제대로 복사되지 않기 때문에, 파일에 접근이 불가능해질 수 있으며, 로그가 기록되지 않는 문제가 있다. 심한 경우 sshd 데몬이 비작동하여 서버 오류가 발생할 수 있다.

 

(1) cp 명령어 사용

cp 명령어 사용

restorecon 명령어를 사용하지 않고 cp 명령어만 사용했을 때, 재부팅 후 다시 접속하면 /var/log/secure 파일에 사용자 로그인 기록이 제대로 저장되지 않는다.

 

 

(2) restorecon 명령어 사용

restorecon -R /var
restorecon -R /tmp

restorecon 명령어 사용 후

restorecon 명령어 사용 후, secure 로그가 제대로 쌓인다.

 

  • restorecon 명령어 사용 이유
    • SELinux Default Context 복원 -> 기본 디렉토리 설정 및 연결 재설정 필요
    • 보안, 접근 이슈 예방

 

 

UUID를 이용하는 이유

/etc/fstab에는 UUID 또는 디바이스 경로, 마운트 포인트, 파일 시스템 유형, 마운트 옵션을 작성한다.

AWS에서는 가상 머신(VM)의 유형이 다르면 디스크의 이름이 달라질 수 있다.
이로 인해 디스크를 특정 경로로 마운트한 설정이 디스크 이름이 변경 되면 설정이 제대로 적용되지 않는다.

이러한 문제를 피하기 위해, UUID를 사용하여 디스크를 식별한다. UUID는 디스크에 고유하게 할당된 번호로 VM 유형이 변경되더라도 UUID는 변하지 않기 때문에, UUID를 기반으로 설정하면 디스크 이름이 바뀌어도 마운트 설정을 유지할 수 있다.

  • VM Type 별 Default disk name
    • t3: nvme0n1p1
    • t2: xvda1