개요
인터넷에서 수집한 덤프를 각색하면서 생소한 내용이거나 어려웠던 문제들을 선별해 저만의 풀이법으로 기록하며 RHCSA 취득을 위한 여정에 떠나보겠습니다!
사실 자격증 취득이 급한게 아니기도 하고, 주말을 이용해 여유롭게 공부할 계획이라서 문제 풀이 업데이트가 조금 뜸할 수도 있습니다!
최종 목표는 CKAD, CKA까지! RHCSA부터 힘내서 같이 시작해 봅시다!
1. Network 설정
문제 01: ens18와 같은 네트워크 인터페이스에 대해 testprofile 이라는 이름의 NetworkManager 연결 프로필을 구성하세요. 다음의 정적 설정을 적용하시면 됩니다.
- IPv4.Address:
192.168.0.1/24 - IPv6.Address:
fd01::101/64 - IPv4 Default Gateway:
192.168.0.1 - IPv6 Default Gateway:
fd01::100 - IPv4 DNS Servers:
8.8.8.8,8.8.4.4 - IPv6 DNS Server:
fd01::111 - DNS Search Domain:
example.com
먼저, 현재 시스템에 구성된 인터페이스 상태를 확인해보겠습니다.
nmcli device status
DEVICE TYPE STATE CONNECTION
ens18 ethernet 연결됨 ens18
lo loopback 연결됨 (외부) lo현재 구성된 시스템에는 ens18 이라는 인터페이스가 존재하네요.
이제부터 네트워크 설정을 해보겠습니다.
- Connection Profile을 생성해주세요.
nmcli connection add type ethernet con-name testprofile if-name ens3- IPv4 주소와 IPv6 주소를 할당해주겠습니다.
nmcli connection modify testprofile ipv4.addresses 192.168.0.1/24 ipv6.addresses fd01::101/64IP 할당 해줄 때 서브넷 마스크도 필수로 작성해주셔야 합니다.
- IP 주소를 수동(
manual)로 지정해줍시다.
nmcli connection modify testprofile ipv4.method manual ipv6.method manualNetworkManager가 DHCP를 통해 IP 주소를 자동으로 획득하지 않도록 해야합니다.
- 기본 게이트웨이 설정하기
nmcli connection modify testprofile ipv4.gateway 192.168.0.1 ipv6.gateway fd01::100- DNS 주소 설정하기
nmcli connection modify testprofile ipv4.dns "8.8.8.8 8.8.4.4" ipv6.dns fd01::111- DNS search domain 추가하기
nmcli connection modify testprofile ipv4.dns-search example.com ipv6.dns-search example.com- 위에서 생성한
testprofile연결 활성화하기
nmcli connection up testprofile검증 해보기
- 현재
connection이 active 상태인지 확인합시다.
nmcli connection show --active- 생성한
testprofile설정 확인하기
nmcli -p con show testprofile- 인터페이스 주소가 정상적으로 변경 되었는지 확인하기
ip address show ens18- 기본 게이트웨이 확인하기
ip route show- DNS 주소 확인하기
cat /etc/resolv.conf- 외부로
ping날려보기
ping 8.8.8.82. 세컨더리 IP 설정
문제 01: testprofile이라는 이름의 연결 프로필에 다음 보조 IPv4를 정적으로 추가해주세요. 기존 설정을 손상시키지 않는 방식으로 이 작업을 수행하셔야 합니다.
- 보조 IPv4 주소:
10.0.0.5/24
- 활성화된 네트워크 프로필 확인하기
nmcli connection show --active현재 활성화된 모든 네트워크 연결 프로필을 출력해서 testprofile이 활성 상태인지 확인해볼게요.
- 보조 IPv4 주소 추가하기
nmcli connection modify testprofile +ipv4.addresses 10.0.0.5/24+ipv4.addresses+기호는 다른 구성을 덮어쓰지 않고 기존 주소에 새 IP를 추가합니다. (Secondary)
- 업데이트된 연결 활성화
네트워크를 다시 연결합니다.
nmcli connection up testprofile또는 다음 명령어로 구성을 다시 로드할 수 있어요.
nmcli connection reload- 새 IP 적용이 안되는 경우
NetworkManager서비스를 재시작해주세요.
systemctl restart NetworkManager3. root 비밀번호 복구 (rd.break, init=/bin/bash)
문제 01: 서버의 root 비밀번호를 분실하였습니다. 시스템에 다시 접근하기 위해서 root 비밀번호를 재설정하세요.
root 비밀번호를 복구하는 방법에는 rd.break, init=/bin/bash 두 가지 방식이 있습니다.
RHEL 9.0 버전으로 올라와서부터 rd.break가 안된다는 소문이 있어서,
제가 rhel.9.3에서 테스트를 진행해봤습니다.
rd.break, init=/bin/bash 두 가지 방식 모두 정상 동작합니다.
그러나 시험 환경에서는 안될 수도 있으므로, 두 가지 방식 다 모두 직접 실습해보는 것을 권장합니다.
이제부터 각각의 방식에 대한 풀이법을 기록해보겟습니다.
복구 모드(Rescue Mode) rd.break 방식
- 시스템 재부팅
GRUB 2 부팅 화면에서, 아래쪽 화살표 키를 사용하여 "Advanced options for Red Hat Enterprise Linux"를 선택합니다.
- 커널 부팅 옵션 편집
원하는 커널 버전 선택하고 e 키를 눌러서 부팅 옵션을 편집해야 합니다.
- 복구 모드 매개변수 추가
linux로 시작하는 줄로 이동하여 Ctrl+E를 눌러 줄 끝으로 넘어가주세요.
그리고 줄 끝에 rd.break를 추가합니다.
(선택 사항: 충돌을 피하기 위해서 console= 또는 vconsole=keymap= 옵션을 제거할 수 있어요.)
- 비상 셸로 부팅하기
Ctrl+X를 눌러서 수정된 매개변수로 부팅하면 비상 셸로 진입이 됩니다!
- 루트 파일시스템을 쓰기 가능으로 다시 마운트
mount -o remount,rw /sysrootchroot환경으로 진입하기
chroot /sysroot- Root 비밀번호 재설정
passwd root- SELinux 리레이블링 활성화
touch /.autorelabel- 종료 및 재부팅
Ctrl+D를 두 번 눌러 chroot와 비상 셸을 종료합니다.
시스템이 재부팅되고, SELinux가 파일 컨텍스트를 리레이블링하여 보안 규정을 준수하도록 합니다!
단일 사용자 모드 init=/bin/bash 방식 (대안)
- 재부팅 및 부팅 매개변수 편집
GRUB 2 부팅 화면에서 커널을 선택하고, e 키를 누른 뒤 linux로 시작하는 줄의 끝으로 이동합니다.
- 단일 사용자 모드를 위한 부팅 매개변수 수정
init=/bin/bash를 추가하고 ro를 rw로 교체합니다. (선택 사항: console= 또는 vconsole.keymap= 옵션을 제거할 수 있습니다.)
- 단일 사용자 셸로 부팅
Ctrl+X를 눌러 변경된 내용으로 부팅합니다.
- Root 비밀번호 재설정
passwd root- SELinux 리레이블링 활성화
touch /.autorelabel- 시스템 재부팅
exec /sbin/init4. YUM/DNF 레포지토리 설정
문제 01: /mnt 디렉토리에 마운트된 RHEL-9 ISO 이미지를 사용하여서 로컬 YUM/DNF 레포지토리를 설정하세요.
이 실습을 진행하려면 시스템에 RHEL-9 ISO 이미지가 있어야 합니다!
- RHEL-9 ISO 이미지 마운트하기
RHEL-9.iso 파일을 루프 장비(loop device)로 /mnt 디렉토리에 마운트합니다.
mount -o loop RHEL-9.iso /mnt-o loop: ISO를 루프백 장치로 마운트하도록 지정합니다.- 루프 장치는 ISO를 물리적 디스크처럼 취급합니다.
- 진행하기 전에
RHEL-9.iso파일이 있는지 확인하세요.
- [선택 사항] 마운트 영구 설정
부팅 시 ISO가 자동으로 마운트되도록 설정하고 싶다면 /etc/fstab에 마운트 명령어를 다음과 같이 추가해줍시다.
echo "/path/to/RHEL-9.iso /mnt iso9660 loop 0 0" >> /etc/fstab/path/to/RHEL-9.iso를 실제 ISO 파일 위치로 바꿔주세요.- 만약 "
iso9660 defaults"를 사용하면, 시스템은ISO9660마운트를 위한 기본 옵션을 적용합니다. - 만약 "
iso9660 loop"를 사용하면, ISO 이미지 마운트를 위해 루프백 장치를 사용하도록 명시적으로 지정합니다. - 두 접근 방식 모두 유효하지만, ISO 파일을 다룰 때는 마운트 과정에 루프백 장치가 사용된다는 것을 명확히 하기 위해 "iso9660 loop" 옵션이 명시적으로 자주 사용됩니다.
- 로컬 레포지토리 파일 생성
/mnt/media.repo 파일을 /etc/yum.repos.d/rhel9.repo로 복사하거나, 새로운 /etc/yum.repos.d/rhel9.repo 파일을 생성합니다
cp /mnt/media.repo /etc/yum.repos.d/rhel9.repo- 파일 권한 설정
모든 사용자가 읽을 수 있도록 /etc/yum.repos.d/rhel9.repo의 권한을 설정합니다
chmod 644 /etc/yum.repos.d/rhel9.repo- 레포지토리 파일 편집
텍스트 편집기(예: vim)로 /etc/yum.repos.d/rhel9.repo 파일을 엽니다.
기존 내용을 다음 내용으로 교체해주세요.
[InstallMedia-BaseOS]
name=RHEL 9 - BaseOS
metadata_expire=-1
gpgcheck=0
enabled=1
baseurl=file:///mnt/BaseOS/
[InstallMedia-AppStream]
name=RHEL 9 - AppStream
metadata_expire=-1
gpgcheck=0
enabled=1
baseurl=file:///mnt/AppStream/- 시스템 캐시 정리
Yum/DNF 및 subscription-manager 캐시를 지웁니다
dnf clean all
subscription-manager clean참고
"This system is not registered"라는 메시지가 나타날 수 있습니다.
이 메시지를 없애려면 /etc/yum/pluginconf.d/subscription-manager.conf 파일을 편집하여 enabled=0으로 설정해주세요.
- 리포지토리 설정 확인:
사용 가능한 리포지토리 목록을 확인해봅시다.
dnf repolist문제 02: 아래 제공되는 링크로 YUM 레포지토리를 설정하세요.
BaseOS:http://content.example.com/rhel8.0/x86_64/dvdAppStream:http://content.example.com/rhel8.0/x86_64/dvd/AppStream
/etc/yum.repos.d/rhcsa-test.repo 파일에 다음과 같이 입력하고 저장하기.
[BaseOS]
name=BaseOS
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
enabled=1
gpgcheck=0
[AppStream]
name=AppStream
baseurl=http://content.example.com/rhel9.0/x86_64/dvd/AppStream
enabled=1
gpgcheck=0yum repo 리스트 확인하기
yum clean all
yum repolist -v5. SELinux PORT 설정
문제 1: 비표준 포트 83번에서 실행 중인 웹 서버가 서비스 제공 시 문제를 겪고 있습니다. 다음 조건을 충족하도록 문제를 해결하세요.
- 1. 시스템의 웹 서버가
/var/www/html에 있는 모든 기존 HTML 파일을 제공할 수 있어야 합니다. - 2. 웹 서버가 포트 83로 서비스가 되도록 하세요.
- 3. 웹 서버가 시스템이 시작될 때 자동으로 시작되어야 합니다.
현재 테스트 중인 VM 서버에 아파치(httpd) 패키지를 설치해주도록 하겠습니다.
dnf install -y httpd그리고 문제 요구사항에 맞게 httpd 서비스의 LISTEN 포트를 83번으로 변경해주도록 합시다.
관련 설정 파일은 /etc/httpd/conf/httpd.conf 입니다.
해당 파일에서 LISTEN 82를 LISTEN 83으로 변경해주시면 됩니다.
변경사항 적용을 위해 서비스를 재시작하겠습니다.
systemctl restart httpd5-1. could not bind
httpd 서비스의 LISTEN 포트를 83번으로 변경하고 서비스를 재시작하니 다음과 같은 에러가 발생합니다.
$ journalctl -xeu httpd
9월 27 12:32:08 localhost.localdomain httpd[1005]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:83
9월 27 12:32:08 localhost.localdomain httpd[1005]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:83리눅스에서 1024 이하 포트는 root만 바인딩할 수 있고,
httpd는 보통 apache 사용자로 실행되기 때문에 SELinux 보안 정책 때문에 차단이 되어버린 것 같습니다.
RHEL 계열에서 httpd는 기본적으로 80, 82, 443 같은 몇 개의 포트만 허용이 되니까,
다른 포트를 사용하려면 SELinux 설정에 83번 포트를 추가해줘야 합니다.
현재 SELinux 설정을 확인해볼까요?
$ semanage port -l | grep http_port_t
http_port_t tcp 82, 80, 81, 443, 488, 8008, 8009, 8443, 9000역시나 83번 포트는 허용되어 있지 않네요.
아래 명령을 실행하여 포트를 추가해주겠습니다.
semanage port -a -t http_port_t -p tcp 83그리고 다시 httpd 서비스를 재시작 해주세요.
systemctl restart httpd그럼 이제 문제 요구사항에 맞게 실습을 진행해보겠습니다.
83번 포트 추가하기
# 허용 포트 확인
semanage port -l | grep http_port_t
# 83번 포트 추가
semanage port -a -t http_port_t -p tcp 83
# 추가됐는지 다시 확인
semanage port -l | grep http_port_t방화벽(firewalld) 추가 및 재시작
firewall-cmd --permanent --add-port=83/tcp
firewall-cmd --reload테스트
curl http://localhost:836. 사용자 계정 생성
문제 1: 아래 요구사항에 맞게 사용자 및 그룹을 생성하세요.
sysadms라는 그룹을 생성하시오.natasha와harry라는 사용자를 생성하고, 이들은 보조 그룹sysadms의 멤버가 되도록 하시오.sarah라는 사용자를 생성하되, 이 사용자는 비대화형(non-interactive) 셸을 사용해야 하며,sysadms그룹의 멤버가 아니어야 한다.- 모든 사용자의 비밀번호는
trootent로 설정하시오. sysadms그룹은 서버에서 useradd 명령을 사용할 수 있는 권한을 가져야 한다.harry사용자는 sudo 비밀번호 입력 없이 다른 사용자의 비밀번호를 설정할 수 있어야 한다.
sysadms 그룹 생성하기.
groupadd sysadmsnatasha와 harry 유저 생성하고 해당 유저를 sysadms에 소속시키기.
useradd -G sysadms natasha
useradd -G sysadms harrysarah 사용자 생성
useradd -s /sbin/nologin sarah유저 패스워드 설정
$ passwd <user name>
# 또는
$ echo "trootent" | passwd --stdin natasha
$ echo "trootent" | passwd --stdin harry
$ echo "trootent" | passwd --stdin sarahsysadms 그룹에 및 harry 사용자에 대한 sudo 권한 설정
$ visudo
# 다음 내용 추가
%sysadms ALL=(ALL) NOPASSWD:ALL
harry ALL=(ALL) NOPASSWD:/usr/bin/passwd문제 2: 아래 요구사항에 맞게 사용자를 생성하세요.
- 그룹 ID가
1010인halo_team이라는 그룹을 생성하세요. - 사용자 ID가
1010인halo를 생성하고, 이 사용자는halo_team의 멤버로 생성되도록 하세요.- 또한 해당 사용자는
/bin/bash쉘을 사용하며, 홈 디렉토리가 자동으로 생성되어야 합니다.
- 또한 해당 사용자는
- 패스워드는
echo로 지정하세요.
# 그룹 생성
groupadd -g 1010 halo_team
# 사용자 생성
useradd -u 1010 -s /bin/bash -g halo_team -m halo
# 패스워드 설정
echo "echo" | passwd --stdin halo7. Crontab
문제 1: natasha 사용자로서, 2분마다 실행되며 logger "EX200 in progress" 명령을 수행하는 크론 잡을 설정하시오.
crond 서비스 활성화 중인지 확인
systemctl status crond
# 없으면 설치
dnf install -y cronie
systemctl enable --now croniecrontab 정책 설정
crontab -u natasha -e
# 아래 내용 추가
*/2 * * * * logger "EX200 in progress"*(분)*(시)*(일)*(월)*(요일)
로그 확인해보기
tail /var/log/messages8. 협업 디렉토리
문제 1: 협업 디렉토리를 아래 요구사항에 맞게 설정 하시오.
/home/manager디렉터리를 다음과 같은 조건으로 생성하시오./home/manager의 그룹 소유권은sysadms그룹으로 설정되어야 한다.sysadms그룹의 모든 구성원은 해당 디렉터리에 대해 전체 권한을 가져야 하지만,root를 제외한 다른 사용자들은 접근할 수 없어야 한다.- 앞으로
/home/manager하위에 생성되는 모든 파일은 동일한 그룹 소유권(sysadms)을 가져야 한다.
/home/manager 디렉토리 생성
mkdir /home/manager그룹 소유권 변경
chgrp sysadms /home/manager디렉토리 권한 수정
chmod 2770 /home/manager검증
$ ls -ld /home/manager
drwxrws---. 2 root sysadms 6 9월 27일 13:20 /home/manager/
# 파일 생성해보기
$ touch /home/manager/test.txt
-rw-r--r--. 1 root sysadms 0 9월 27일 13:49 test.txt보면 test.txt 파일의 그룹이 sysadms로 자동 적용되어 생성되는 것을 볼 수 있다.
9. NTP 설정
문제 1: 아래 요구사항에 맞게 NTP를 설정하시오.
- 시스템의 시간을
ntp.example.com서버와 동기화하세요.
RHEL 7 버전부터는 시간 동기화를 위해 기본적으로 Chrony 데몬(chronyd)을 사용합니다.
1-1. Chrony 패키지 설치 확인
rpm -q chrony
# 없으면 설치
yum install -y chrony1-2. chrony 설정 파일 수정
NTP 서버 지정을 위해 Chrony 설정 파일을 다음과 같이 수정해주세요.
vim /etc/chrony.conf
# 기본 서버 주소 ntp.example.com로 변경
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst # 수정 전
server ntp.example.com iburst # 수정 후iburst- 시스템 부팅 시 시간 동기화 속도 높여주는 옵션입니다.
1-3. Chrony 서비스 재시작 및 활성화
systemctl enable --now chronyd
systemctl status chronyd1-4. 동기화 상태 확인 및 시간 동기화
chronyc sources 명령어 사용 시 현재 동기화 중인 시간 서버의 상태 확인이 가능합니다.
$ chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.example.com 2 6 377 11 -480us[-483us] +/- 15ms
# 시간 동기화 활성화
timedatectl set-ntp true10. Autofs 설정
문제 1: Autofs를 설정해야 합니다. 다음 요구사항을 기반으로 Autofs을 설정해주세요.
- 1. materials.example.com (172.25.254.254) 에는 NFS 공유 드렉토리
/rhome있습니다. 이 파일 시스템에는 사용자 remoteuser1 대해 사전 구성된 홈 디렉터리가 포함됩니다. - 2. remoteuser1의 홈 디렉터리는
materials.example.com:/rhome/remoteuser1입니다. - 3. remoteuser1의 홈 디렉터리는 로컬의 /rhome 디렉토리 하위의 /rhome/remoteuser1로 자동으로 마운트 되어야 합니다.
- 4. 홈 디렉토리는 해당 사용자가 쓰기(
writable) 가능해야 합니다. remoteuser1의 비밀번호는 flectrag입니다.
해당 문제의 핵심은 사용자가 /rhome/remoteuser1 디렉토리에 접근하려고 할 때,
시스템이 자동으로 materials.example.com 서버의 /rhome/remoteuser1 디렉토리를 NFS로 연결(마운트)하도록 설정하는 것입니다.
아래 단계를 차근차근 따라하여 Autofs을 설정합시다.
10-1. [서버] 설정
시험 환경에서는 NFS 서버 설정이 되어 있을 것으로 예상이 됩니다만,
저는 전체적인 구성에 대해 이해하기 위하여 서버 설정까지 해보기로 하였습니다.
1. nfs 서버 설정하기
먼저 원격 사용자의 홈 디렉토리를 제공할 NFS 서버를 설정해야 합니다.
1-1. nfs 서버 설치
dnf install -y nfs-utils1-2. 공유할 디렉토리 및 사용자 홈 디렉토리 생성
# 공유할 최상위 디렉토리 생성
mkdir /rhome
# 문제의 사용자인 remoteuser1의 홈 디렉토리 생성
mkdir /rhome/remoteuser1
# 테스트를 위해 해당 사용자를 서버에 생성해주고, 홈 디렉토리 소유권 부여
useradd remoteuser1
chown -R remoteuser1:remoteuser1 /rhome/remoteuser1
# 비밀번호 설정
echo "flectrag" | passwd --stdin remoteuser11-3. NFS 공유 설정 파일 수정 (/etc/exports)
vim /etc/exports
# 맨 아래에 다음 내용을 추가합니다. 클라이언트가 읽고 쓸 수 있도록(rw) 허용하는 설정입니다.
/rhome *(rw,sync)1-4. NFS 서비스 시작 및 활성화
systemctl enable --now nfs-server1-5. 방화벽 설정
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpcbind
firewall-cmd --reload이제 서버 준비는 끝났습니다!
10-2. [클라이언트] 설정
1. Autofs 설치
dnf install -y autofs
systemctl enable --now autofs2. 메인 설정 파일 수정 (/etc/auto.master)
auto.master 파일은 Autofs의 "총괄 지도"라고 보면 됩니다.
"어떤 경로에 접근하면, 어떤 세부 지도를 참고해라" 라고 알려주는 역할을 합니다.
vim /etc/auto.master위 파일 맨 아래에 다음 내용을 추가해주세요.
# [마운트 포인트] [세부 설정 파일(맵 파일)]
/rhome /etc/auto.rhome- 의미:
/rhome이라는 디렉토리 하위의 어떤 경로로든 접근이 시도되면,/etc/auto.rhome파일을 참고해서 처리해라!
3. 세부 설정 파일(맵 파일) 생성 및 수정 (/etc/auto.rhome)
auto.rhome 파일은 /rhome 경로에 대한 "세부 지도"입니다.
실제 어떤 서버의 어떤 디렉토리를 연결할 지 상세 규칙을 정합니다.
vim /etc/auto.rhome위 파일 맨 아래에 다음 내용을 추가해주세요.
# [키(하위 디렉터리명)] -[마운트 옵션] [서버:/원격/경로]
remoteuser1 -fstype=nfs,rw,sync materials.example.com:/rhome/remoteuser1remoteuser1(키):/rhome바로 밑에 생성될 하위 디렉터리 이름입니다.- 즉,
/rhome/remoteuser1에 접근할 때 이 규칙이 적용됩니다.*(와일드카드)를 사용하면 모든 사용자에게 일괄 적용할 수도 있습니다. * -fstype=nfs,rw,sync materials.example.com:/rhome/&
- 즉,
-fstype=nfs,rw,sync(옵션)fstype=nfs: 파일 시스템 타입은 NFS입니다. (nfs4도 가능)rw: 읽고 쓰기(Read/Write)가 가능해야 합니다. (문제 요구사항)sync: 데이터 변경 시 즉시 서버에 기록합니다. 안정적이지만 약간 느릴 수 있습니다.
materials.example.com:/rhome/remoteuser1(위치): 연결할 NFS 서버의 주소와 공유 디렉터리 경로입니다.
4. Autofs 재시작
설정 파일을 변경했으니 Autofs 서비스에 다시 읽어오라고 알려줘야 합니다.
systemctl restart autofs5. 검증
이제 모든 설정이 끝났습니다. Autofs가 마법을 부리는 순간을 확인해 봅시다.
① 접근 전 확인: /rhome 디렉토리로 가보면 아무것도 없습니다. 아직 remoteuser1 디렉토리는 보이지 않는 것이 정상!
ls -l /rhome② 자동 마운트 트리거: 이제 해당 디렉토리를 사용하기 위한 시도를 하면 됩니다.
ls -l /rhome/remoteuser1위 명령을 실행하는 순간! Autofs가 /etc/auto.rhome 규칙을 보고 materials.example.com 서버에 접속하여 디렉토리를 마운트합니다.
③ 마운트 확인: mount로 현재 마운트된 목록을 확인해 보면, 방금 우리가 설정한 내용이 마운트된 것을 볼 수 있습니다.
mount | grep remoteuser1
# 결과 예시:
# materials.example.com:/rhome/remoteuser1 on /rhome/remoteuser1 type nfs4 (...)④ 쓰기 권한 테스트: 문제의 요구사항대로 쓰기가 가능한지 파일을 생성해 봅시다.
touch /rhome/remoteuser1/testfile
ls -l /rhome/remoteuser1testfile이 성공적으로 생성되었다면 모든 설정이 완벽하게 이루어졌습니다!
10-3. 트러블슈팅
autofs를 이용하여 원격 서버의 홈 디렉토리를 /rhome/remoteuser1로 자동 마운트하는 데 성공했습니다.
mount 명령어로 확인해도 잘 붙어있고, ls로 디렉토리를 보는 것까지도 완벽했죠..
/etc/auto.rhome on /rhome type autofs (rw,relatime,fd=12,pgrp=2889,timeout=300,minproto=5,maxproto=5,indirect,pipe_ino=29882)
192.168.219.111:/rhome/remoteuser1 on /rhome/remoteuser1 type nfs4 (rw,relatime,sync,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.219.107,local_lock=none,addr=192.168.219.111)하지만 파일을 생성하려는 순간, 차가운 메시지가 저를 반겼습니다.
[root@client ~]# touch /rhome/remoteuser1/test.txt
touch: '/rhome/remoteuser1/test.txt'에 touch 명령 실행 불가: 허가 거부분명 마운트 옵션에 쓰기(rw)권한도 줬는데 왜 안되는 걸까요? 지금부터 범인 추적 들어갑니다.
1. 뒤바뀐 소유자(UID/GID) 불일치
가장 먼저 의심해야 할 것은 파일 시스템의 소유 권한 입니다.
클라이언트에서 마운트된 디렉토리의 소유자를 확인해 봤습니다.
# 클라이언트에서 실행
ls -ld /rhome/remoteuser1
drwxr-xr-x. 2 natasha sysadms 36 10월 4일 21:23 /rhome/remoteuser1서버에서는 분명 remoteuser1로 소유권 및 그룹을 지정해줬었는데, 클라이언트에서는 뜬금없이 natasha라는 사용자가 주인으로 나오고 있네요?
🕵️♀️ 원인
이유는 NFS가 사용자를 이름(Name)이 아닌 숫자 ID(UID, GID)로 인식하기 때문입니다.
- 서버: "이 디렉토리 주인은 UID 1005번이야. 내 시스템에서는
remoteuser1이지." - 클라이언트: "오케이, UID 1005번 소유의 디렉토리를 받았어. 내 시스템에서는 UID 1005번은
natasha네? 그럼natasha소유라고 보여줘야겠다."
즉, 소유권이 바뀐게 아니라, 같은 ID 번호에 매핑된 사용자 이름이 서버와 클라이언트 간 달랐기 때문에 발생한 문제인 겁니다.
✅ 해결
서버와 클라이언트 사용자 ID를 동기화해야 합니다.
id <사용자명> 명령으로 각 시스템의 UID/GID를 확인하고, usermod, groupmod 또는 useradd -u <UID> 등의 명령으로 양쪽 ID를 동일하게 맞춰줍니다.
저는 서버의 remoteuser1 ID를 기준으로 클라이언트의 사용자 ID 설정을 맞춰주었습니다.
# 서버에서 클라이언트에서 생성한 remoteuser1 계정의 uid,gid 값을 맞춰주었음.
groupmod -g 1005 remoteuser 1
usermod -u 1004 -g 1005 remoteuser1그 결과, ls -ld 명령의 결과가 드디어 깔끔하게 나왔습니다!
drwxr-xr-x. 2 remoteuser1 remoteuser1 36 10월 4일 21:23 /rhome/remoteuser12. 관리자(root)의 함정, root_squash
이제 소유자도 완벽하게 일치하니 모든 게 끝났다고 생각했습니다.
하지만 클라이언트의 root 계정으로 다시 파일을 생성해보니 .. 여전히 "허가 거부" 메시지가 발생하네요.
👮♂️ 원인
이것은 오류가 아닌, NFS의 아주 중요한 보안 기능인 root_squash 때문입니다.
NFS 서버는 기본적으로 "클라이언트의 root는 믿을 수 없다" 는 정책을 가집니다.
그래서 클라이언트의 root가 보낸 요청을 서버에서는 아무 권한 없는 nfsnobody라는 사용자의 요청으로 강등시켜 버립니다.
당연히 권한 없는 nfsnobody는 remoteuser1의 디렉토리에 파일을 쓸 수 없겠죠.
⭐ 해결
문제의 원인은 root로 작업을 시도했기 때문이겠죠?
그렇다면 해결책은 매우 간단합니다.
바로 디렉토리의 실제 주인인 remoteuser1 사용자로 작업을 실행하면 되는겁니다.
# 클라이언트에서 root 사용자로 있을 때
[root@client ~]# whoami
root
# su 명령으로 remoteuser1으로 변신!
[root@client ~]# su - remoteuser1
Password:
# 사용자가 remoteuser1으로 변경됨
[remoteuser1@client ~]$ whoami
remoteuser1
# 드디어 파일 생성 성공!
[remoteuser1@client ~]$ touch /rhome/remoteuser1/hello_nfs.txt
[remoteuser1@client ~]$ ls -l /rhome/remoteuser1
-rw-r--r--. 1 remoteuser1 remoteuser1 0 10월 5일 21:44 hello_nfs.txt11. 파일 찾기 (find)
문제 1: harry가 소유한 모든 파일을 찾아서 그 복사본을 /root/harry/findfiles 디렉토리에 넣으세요.
find / -user harry -type f -exec cp -a {} /root/harry/findfiles \; 2>/dev/null
``
<br>
확인 결과
```shell
[root@rhcsa-test ~]# ls -alhtr /root/harry/findfiles/
합계 16K
-rw-r--r--. 1 harry harry 522 2024년 10월 29일 .bashrc
-rw-r--r--. 1 harry harry 144 2024년 10월 29일 .bash_profile
-rw-r--r--. 1 harry harry 18 2024년 10월 29일 .bash_logout
-rw-rw----. 1 harry mail 0 9월 27일 13:08 harry
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_009.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_008.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_007.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_006.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_005.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_004.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_003.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_002.txt
-rw-r--r--. 1 harry harry 0 10월 6일 10:07 harry_001.txt
drwxr-xr-x. 3 root root 23 10월 6일 10:08 ..
drwxr-xr-x. 2 root root 4.0K 10월 6일 10:09 .12. 문자열 찾기 (grep)
문제 1: 아래 요구사항을 바탕으로 문제를 해결하세요.
- 파일
/usr/share/centos-release/EULA에서 문자열CentOS가 포함된 모든 행을 찾아서 이 모든 행을 원래 순서대로/root/list파일에 복사하세요. /root/list에는 빈 행이 없어야 합니다.- 모든 행은
/usr/share/centos-release/EULA파일의 원래 행과 정확히 일치해야 합니다.
grep "CentOS" /usr/share/centos-release/EULA > /root/list13. 아카이브 생성
문제 1: /usr/local의 내용을 포함하는 tar 아카이브를 생성하고, 이를 bzip2로 압축하여 /root/backup/backup.tar.bz2로 저장하세요.
tar -cvjf /root/backup/backup.tar.bz2 /usr/local압축 내역 확인하기
[root@rhcsa-test ~]# tar -tf /root/backup/backup.tar.bz2
usr/local/
usr/local/bin/
usr/local/etc/
usr/local/games/
usr/local/include/
usr/local/lib/
usr/local/lib64/
usr/local/lib64/bpf/
usr/local/libexec/
usr/local/sbin/
usr/local/share/
usr/local/share/applications/
usr/local/share/info/
usr/local/share/man/
usr/local/share/man/man1/
usr/local/share/man/man1x/
usr/local/share/man/man2/
usr/local/share/man/man2x/
usr/local/share/man/man3/
usr/local/share/man/man3x/
usr/local/share/man/man4/
usr/local/share/man/man4x/
usr/local/share/man/man5/
usr/local/share/man/man5x/
usr/local/share/man/man6/
usr/local/share/man/man6x/
usr/local/share/man/man7/
usr/local/share/man/man7x/
usr/local/share/man/man8/
usr/local/share/man/man8x/
usr/local/share/man/man9/
usr/local/share/man/man9x/
usr/local/share/man/mann/
usr/local/src/함정 조심
실습 서버에 bzip2가 설치되어 있지 않은 경우 tar -j 옵션을 줘서 bzip2로 압축하더라도 정상적으로 처리되지 않음.
즉, tar -cvjf <압축파일명> <압축할타겟> 이런식으로 명령을 넘기더라도 압축파일 자체는 생성이 되지만, bzip2 패키지가 설치되지 않았기 때문에 압축은 되지 않음.
그렇기 때문에 압축한 이후에 꼭 tar -tf <압축한파일명>으로 압축이 정상적으로 진행되었는지 검증 과정을 놓치지 말아야 함!
해결 방법은 단순히 dnf install -y bzip2로 bzip2 패키지를 설치해주고 다시 아카이브를 생성해주는 명령어를 실행하면 된다.
14. 파일 권한 설정 (setfacl)
문제 1: /etc/fstab 파일을 /var/tmp 디렉토리로 복사하세요. 그리고 /var/tmp/fstab 파일의 권한을 아래 요구사항에 맞게 설정하세요.
/var/tmp/fstab파일의 소유자는root사용자여야 합니다./var/tmp/fstab파일의 소유 그룹은root그룹이어야 합니다./var/tmp/fstab파일은 그 누구도 실행할 수 없어야 합니다.natasha사용자는/var/tmp/fstab파일을 읽고 쓸 수 있어야 합니다.harry사용자는/var/tmo/fstab파일을 읽거나 쓸 수 없어야 합니다.- 위 사용자를 제외한 다른 모든 사용자들(현재 및 미래의 사용자 포함)은
/var/tmp/fstab파일을 읽을 수만 있어야 합니다.
[파일 복사]
cp /etc/fstab /var/tmp[/var/tmp/fstab 소유권 설정]
chown root:root /var/tmp/fstab[/var/tmp/fstab 권한 설정]
chmod 644[ACL을 이용한 권한 설정]
natasha와 harry 사용자에 대한 개별 권한은 표준 권한만으로는 설정할 수 없습니다!
이럴 때 사용하는 것이 바로 ACL(Access Control List) 입니다.
리눅스에서는 setfacl 명령어를 사용해요.
# 1. natasha 사용자에게 읽기(r)와 쓰기(w) 권한 부여
setfacl -m u:natasha:rw- /var/tmp/fstab
# 2. harry 사용자에게 부여된 모든 권한 제거
setfacl -m u:harry:--- /var/tmp/fstab-m: ACL 설정을 수정(modify) 하겠다는 옵션u:[사용자명]:[권한]: 특정 사용자(user)에게 권한을 부여하는 형식
[검증]
getfacl 명령어로 상세 ACL 확인
[root@rhcsa-test tmp]# getfacl /var/tmp/fstab
getfacl: Removing leading '/' from absolute path names
# file: var/tmp/fstab
# owner: root
# group: root
user::rw-
user:natasha:rw-
user:harry:---
group::r--
mask::rw-
other::r--15. 패스워드 유효 기간 설정
문제 1: 패스워드의 유효기간을 최대 20일로 설정하세요.
vim /etc/login.defs아래 변수를 다음과 같이 수정하세요.
PASS_MAX_DAYS 20문제 2: natasha 유저의 패스워드 유효기간을 최대 20일로 설정하세요
chage 명령어 활용
chage -M 20 natasha16. 로그인 메시지 출력
문제 1: natasha 사용자로 로그인했을 때 메시지를 출력하는 rhcsa 라는 일므의 애플리케이션(스크립트)을 만드세요.
로그인 메시지를 출력하는 스크립트 작성
vim /usr/local/bin/rhcsa
# 스크립트 작성
echo "Welcome to rhcsa!"스크립트 권한 설정
chmod +x /usr/local/bin/rhcsanatasha 사용자의 .bashrc 설정
vim /home/natasha/.bashrc
# 위에서 생성한 스크립트 실행하도록 설정
if [ -f /usr/local/bin/rhcsa ]; then
/usr/local/bin/rhcsa
fi17. Umask 설정
umask는 파일이나 디렉토리가 생성될 때 부여되는 기본 권한을 제어하는 설정 값입니다.
자세하게 들어가면 써야할 내용이 너무 많으니 간략하게 설정하는 방법만 작성하도록 하겠습니다!
시스템에는 파일과 디렉토리를 만들 때 적용하려는 '최대 권한'이 정해져 있습니다.
umask는 이 최대 권한에서 특정 권한을 제거(masking) 하는 역할을 한다고 보시면 됩니다.
17-1. umask 계산법
umask의 계산법은 간단한 "뺄셈"으로 이해할 수 있습니다.
- 최대 기본 권한 -
umask값 = 최종 권한
여기서 중요한 점은 파일과 디렉토리의 최대 기본 권한이 다르다 는 것입니다.
파일의 최대 권한: 666 (rw-rw-rw)
파일은 기본적으로 실행 권한(x)을 가질 필요가 없기 때문에, 보안상 x 권한이 빠진 666이 최대치입니다.
디렉토리의 최대 권한: 777 (rwxrwxrwx)
디렉토리는 내용을 보거나 접근(cd)하기 위해 실행 권한(x)이 반드시 필요하므로 777이 최대치입니다.
예시: 가장 흔한 umask: 022
대부분의 리눅스 시스템은 기본 umask 값으로 022를 사용합니다.
이 값의 의미는 "그룹(group)과 다른 사용자(others)에게서 쓰기(write,2) 권한을 빼앗겠다"는 뜻이죠.
- 파일 생성 시:
666-022=644(rw-r--r--) - 디렉토리 생성 시:
777-022=755(rwx-r-xr-x)
결과적으로 사용자는 파일을 만들면 rw-r--r-- 권한을, 디렉토리를 만들면 rwxr-xr-x 권한을 갖게 되는거죠!
이제 문제를 풀어보며 umask를 어떻게 사용하는지 다시 한 번 이해해봅시다.
문제 1: 사용자 natasha가 파일과 디렉토리를 생성했을 때, 다음과 같은 권한이 설정되도록 구성하세요.
- 파일 생성 시 기본 권한:
rw------- - 디렉토리 생성 시 기본 권한:
rwx------
이 권한을 만들기 위한 umask 값을 계산해봅시다.
[파일로 계산]
- 최대 권한
666에서 어떤 값을 빼야600이 됩니까? 666-?->?=066
[디렉토리로 계산]
- 최대 권한
777에서 어떤 값을 빼야700이 됩니까? 777-?->?=077
파일과 디렉토리 요구사항을 모두 만족시키려면 더 엄격한 값인 077을 umask로 사용해야 합니다.
umask 값을 077로 설정하면 그룹과 다른 사용자의 모든 권한(rwx)을 제거하게 됩니다.
[umask 077 적용 시 최종 권한]
- 파일:
666-077=600 - 디렉토리:
777-077=700
이제 계산은 전부 끝냈으니 설정 하러 가보죠?
umask는 특정 사용자에게 영구 적용되어야 하므로, 해당 사용자의 셸 시작 파일에 설정해야 합니다.
RHEL 계열에서는 보통 ~/.bash_profile에 설정합니다.
vim /home/natasha/.bash_profile
# 아래 내용 추가
umask 077[검증]
# natasha로 로그인
su natasha
[natasha@rhcsa-test ~]$ touch testfile
[natasha@rhcsa-test ~]$ mkdir testdir
[natasha@rhcsa-test ~]$ ls -lhtr
합계 0
-rw-------. 1 natasha natasha 0 10월 6일 12:04 testfile
drwx------. 2 natasha natasha 6 10월 6일 12:04 testdir
[natasha@rhcsa-test ~]$ umask
007718. Podman build
문제 1: 아래 요구사항에 맞춰 컨테이너를 빌드하세요.
natasha사용자로 http://classroom/Containerfile 을(를) 다운로드하세요.- 다운로드 받은 파일의 내용을 수정하지 말고, 이미지 이름을
pdf로 하여 빌드하세요.
먼저 실습 환경과 동일하게 맞춰주기 위해서 nginx 서버를 구축해주도록 하겠습니다.
nginx 서버에서는 간단한 정적 파일(Containerfile을 제공해줄겁니다.
즉, nginx가 /Containerfile URL 요청을 받으면, /usr/share/nginx/html/containerfiles (혹은 다른 경로)에 있는 실제 파일을 내려주면 되겠죠?
우선 nginx가 제공할 경로에 Containerfile을 복사해 둡니다.
mkdir -p /usr/share/nginx/html/containerfiles
cp /path/to/Dockerfile /usr/share/nginx/html/containerfiles/Containerfile
chmod 644 /usr/share/nginx/html/containerfiles/Containerfile그리고 nginx 설정을 수정해주겠습니다.
기본 서버 블록(/etc/nginx/conf.d/default.conf) 또는 /etc/nginx/sites-available/default을 열어서 다음처럼 설정해주세요.
location /Containerfiles/ {
alias /usr/share/nginx/html/containerfiles/;
autoindex on; # 파일 목록 표시
}이제 클라이언트 측에서 Containerfile을 다운로드 받고 컨테이너 이미지를 빌드해보겠습니다.
podman 서비스 활성화
systemctl enable --now podman.socket사용자 natasha로 컨테이너 다운로드
# SSH 로그인
ssh natasha@node
# Containerfile 다운로드
# wget http://classroom/Containerfile
# 테스트용으로 구축한 nginx 서버에서 다운로드 받기
wget http://192.168.219.107/Containerfiles/Containerfile컨테이너 이미지 빌드
podman build --tag pdf --file Containerfile .이미지 빌드 확인
podman images19. Container - rootless, systemd 등록
문제 1: 아래 요구사항에 맞춰서 컨테이너 생성 및 systemd를 등록하세요.
- 컨테이너 이름:
test_container - Podman build에서 생성한
pdf컨테이너 이미지를 활용하세요. - 수동 개입 없이 시스템 재부팅 시 자등으로 서비스를 시작합니다.
- 컨테이너 시작 시 호스트와 컨테이너의 디렉토리가 자동 마운트 되도록 설정하세요.
- host (
/opt/file) <-> container (/dir1) - host (
/opt/processed) <-> container (/dir2)
- host (
systemd user manager (=Linger) 활성화
loginctl enable-linger natasha디렉토리 생성 및 권한 설정하고 natasha로 로그인
mkdir -p /opt/{file,processed}
chown natasha:natasha /opt/{file,processed}
su - natasha컨테이너 실행하기
podman run -d -it --name test_container -v /opt/file:/dir1:Z -v /opt/processed:/dir2:Z localhost/pdf컨테이너 상태 확인
podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b79936da9c1b localhost/pdf:latest sleep infinity 7 seconds ago Up 7 seconds test_containersystemd 유닛 파일 생성 및 저장
# test_container 컨테이너의 systemd 파일 생성
podman generate systemd --name test_container --files
# 설정 파일 관리할 디렉토리 생성
mkdir -p ~/.config/systemd/user
# 서비스 파일 옮기기
mv /home/natasha/container-test_container.service ~/.config/systemd/usersystemd 서비스 관리
systemctl --user enable --now container-test_container.service재부팅 후 검증
podman ps -a20. LVM - LVM 생성
문제 1: 다음 요구조건에 맞춰 LVM을 생성하세요.
wgroup볼륨 그룹(VG)을 사용하여wshare라는 이름의 LV을 생성하세요.PE(Physical Extent) 크기는 8MB여야 합니다.- LV의 크기는 50 Extents 여야 합니다.
ext4파일 시스템으로 포맷하고/mnt/wshare디렉터리에 마운트하세요. 그리고 다음 재부팅 후에도 자동으로 마운트되어야 합니다.
문제 1 핵심!
- PE 크기 (8MB): PE 크기는 논리 볼륨(LV)을 만들 때가 아니라 볼륨 그룹(VG)을 만들 때 설정하는 값입니다.
- 따라서 이 문제는
wgroup이라는 VG가 이미 8MB의 PE 크기로 생성되어 있음을 가정하거나, 만약 없다면wgroup을 8MB PE 크기로 직접 생성해줘야겠죠?
- 따라서 이 문제는
- LVM 크기 (50 Extents): LVM 크기를
MB나GB가 아닌, Extent 개수(50개) 로 지정하는 것이 핵심입니다.
wgroup 이라는 볼륨 그룹이 없다고 가정하고, 처음부터 진행해보겠습니다.
0. 실습용 디스크 준비 및 wgroup 생성
먼저 group 이라는 볼륨 그룹을 만들어야 합니다.
lsblk 명령어로 사용 가능한 디스크(예: /dev/sdb, /dev/sdc ..)를 확인합니다.
# 1. 사용할 디스크(예: /dev/sdb)를 LVM Physical Volume(PV)으로 초기화
sudo pvcreate /dev/sdb
# 2. 'wgroup' 이라는 VG 생성
# -s 8M 옵션을 사용하여 PE 크기를 8MB로 지정
sudo vgcreate -s 8M wgroup /dev/sdbvgs 또는 vgdisplay wgroup 명령어로 wgroup VG가 잘 생성되었고 PE Size가 올바르게 할당되었는지 확인해줍시다.
vgdisplay wgroup | grep "PE Size"1. 논리 볼륨(LV) 생성 (wshare)
이제 wgroup 안에서 wshare라는 이름의 논리 볼륨을 생성해줍시다.
# -L: 크기 지정 옵션
# -l: 개수 지정 옵션
# -l 50: LVM 크기를 50개의 Extents로 지정 (MB나 GB가 아님.)
# -n wshare: LVM 크기를 wshare로 지정
sudo lvcreate -l 50 -n wshare wgrouplvs 또는 lvdisplay 명령어로 wshare가 잘 생성되었는지 확인합시다.
lvs2. 파일 시스템 포맷
생성된 논리 볼륨을 /dev/wgroup/wshare 경로에 위치됩니다. 이 장치를 ext4로 포맷해줍시다.
sudo mkfs.ext4 /dev/mapper/wshare3. 마운트 포인트 생성 및 마운트
문제에서 요구한 /mnt/wshare 디렉토리를 만들고, 방금 포맷한 볼륨을 마운트해줍시다.
# 1. 마운트 포인트 생성
mkdir -p /mnt/wshare
# 2. 마운트
sudo mount /dev/wgroup/wshare /mnt/wshare
# 확인 (검증)
df -hT | grep "/mnt/wshare"4. 자동 마운트 설정 (fstab)
재부팅 후에도 자동으로 마운트되도록 /etc/fstab 파일에 등록합시다.
장치 이름 대신 UUID를 사용하는 것이 가장 안전하고 권장되는 방법인 것을 참고하세요.
4-1. UUID 확인: blkid 명령어로 방금 생성한 볼륨의 고유 ID(UUID)를 확인합시다.
sudo blkid /dev/wgroup/wshare
# 출력 예시
/dev/wgroup/wshare: UUID="a1b2c3d4-...." TYPE="ext4" ...4-2. /etc/fstab 파일 수정
# [Device (UUID)] [Mount Point] [File System] [Options] [Dump] [Pass]
UUID="<위에서-복사한-UUID>" /mnt/wshare ext4 defaults 0 04-3. fstab 설정 테스트 (매우 중요!)
재부팅 하기 전에, fstab 파일에 오타가 없는지 검증하고, mount -a로 fstab의 모든 항목을 다시 마운트합시다.
sudo umount /mnt/wshare # 테스트 위해 잠시 마운트 해제
sudo mount -a문제 2: 다음 요구사항에 맞춰 /dev/sdb에 LVM을 설정하세요.
- 2GiB 크기의 볼륨 그룹(Volume Group) 을 생성하고 이름을
myvg로 지정하세요. myvg볼륨 그룹 안에 500MiB 크기의 논리 볼륨(Logical Voume) 을 생성하고 이름을mylv로 지정하세요.mylv논리 볼륨을 ext4 파일 시스템 으로 포맷하고,/mylv디렉토리에 영구적으로 마운트되도록 설정하세요.- 이 모든 과정을 마친 후, 마지막으로
mylv의 ext4 파일 시스템을500MiB로 확장하세요.
1. PV 및 VG 생성 작업
/dev/sdb가 정상 인식되고 있는지 block devices 목록 확인
lsblkfdisk 명령어로 /dev/sdb 디스크 파티셔닝
fdisk /dev/sdbfdisk 명령어로 /dev/sdb에 2GiB 크기의 파티션을 생성해주기.
파티셔닝은 다음과 같이 진행함.
n키를 눌러 **새 파티션(New partition)**을 만듭니다.p키를 눌러 기본(primary) 파티션을 선택합니다.- 1 을 입력하여 파티션 번호 1번을 지정합니다.
- Enter 키를 눌러 기본 첫 번째 섹터(default first sector) 를 그대로 사용합니다.
+2G를 입력하여 파티션 크기를 2GiB로 설정합니다.t키를 눌러 파티션 유형(type) 을 변경합니다.82를 입력하여Linux LVM유형으로 설정합니다.w키를 눌러 변경 사항을 저장하고(fdisk 종료) 나옵니다.
Physical Volume 초기화하기
pvcreate /dev/sdb1/dev/sdb1 디스크 파티션을 LVM에서 사용할 수 있도록 초기화해주기.
볼륨 그룹 생성하기
vgcreate myvg /dev/sdb1/dev/sdb1을 사용해 myvg라는 이름의 볼륨 그룹을 생성합니다. 이 그룹 내에서 논리 볼륨(LV)을 자유롭게 생성할 수 있어요.
2. 논리 볼륨 생성
lvcreate -n mylv -L +500MiB myvg
# -L: 크기 지정
# -n: 논리 볼륨 이름 지정myvg 볼륨 그룹 내에 500MiB 크기의 논리 볼륨(LV) 을 생성하고 이름을 mylv로 지정합니다.
검증 명령어
lvs위에서 생성한 mylv 이라는 논리 볼륨이 정상적으로 생성되었는지 검증해줍시다.
논리 볼륨 포맷 및 마운트
파일 시스템 생성
mkfs.ext4 /dev/myvg/mylv/dev/myvg/mylv 논리 볼륨에 ext4 파일 시스템을 생성하여 데이터 저장이 가능하도록 만듭니다.
마운트 포인트 생성
mkdir /mylv논리 볼륨을 마운트할 디렉토리 /mylv을 생성합니다.
/etc/fstab 설정 (=영구 마운트 설정)
vim /etc/fstab
# 추가해야 할 목록
/dev/myvg/mylv /mylv ext4 defaults 0 0파일시스템 마운트
mount -a마운트 확인
lsblk/dev/myvg/mylv가 /mylv 디렉토리에 올바르게 마운트되었는지 검증해주세요.
논리 볼륨 및 파일 시스템 확장
lvextend -r -L +500M /dev/myvg/mylv-L +500M: 논리 볼륨 크기를 500MiB 추가 확장r: 논리 볼륨 확장 후 파일 시스템 크기도 자동으로 조정
논리 볼륨 새 크기를 확인하여 mylv가 정상적으로 확장되었는지 검증합시다.
lvs되돌리기
잘못 설정했을 경우에 대비한 되돌리기 방법 정리.
wshare 예제를 되돌려 보기.
1. 마운트 해제(umount)
가장 먼저, 사용 중인 장치를 시스템에서 분리
umount /mnt/wshare2. fstab 항목 제거
fstab에 등록된 자동 마운트 항목을 제거해야 합니다.
그렇지 않으면 다음 부팅 시 오류가 발생하겠죠? (삭제된 UUID를 불러오는 과정에서 오류가 발생해 dracut shell로 빠질 수 있음.)
/etc/fstab 파일을 열어서 추가했던 wshare 관련 UUID 줄을 삭제해줍시다.
3. 논리 볼륨 (PV) 삭제
sudo lvremove /dev/wgroup/wshare4. 볼륨 그룹(VG) 삭제
sudo vgremove wgroup5. 물리 볼륨(PV) 삭제
LVM에서 사용했던 실제 디스크(/dev/sdb 등)를 LVM 딱지를 제거하여 일반 디스크로 되돌립니다.
sudo pvremove /dev/sdb이제 이 디스크는 LVM이 아닌, 파티션을 나누거나 다른 용도로 사용할 수 있는 깨끗한 상태가 됩니다.
21. LVM - Resize
해당 실습은 LVM - LVM 생성와 연계되어 진행되기 때문에, 관련 VG(
wgroup), LV(wshare)가 설정되어 있어야 합니다.
문제 1: 다음 요구사항에 맞춰 LV의 사이즈를 조정하세요.
- 논리 볼륨
wshare의 파일 시스템 크기를230MiB로 조정하세요. - 파일 시스템의 내용은 그대로 유지되어야 합니다.
- 참고로, 파티션 크기가 요청된 크기와 정확히 일치하지 않는 경우가 많으므로, 213MiB에서 243MiB 범위의 크기는 허용됩니다.
크기를 줄이는 작업은 늘리는 작업보다 훨씬 위험합니다! 데이터 보존을 위해 정확한 순서를 지키는 것이 중요하죠.
- 파일 시스템 마운트 해제 (
umount) - 파일 시스템 무결성 검사 (
e2fsck) - 파일 시스템 크기 축소 (
resize2fs) - 논리 볼륨(LV) 크기 축소 (
lvreduce) - (선택) 파일 시스템을 LV 크기에 맞게 다시 확장
- 파일 시스템 재마운트 (
mount) 및 확인
1. 데이터가 살아있는지 테스트
# 테스트용 파일 생성
touch /mnt/wshare/my_test_file.txt
ls -l /mnt/wshare2. 파일 시스템 마운트 해제
작업하려는 볼륨을 반드시 마운트 해제합니다.
umount /mnt/wshare3. 파일 시스템 무결성 검사
크기 조정 전에 e2fsck로 파일 시스템이 깨끗한지 검사합니다.
sudo e2fsck -f /dev/wgroup/wshare4. 파일 시스템 크기 축소
여기서 중요한 점은, LV를 줄이려는 230MiB보다 조금 더 작게 파일 시스템을 줄이는 것이 안전합니다.
sudo resize2fs /dev/wgroup/wshare 220M 5. 논리 볼륨(LV) 크기 축소
논리 볼륨의 크기를 문제에서 요구한 230MiB로 축소합니다.
sudo lvreduce -L 230M /dev/wgroup/wshareWARNING: Reducing active logical volume wshare...와 같은 경고 메시지가 나옵니다.Do you really want to reduce wshare? [y/n]:라고 물으면 y를 입력하고 엔터를 칩니다.
이 작업이 성공하면 논리 볼륨은 정확히 230MiB가 되고, 그 안의 파일 시스템은 220MiB인 상태가 됩니다.
6. 파일 시스템을 LV 크기에 맞게 확장
이제 220MiB로 줄어든 파일 시스템을, 230MiB가 된 LV의 최대 크기까지 다시 확장시켜 공간 낭비 없이 사용하도록 합니다.
# 크기를 지정하지 않고 resize2fs를 실행하면 LV의 최대 크기까지 확장됩니다.
sudo resize2fs /dev/wgroup/wshare7. 재마운트 및 최종 확인
다시 마운트하고 데이터를 확인합니다.
# 1. 다시 마운트
sudo mount /dev/wgroup/wshare /mnt/wshare
# 2. 크기 확인
df -hT /mnt/wshare
# 3. 데이터 보존 확인
ls -l /mnt/wshare/my_test_file.txt파일이 그대로 보여야 데이터를 소실하지 않고 LVM 크기 조정을 성공적으로 완료한 것입니다!
22. LVM - 확장 (lvextend)
해당 실습은 LVM - LVM 생성와 연계되어 진행되기 때문에, 관련 VG(
wgroup), LV(wshare)가 설정되어 있어야 합니다.
문제 1: 다음 요구사항에 맞춰서 LV 크기를 확장하세요.
- 논리 볼륨
wgroup의 파일 시스템 크기를 500MB로 확장하세요. - 파일 시스템의 내용은 그대로 유지되어야 합니다.
ext4 파일 시스템은 마운트된 상태에서 확장(Online resizing) 을 지원합니다!
즉, 서비스를 중단(umount)할 필요가 없죠.
축소할 때와 정확히 반대 순서로 진행하면 됩니다.
- 축소 순서: 1. 파일 시스템 축소 (resize2fs) -> 2. LV 축소 (lvreduce)
- 확장 순서: 1. LV 확장 (lvextend) -> 2. 파일 시스템 확장 (resize2fs)
1. LV 상태 확인
# 이전에 생성된 wshare LV가 생성되어 있어야 합니다.
lvdisplay2. wshare LV 확장
wshare LV의 사이즈를 500MB로 확장해봅시다.
lvextend -r -L +500M /dev/wgroup/wshare만약 + 옵션을 쓴다면: 현재 230MiB이므로, sudo lvextend -L +270M /dev/wgroup/wshare (약 270MB 추가)와 같이 계산해서 사용할 수도 있습니다. -L 500M이 더 직관적입니다.
3. 파일 시스템 확장
늘어난 사이즈를 모두 사용할 수 있도록 파일 시스템을 확장시킵니다.
(이 작업은 마운트된 상태로 진행할 수 있어요!)
# resize2fs [장치명]
# 크기를 지정하지 않으면 LV가 허용하는 최대 크기까지 확장됩니다.
sudo resize2fs /dev/wgroup/wshareresize2fs가 "files system is mounted"라고 알려주면서 온라인으로 크기를 조정하는 것을 볼 수 있습니다.
4. 최종 확인
df 명령어로 크기와 데이터 보존 여부를 확인하세요.
# 1. 크기 확인
df -hT /mnt/wshare
# 2. 데이터 보존 확인
ls -l /mnt/wshare23. Swap 파티션 생성
문제 1: 400MB 크기의 스왑(swap) 파티션을 생성하고, 영구적으로(재부팅 이후에도) 사용 가능하도록 만드세요.
이 문제의 경우에는 앞선 문제에서 생성했던 wgroup VG에 스왑 파티션을 생성하는 방법과
LVM이 설정되지 않은 일반 디스크 상태에서의 스왑 파티션 생성 방법으로 나눠서 진행해보겠습니다.
lvm
1. 400MB 논리 볼륨 (LV) 생성
먼저 스왑 영역으로 사용할 400MB 크기의 논리 볼륨을 생성합니다.
sudo lvcreate -L 400M -n wshare_swap wgroup2. 논리 볼륨을 스왑(Swap)으로 포맷
생성된 논리 볼륨(wshare_swap)을 스왑 파일 시스템으로 포맷합시다.
mkswap /dev/wgroup/wshare_swap3. 스왑 활성화 (임시)
포맷된 스왑 영역을 시스템이 즉시 사용하도록 활성화.
sudo swapon /dev/wgroup/wshare_swap4. Swap 확인
swapon --show 또는 free -m 명령어로 스왑이 성공적으로 추가되었는지 확인
swapon --show
# 출력 예시
NAME TYPE SIZE USED PRIO
/dev/wgroup/my_swap partition 400M 0B -25. 영구 등록 (fstab)
# 1. UUID 확인 blkid 명령어로 방금 생성한 스왑 볼륨의 고유 UUID 확인
sudo blkid /dev/wgroup/wshare_swap
# 2. /etc/fstab 파일 수정
# [Device (UUID)] [Mount Point] [File System] [Options] [Dump] [Pass]
UUID="<위에서-복사한-UUID>" swap swap defaults 0 0
# 3. fstab 설정 테스트
sudo swapoff /dev/wgroup/my_swap # 테스트를 위해 잠시 스왑 비활성화
sudo swapon -a # fstab 설정으로 다시 활성화 시도no lvm
원활한 테스트 진행을 위해 되돌리기를 참고하여 LVM을 전부 밀어버리고 시작해주세요.
1. 파티션 생성 및 타입 변경
fdisk를 사용해 /dev/sdb 디스크에 새로운 파티션을 생성합니다.
fdisk /dev/sdb2. 커널에 변경사항 적용
파티션 테이블이 변경되었음을 커널에 알립시다.
sudo partprobe /dev/sdb이제 lsblk로 보면 /dev/sdb1이 생성된 것을 볼 수 있을겁니다.
3. 스왑 활성화 (임시)
포맷된 스왑 영역을 시스템이 즉시 사용하도록 활성화.
sudo mkswap /dev/sdb1
sudo swapon /dev/sdb14. Swap 확인
swapon --show 또는 free -m 명령어로 스왑이 성공적으로 추가되었는지 확인
swapon --show5. 영구 등록 (fstab)
# 1. UUID 확인 blkid 명령어로 방금 생성한 스왑 볼륨의 고유 UUID 확인
sudo blkid /dev/sdb1
# 2. /etc/fstab 파일 수정
# [Device (UUID)] [Mount Point] [File System] [Options] [Dump] [Pass]
UUID="<위에서-복사한-UUID>" swap swap defaults 0 0
# 3. fstab 설정 테스트
sudo swapoff /dev/sdb1 # 테스트를 위해 잠시 스왑 비활성화
sudo swapon -a # fstab 설정으로 다시 활성화 시도