LVM
- 디스크의 용량이 부족할 때 여러 개의 디스크를 하나의 디스크처럼 사용
- 독립적으로 구성된 디스크 파티션을 하나로 연결하여 한 파티션처럼 사용할 수 있도록 해줌
- 물리적인 한계를 극복해줌

PV (물리 볼륨) : /dev/sdb1처럼 실제 하드디스크의 파티션
VG (볼륨 그룹) : 여러개의 PV를 그룹으로 묶은 것
LV (논리 볼륨) : VG를 다시 적절한 크기의 파티션으로 나눈 것

LVM 명령어
파티션 생성 및 id전환
- fdisk /dev/sdb
- n입력후 원하는 파티션 디스크 생성
- t입력후 hex code에 8e입력해서 LVM으로 id전환
물리볼륨 생성
- pvcreate 장치명
- ex) pvcreate sdb1
- pv 상태확인 : pvscan
볼륨 그룹 생성
- vgcreate vg명 pv명...
- -s pe사이즈 : 블록 사이즈 지정
- ex) vgcreate vg0 /dev/sdb2 /dev/sdb4 -s 8M
- vg 정보 확인 : vgdisplay -v , vgscan
논리볼륨 생성
- lvcreate vg명 -n lv명 -L 실제크기 or -l pe갯수
- ex) lvcreate vg0 -n lv01 -L 2G
- ex) lvcreate vg0 -n lv02 -l 512
- ex) lvcreate vg0 -l 100%FREE -n lv03 : 남은 vg용량 다 사용해서 LV생성
- lv 정보 확인 : lvscan
LV에 파일시스템 포맷
- mkfs -t xfs /dev/vg0/lv01
- mkfs -t ext4 /dev/vg0/lv02
LV 마운트
- mkdir -p /mnt/disk1 (디렉터리 계층구조안에 디렉터리 생성)
- mount /dev/vg0/lv01 /mnt/disk1
- mount /dev/mapper/vg0-lv02 /mnt/disk2
-> /dev/mapper경로에 볼륨그룹에 해당하는 논리 볼륨 존재
물리볼륨 삭제 , 볼륨그룹 삭제 , 논리볼륨 삭제
- pvremove pv명 , vgremove vg명 , lvremove lv경로
📌 PE : PV를 쪼개는 최소단위 (default 4M)
LVM 확장/축소
- 볼륨그룹 확장
- vgextend vg명 pv명 ...
- ex) vgextend myvg /dev/sdb3
- 볼륨그룹 축소
- vgreduce vg명 pv명 ...
- ex) vgreduce myvg /dev/sdb4
-> sdb4안에 내용물이 있다면(사용중) pvmove로 내용물 다른데로 이동후 제거
- 물리볼륨 내용 이동
- pvmove pv명 ...
- ex) pvmove /dev/sdb4
-> sdb4의 용량만큼 다른sd에 여유공간이 없다면 안 옮겨짐 -> vgextend로 다른 sd를 추가해서 확장시킨 후 옮김
- 논리볼륨 확장
- lvextend lv경로
- lvextend lv경로 -r : 파일시스템 확장도 됨
- ex) lvextend -L 5G /dev/myvg/lv01
- ex) lvextend -L +2G /dev/myvg/lv02
- 논리 볼륨 축소
- xfs 파일 시스템 확장
- xfs_growfs 마운트포인트
- ex) xfs_growfs /mnt/disk1
-> mount포인트 경로 모르면 mount명령어 입력해서 확인
- ext4 파일시스템 확장
리눅스 시스템의 부팅 과정

바이오스 단계

- 전원을 키면 ROM에 있는 메인보드 펌웨어를 읽는다
📌 메인보드 펌웨어 : 각종 컴퓨터 설정
- 바이오스는 PC에 장착된 기본적인 하드웨어(키보드, 디스크 등)의 상태를 확인한 후 부팅장치 선택하여 부팅 디스크의 첫 섹터에서 512바이트를 로딩
🖌 첫 섹터 512바이트 = MBR
- 2차 부팅 프로그램 (부트로더)의 위치 저장
부트로더 단계
- MBR은 부트 로더를 찾아 메모리에 로딩
- 부트 로더 : 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴 제공
- 리눅스 커널을 메모리에 로딩
- 리눅스 커널은 /boot 디렉터리 아래에 'vmlinuz - 버전명' 의 형태로 제공
커널 초기화 단계
- 커널은 가장 먼저 시스템에 연결된 메모리, 디스크, 키보드 , 마우스 등 장치들을 검사
- 기본적인 커널 초기화 단계가 끝나면 커널은 fork를 사용하지 않고 생성되는 프로세스와 스레드 생성
📒 fork : fork명령을 통해 부모가 자식 프로세스를 만듬
-> 쉘에서 fork로 자식 프로세스 생성
systemd 서비스 단계
- systemd 서비스 단계에 이르면 리눅스가 본격적으로 동작하기 시작
- systemd 서비스는 기존의 init스크립트를 대체한 것으로 다양한 서비스를 동작시킴
📒 systemd(1번 프로세스) : 모든 프로세스의 조상 역할 (pstree로 확인 가능) = 시스템과 서비스 관리자
💡 dmesg : 현재 컴퓨터의 부팅 정보 볼 수 있다.
systemd 서비스
1번 프로세스
- 전통적으로 유닉스에서는 init프로세스가 처음 생성된 프로세스로서 PID가 1번
- 리눅스는 페도라 14부터 init 대신에 systemd 사용
init 프로세스와 런레벨
- init프로세스에서 사용하던 런레벨의 개념에 대한 이해 필요
- init는 시스템의 단계를 일곱 개로 정의하여 구분하고 각 단계에 따라 셸 스크립트를 실행하는데 , 이 단계를 런레벨이라고 함

systemd 기본 개념

systemd와 런레벨

- runlevel : 런레벨 확인
- who -r : 런레벨 확인
- systemctl get-default : 현재 default target 확인
📗 현재 런레벨이라는 개념은 target으로 바뀌었다.
- systemctl set-default multi-user.target : 현재 default target 바꾼다
📒 default target : 부팅될때 시작되는 target
- 재부팅 없이도 바로 target바꾸기 : systemctl isolate target명
📕 multi-user.target으로 바꾸면 부팅될 때 CLI환경으로 접속
📕 graphical.target으로 바꾸면 부팅될 때 GUI환경으로 접속
systemd 유닛

- systemd는 전체 시스템을 시작하고 관리하는 데 유닛(units)이라 부르는 구성 요소를 사용
- systemd는 관리 대상의 이름을 '서비스 이름.유닛 종류'의 형태로 관리
-> 서비스, 마운트 , 디바이스 등을 유닛으로 만들어 자식으로 관리
📘 /usr/lib/systemd/system 디렉터리에 가면 유닛과 런레벨 파일들을 확인해 볼 수 있다
systemctl
- systemd를 기반으로 유닛을 시작하거나 관리하는 명령어
- 서비스 유닛을 관리할때 많이 씀 (종종 target유닛)
- 형식 : systemctl [옵션][명령] [유닛명]

- systemctl -a : 설치되어있는 유닛목록 보여줌
(종료된 유닛도 보여줌)
사용 예시
-
yum install -y httpd 설치후
find / -name httpd.service로 디렉터리가 생성된거 확인
-
상태보기 : systemctl status httpd , systemctl status httpd -l
-
서비스 시작 : systemctl start httpd
-
서비스 중지 : systemctl stop httpd
-> systemctl stop sshd하면 연결 끊김
-
방화벽 잠시 해제 : firewall-cmd --add-service=http
-
ifconfig로 ip확인후 호스트pc 웹에 주소 입력하면 test창이 뜸
-
systemctl enable httpd - 심벌릭 링크 생성
-
systemctl restart httpd - 프로세스 종료되고 새로 시작
(PID값 바뀜)
-> 설정 값 바꿨을때 사용
-
systemctl reload httpd - 프로세스를 끄지않고 재시작
(PID값 안바뀜)
shutdown
- 리눅스 시스템을 가장 정상적으로 종료하는 방법
- 형식 : shutdown [옵션][시간] [메시지]

- ex) shutdown -h now : 지금 종료
- ex) shutdown -r +3 "System is going down"
-> 메시지 보내면서 3분뒤에 재시작