록키 리눅스에서 기본적으로 제공하는 셸은 bash(배시 셸) 이다. 

프로그래밍 언어를 배웠다면 크게 비슷하기 때문에 간략하게 정리만 하고 넘어간다.

 

셸의 명령문 처리방법

(프롬프트) 명령어 [옵션...] [인자...]

ls -l
rm -rf /mydir
find . / -name "*.conf*

사용 예시이다.

find . / -name "*.conf*

환경변수

echo $환경변수

 

주요 환경 변수는 다음과 같다

HOME : 현재 사용자의 홈 디렉토리

LANG : 기본 지원되는 언어

TERM : 로그인 터미널 타임

USER : 현재 사용자의 이름

COLUMNS : 현재 터미널의 컬럼 수

PS1 : 1차 명령 프롬프트 변수

BASH : bash 셸의 경로

HISTFILE : 히스토리 파일의 경로

HOSTNAME : 호스트의 이름

LONNAME : 로그인 이름

MAIL : 메일을 보관하는 경로

PATH : 실행 파일을 찾는 디렉토리 경로

PWD : 사용자의 현재 작업 디렉토리

SHELL : 로그인해서 사용하는 셸

DISPLAY : X 디스플레이 이름

LINES : 현재 터미널 라인 수

PS2 : 2차 명령 프롬프트(대개는 '>')

BASH_VERSION : bash번전

HISTSIZE : 히스토리 파일에 저장되는 개수

USERNAME : 현재 사용자 이름

LS_COLORS : ls 명령어의 확장자 색상 옵션

OSTYPE : 운영체제 타입

 

export 환경변수=값 형식으로 환경 변수 값을 변경한다.

그외 환경변수는 printenv

 

셸 스크립트 프로그래밍 실습

nano name.sh

나노 편집기 실행

name.sh

#!/bin/sh
echo "사용자 이름 :" $USER
echo "홈 디렉터리: " $HOME
exit 0

 

1행. 특별한 형태의 주석 #!으로 bash를 사용하겠다는 의미이다. 반드시 필요하다.

2행~3행 : echo는 화면에 출력하는 명령이다.

4행 : 종료 코드를 반환한다. 제대로 실행됐는지 확인하려면 적절한 종료 코드를 반환하는것이 좋다. 0은 성공을 의미한다.

 

sh 명령으로 실행

sh name.sh

 

'실행 가능' 속성으로 변경 후 실행

ls -l *.sh

권한을 확인하면 -rw-r-이다.

chmod +x name.sh

실행 권한을 추가하면

-rwxr- 로 변경된다.

./name.sh

실행이 가능해진다.

 

root 권한으로 설정했기 때문에 root 사용자만 사용할수 있다. 다른 사용자가 사용하게끔 하려면 /usr/local/bin/ 디렉터리에 복사하고 권한을 755로 변경해야 한다.

 

변수

변수는 필요한 값을 계속 변경해 저장할 때 사용한다.

변수의 모든 값은 문자열로 취급한다. 숫자를 넣어도 문자로 취급한다.

대소문자를 구분한다.

'=' 앞뒤에는 공백이 없어야 한다.

 

var1.sh 파일을 하나 생성해서 테스트 해본다. 

#!/bin/sh

myvar="Hi Devport"

echo $myvar

echo "$myvar"

echo '$myvar'

echo \$myvar

echo 값 입력 :

read myvar

echo '$myvar' = $myvar

exit 0

 

1.  $변수와 '$변수'는 같다 변수에 입력된 값에 공백이 포함될수 있다면 '$변수'를 사용하는 것이 오류방지에 도움이 된다.

2. '$변수'는 $를 포함한 변수라는 글자자체가 출력된다.

3. \ 역시 '$변수'와 같다.

4. read 는 키보드로 문자열을 입력한다.

 

숫자계산

numcalc.sh 파일을 생성한다.

#!/bin/sh

num1=100

num2=$num1+200

echo $num2

num3=$(expr $num1 + 200)

echo $num3

num4=$(expr \( $num1 + 200 \) / 10 \* 2)

echo $num4

exit 0

num2 는 단순히 100+200 문자열을 출력한다.

num3 은 계산하여 300을 출력한다.

num4에 \(, \),\*와 같이 괄호와 *(곱하기) 앞에는 예외적으로 \(역슬래시)를 붙여야 된다.

 

파라미터 변수

파라미터 변수는 $0, $1, $2 등의 형태를 갖는다.

paravar.sh 파일을 생성한다.

#!/bin/sh

echo "실행 파일 이름은 <$0>이다"

echo "첫번째 파라메터는 <$1>이고, 두번째 파라미터는 <$2>이다."

echo "전체 파라미터는 <$*>이다.

exit 0

sh paravar.sh 값1 값2 값3

과 같이 파라미터를 값을 지정해서 sh실행때 넣어줄 수 잇다.

 

if문과 case문

#!/bin/sh
if [ "devport" = "devport" ]
then
	echo "참입니다"
fi
exit 0
'[', ']'사이에 공백에 주의한다.

if~else문

#!/bin/sh
if [ "devport" = "dev" ]
then
	echo "참입니다"
else
	echo "거짓입니다"
fi
exit 0

조건문의 들어가는 비교 연산자

 

그 외

-n "문자열" 문자열이 null 이 아니면 참

-z "문자열" 문자열이 null이면 참

 

case-esac 문

 

실행할 구문이 더 없으면 뒤에 ;;를 붙인다.

 

AND,OR 연산자

and는 -a 또는 &&

or -o 또는 ||

 

반복문

for ~ in문

while 문

until 문

조건이 거짓이면 반복하고 참이면 중단한다.

 

break, continue,exit,return

break 반복문 종료

continue는 뒤 구문을 skip하고 while 조건식으로 돌아감

exit 해당 프로그램을 완전 종료

return 함수 안에 사용되며 함수를 호출한 곳으로 돌아가게 한다.

한명의 사용자가 시스템 대부분의 용량을 사용해버리면 시스템 전체에 문제가 생길수 있기 때문에 사용자나 그룹이 생성할 수 있는 파일의 용량과 개수를 제한 할 필요가 있다.

 

가상머신에 하드디스크를 추가한다. 크기는 10GB, 이름은 userDisk.vmdk 해둔다.

 

루트 사용자로 접속한 후 터미널을 연다.

 

fdisk /dev/sdb

Command : n ( 새로운 파티션 분할)

Select : p (Primary 파티션 선택)

Partition number : 1 (파티션 번호 1~4중 1번 지정)

First sector : Enter (1개의 파티션이므로 디폴트로)

Last sector : Enter(디폴트값)

Command : p(설정된 내용 확인)

Command : w(설정 저장)

 

파티션을 생성하고

 

mkfs.ext4 /dev/sdb1
mkdir /userHome
mount /dev/sdb1 /userHome

포맷

유저홈 폴더 생성

파티션 마운트

nano /etc/fstab

자동 마운트 내용 추가

useradd -d /userHome/johndoe johndoe
useradd -d /userHome/janedoe janedoe
passwd johndoe
passwd janedo

유저를 생성한다. 같은 이름으로 홈폴더를 생성한다.

유저의 비번을 지정한다.

nano /etc/fstab

defaults 뒤에 내용을 추가한다.

/dev/sda1              /userHome               ext4     defaults,usrjquota=aquota.user,jqfmt=vfsv0        0 0
글자가 틀리지 않도록 주의한다

 

mount --options remount /userHome
mount

재부팅 효과를 내기 위한 명령

mount로 출력되는 내용을 보면 sda1 디렉터리가 쿼터 용으로 마운트 되었음을 확인할수 있다.

 

쿼터 DB 생성하기

cd /userHome
quotaoff -avug
quotacheck -augmn
rm -rf aquota.*
quotacheck -augmn
touch aquota.user aquota.group
chmod 600 aquota.*
quotacheck -augmn
quotaon -avug

 

디렉토리 이동

쿼터 종료 - 경고 메시지는 무시

파일 시스템의 쿼터 관련 사항을 체크

생성한 쿼터 관련 파일을 삭제

다시 파일 시스템의 쿼터 관련 사항을 체크

쿼터 관련 파일을  생성

보안을 위해 소유자(root) 외에는 접근 금지 설정

마지막으로 파일 시스템의 쿼터 관련 사항을 체크

설정한 쿼터를 시작

edquota -u johndoe

사용자별 또는 그룹별 할당량을 편집할수 있다. vi 에디터와 동일한다.

Filesystem : 사용자별 쿼터를 할당하는 파일 시스템을 의미한다.

[blocks], [soft], [hard] : 현재 사용자가 사용하는 블록(kb 단위)과 소프트 사용한도, 하드 사용한도를 의미한다. 0은 한도를 제한하지 않는다는 의미이다. 현재 사용자는 용량제한 없이 /dev/sda1 파일시스템을 사용할수 있다.

[inodes], [soft], [hard]: inode의 개수를 의미한다. 파일의 개수로 생각하면 이해가 쉽다.

 

[soft]~[hard] 사이의 저장공간을 사용자가 사용하는 것을 허용하지만 정해진 기간내에 파일을 제거해서 soft 지정한 저장공간 이하로 맞춰야한다. 

 

su johndoe
quota
exit

해당 유저의 쿼터 사용현황을 확인할수 있다.

repquota /userHome

전체 사용자의 사용현황을 확인 할수 있다.

edquota -t

기본 유예기간인 7일을 변경할수 있다.

edquota -p 기준사용자 대상사용자

이 명령을 통해 기준사용자와 같은 기준으로 동일하게 적용이 가능하다.

quotaoff /userHome

쿼터 사용안함 설정

LVM은 논리 디스크 관리자로 해석된다. 여러개의 디스크를 합쳐서 1개의 파티션으로 구성한 후 다시 필요에 따라서 다시 나눠야 하는 상황에 주로 사용된다.

 

디스크를 2개 준비한다.

기존의 있는 파티션을 제거하고 다시 파티션을 설정하고 싶을때는

fdisk -l

현재 디스크 및 파티션 리스트를 출력한다. 여기서 제거할 파티션을 기억해둔다.

그 다음 위의 쳇GPT의 가이드대로 파티션을 제거한다. 

fdisk /dev/sdb

Command : n ( 새로운 파티션 분할)

Select : p (Primary 파티션 선택)

Partition number : 1 (파티션 번호 1~4중 1번 지정)

First sector : Enter (1개의 파티션이므로 디폴트로)

Last sector : Enter(디폴트값)

Command : t (파일 시스템 유형 선택)

Hex Code : 8e (Linux raid autodetect : 유형 번호. L을 입력하면 전체 유형이 출력된다)

레이드 구축을 위해 별도의 파일 시스템 지정이 필요하다. default 는 83(Linux)이다.

Command : p(설정된 내용 확인)

Command : w(설정 저장)

 

하드디스크 2개에 파티션을 할당한다. Hex Code : 8e로 별도 지정해야한다.

pvcreate /dev/sdb1pvcreate /dev/sdc1

물리 볼륨을 생성한다.

vgcreate myVG /dev/sdb1 /dev/sdc1

2개의 물리 볼륨을 하나로 묶는다.

myVG는 임의 이름이다.

vgdisplay

볼륨이 제대로 생성되었는지 확인한다.

2개가 묶여서 3GB로 표시된다.

lvcreate --size 500M --name myLG1 myVG
lvcreate --size 700M --name myLG2 myVG
lvcreate --extents 100%FREE --name myLG3 myVG
ls - l /dev/myVG

500M, 700M, 나머지 용량으로 3개의 논리 파티션에 용량을 각각 할당했다.

디렉터리 확인

mkfs.ext4 /dev/myVG/myLG1
mkfs.ext4 /dev/myVG/myLG2
mkfs.ext4 /dev/myVG/myLG3

파일 시스템 생성

mkdir /lvm1 /lvm2 /lvm3
mount /dev/myVG/myLG1 /lvm1
mount /dev/myVG/myLG2 /lvm2
mount /dev/myVG/myLG3 /lvm3
df

폴더 3개 생성하고

마운트

여유공간을 확인하면 500M, 700M, 나머지로 생성된것을 확인 할수 있다.

nano /etc/fstab

편집기에서 자동 마운트 내용 추가.

/dev/myVG/myLG1     /lvm1                    ext4    defaults        0 0
/dev/myVG/myLG2     /lvm2                    ext4    defaults        0 0
/dev/myVG/myLG3     /lvm3                    ext4    defaults        0 0

RAID 6은 2개의 패리티를 사용하기 때문에 최소 4개의 디스크가 필요하다. RAID 5의 구현방법이 거의 유사하다.

RAID 1+0은 안정성과 속도 개념이다. 공간 효율은 50%가 된다. 2개씩 먼저 RAID1으로 묶고 2개의 RAID 1장치를 다시 RAID 0으로 묶어야 한다.

 

vmware에 8개의 디스크를 추가한다.

앞에 만들어둔 스냅샷을 이용한다.

 

sdb~sdj까지 fdisk를 이용해서 디스크 파티션을 생성해둔 상태이다.

df

현재 레이드 구성은 없다.

 

RAID 6 구성하기

mdadm --create /dev/md6 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
mdadm --detail /dev/md6

레이드 생성 후

구성 확인

책에서는 초기화 후 디스크를 추가하고 파티션 작업을 하는 과정을 거쳤다.
나는 만들어둔 스냅샷을 이용했는데 /dev/sdb1이 2GB로 할당되어 있어서 레이드를 만들때 경고문이 출력되었다. 그래서 sdb는 제외하고 sdc~sdf까지 4개 디스크를 이용하였다.

mkfs.ext4 /dev/md6
mkdir /raid6
mount /dev/md6 /raid6
df

파티션 포맷

디렉터리 생성

마운트

결과 확인

 

디렉터리가 약 2GB이다. RAID 6는 '디스크 개수 -2' 만큼의 용량을 사용 힐 스 있다.

 

ghij

RAID 1+0 구성하기

mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sdh1 /dev/sdi1

md2, md3 은 임의의 번호이다.

디스크를 2개씩 묶어서 레이드1을 두개 구성한다.

부팅 영역으로 사용할수 없다는 메시지는 'y'무시한다.

mdadm --create /dev/md10 --level=0 --raid-devices=2 /dev/md2 /dev/md3

레이드 1 두개를 다시 레이드 0으로 구성한다.

mkfs.ext4 /dev/md10

파티션을 포맷

mkdir /raid10
mount /dev/md10 /raid10
df

폴더생성

마운트

결과 확인

 

raid 10이 제대로 생성되었다.

nano /etc/fstab

편집기를 열어 부팅시 마운트 되도록 내용을 추가한다.

mdadm --detail --scan

명령으로 나오는 내용을 복사한다.

gedit /etc/mdadm/conf

name=localhost.localdomain:x 를 삭제하고 붙여넣기한다.

 

reboot로 정상적인 부팅이 되는지 확인한다.

RAID의 정의와 개념

RAID(Redundant Array of Independent Disks)는 여러 개의 하드 디스크를 하나로 결합하여 데이터를 보호하고 성능을 향상시키는 기술

 

하드웨어 RAID

하드웨어 제조업체에서 여러 개의 디스크를 연결해 공급하는 장비이다.

소프트웨어 RAID

고가의 하드웨어 RAID의 대안이다. 신뢰성과 속도는 떨어지지만 아주 저렴한 비용으로 조금 더 안전하게 데이터를 저장할수있다.

RAID 레벨

  1. RAID 0: 데이터를 여러 디스크에 분산하여 성능을 향상시키는 것이 주요 목적입니다. 데이터는 여러 디스크에 분산되므로 여러 디스크에서 병렬로 읽고 쓸 수 있습니다. 그러나 RAID 0은 데이터 보호 기능이 없으며 한 디스크의 고장으로 인해 모든 데이터가 손실될 수 있습니다.
  2. RAID 1: 데이터를 여러 디스크에 복제하여 데이터의 안전성을 향상시킵니다. 각 데이터는 동일한 데이터가 복제된 여러 디스크에 저장됩니다. 한 디스크의 고장이 발생하더라도 다른 디스크에 복제된 데이터로부터 데이터를 복구할 수 있습니다.
  3. RAID 5: 데이터를 여러 디스크에 분산하고 패리티 정보를 사용하여 데이터의 안전성을 향상시킵니다. 데이터와 패리티 정보가 여러 디스크에 분산되므로 한 디스크의 고장으로 인해 데이터가 손실되더라도 패리티 정보를 사용하여 데이터를 복구할 수 있습니다.
  4. RAID 6: RAID 5와 유사하지만 두 개의 패리티 정보를 사용하여 데이터의 안전성을 향상시킵니다. 이로써 두 개의 디스크가 동시에 고장나도 데이터를 복구할 수 있습니다.
  5. RAID 10 (RAID 1+0): RAID 1과 RAID 0을 결합한 것으로, 데이터를 미러링하여 안전성을 향상시키고 성능을 향상시키는 것이 주요 목적입니다.

쳇gpt의 설명으로 갈음한다.

 

Linear RAID

2개 이상의 디스크를 1개의 볼륨으로 사용한다. 앞 디스크가 가득차면 다음 디스크를 사용한다.

 

'결함허용을 제공한다'

디스크 중 하나가 고장나더라도 데이터는 손상되지 않는다는 의미

 

RAID 5

디스크 개수 N -1 만큼의 공간을 저장공간으로 활용하고 1은 패리티 정보로 활용한다. HDD가 많아질수록 공간효율성이 좋아진다.

 

RAID 6

2개의 패리티를 사용한다.

 

RAID 만들기 실습 준비

디스크 9개를 추가한다.

2개는 Linear RAID, 2개는 RAID 0, 2개는 RAID 1, 3개는 RAID 5로 구성하는 실습이다.

 

파일 이름은 disk0-1, disk0-2...disk0-10 이다.

SCSI 0:7 장치는 VMware 프로그램에 예약되어 있다.

버스유형은 SCSI

첫번째만 2GB이고, 나머지 8개는 1기1GB이다.

적용

SCSI 로 9개 생성하였다.

ls -l /dev/sd*

현재 2개만 마운트된 상태이다.

책과 달리 새로 만든 하드디스크가 마운트 되지 않았다.
맥용 VMware은  SCSI 하드디스크 지원문제가 있는듯하다
해결방법을 모르기 때문에 SCSI가 아니라 SATA로 변경해서 진행한다.

sdb~sdj까지 9개의 장치가 출력된다.

fdisk /dev/sdb

Command : n ( 새로운 파티션 분할)

Select : p (Primary 파티션 선택)

Partition number : 1 (파티션 번호 1~4중 1번 지정)

First sector : Enter (1개의 파티션이므로 디폴트로)

Last sector : Enter(디폴트값)

Command : t (파일 시스템 유형 선택)

Hex Code : fd (Linux raid autodetect : 유형 번호. L을 입력하면 전체 유형이 출력된다)

레이드 구축을 위해 별도의 파일 시스템 지정이 필요하다. default 는 83(Linux)이다.

Command : p(설정된 내용 확인)

Command : w(설정 저장)

 

sdb~sdj까지 반복한다.

ls /dev/sd*

파티션을 확인한다.

 

VMware를 종료하고 스냅샷을 만들어둔다.

Linerar RAID 구축 실습

fdisk -l /dev/sdb;fdisk -l /dev/sdc

명령으로 파티션을 확인한다.

mdadm --create /dev/md9 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm --detail --scan

RAID 생성과 RAID 확인

 

mdadm은 Rocky linux에서 RAID 장치를 생성/관리하는 명령이다.

/dev/md9는 사용자가 지정한 이름이다.

--level=linear  Linear RAID로 지정, 0,1 등으로 지정이 가능하다

--raid-devices=2 /dev/sdb1 /dev/sdc1 디스크 2개를 사용한다. 사용할 디스크 이름 지정.

mkfs.ext4 /dev/md9

포맷

mkdir /raidLinear
mount /dev/md9 /raidLinear

디렉터리 생성

마운트

nano /etc/fstab

편집기를 열어 자동 마운트 설정을한다.

/dev/md9     /raidLinear                    ext4    defaults        0 0

마지막줄에 코드 추가.

mdadm --detail /dev/md9

레이드가 제대로 구축되었는지 확인한다. 2개의 장치가 묶여 3GB가 되었다.

 

RAID 0 구축

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1
mdadm --detail --scan

sdd1과 sde1을 레이드0으로 생성

명령 결과 확인

mkfs.ext4 /dev/md0
mkdir /raid0
mount /dev/md0 /raid0
df

포맷

레이드0 폴더생성

마운트

성공 확인

 

용량이 1+1GB로 약 2GB로 표시된다.

자동마운트 추가

nano /etc/fstab

편집기에 아래 내용 추가.

/dev/md0     /raid0                    ext4    defaults        0 0

 

RAID 1 구축

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdf1 /dev/sdg1
mdadm --detail --scan

레이드 생성.

부팅장치로 사용할수 없다는 경고 메시지가 나온다. 'y' 로 무시하고 진행

레이드 정보 확인

mkfs.ext4 /dev/md1

포멧

mkdir /raid1
mount /dev/md1 /raid1

디렉토리 생성

생성한 디렉토리로 마운트

df

확인해보면 레이드0과 달리 용량이 1GB이다. 동일한 데이터를 미러링하기 때문에 50%밖에 쓸수 없다.

nano /etc/fstab

편집기에 아래 내용 추가.

/dev/md1     /raid1                    ext4    defaults        0 0

RAID 5구축

모든 과정이 비슷하지만 디스크 개수가 최소 3개라는 점에서 차이가 있다.

mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdh1 /dev/sdi1 /dev/sdj1
mdadm --detail --scan

레이드 생성.

경고 메시지가 나오더라도 무시한다.

레이드 정보 확인

mkfs.ext4 /dev/md5

포멧

mkdir /raid5
mount /dev/md5 /raid5

디렉토리 생성

생성한 디렉토리로 마운트

df

생성결과 확인

nano /etc/fstab

편집기에 아래 내용 추가.

/dev/md5     /raid5                    ext4    defaults        0 0

추가

mdadm --detail /dev/md5

레이드 구축 확인

 

RAID 구축 후 mdadm.conf 파일 설정

재부팅하기 전에 몇가지 설정을 한다.

mdadm --detail --scan

실행으로 출력 내용을 복사한다.

gedit /etc/mdadm.conf

파일 열어서

name=localhost.localdomain:x

부분을 모두 삭제한다.

reboot

root 로그인 후

 

df

레이드 장치가 제대로 설정되었는지 확인한다.

lineear, 0, 1, 5 RAID가 보인다.

 

스냅샷으로 저장해둔다.

레이드 문제 발생시 조치

cp ~/다운로드/testfile.rpm /raidLinear/testFile.rpm
cp ~/다운로드/testfile.rpm /raid0/testFile.rpm
cp ~/다운로드/testfile.rpm /raid1/testFile.rpm
cp ~/다운로드/testfile.rpm /raid5/testFile.rpm

다운로드의 임의의 파일을 각레이드에 복사하였다.

 

가상머신 종료 후

디스크 SCSI 0:2, SCSI 0:4, SCSI 0:6, SCSI 0:9를 제거하여 에러 상황을 만든다.

RAID로 구성된 디스크가 고장 났기 때문에 응급모드로 접속된다.

비밀번호를 입력한다.

ls -l /dev/sd*

장치 이름을 확인한다. 5개만 남아있다.

df

확인하면 결함을 허용하는 /raid1, /raid5 만 보인다.

ls -l /raid1 /raid5

저장했던 파일을 확인하면 출력된다.

 

mdadm --detail /dev/md1

RAID1 장치를 살펴보면 2개 장치 중에 하나만 작동한다.

mdadm --detail /dev/md5

RAID5 장치를 살펴보면 3개 장치 중에 하나가 제거 되었다고 나온다.

mdadm --run /dev/md9
mdadm --run /dev/md0

장치를 다시 가동하면 오류가 발생한다.

 

우선 시스템이 작동할수 있도록 문제가 되는 장치를 작동 중지하고 /etc/fstab 에서 제거한다.

 

mdadm --stop /dev/md9
mdadm --stop /dev/md0

장치 가동을 중단.

md0, md9 부분을 주석처리한다.

reboot

df

다시 확인해보면 /raid1, /raid5 만 작동하고 있다.

 

고장난 디스크를 새로운 디스크로 교체

빠진 하드를 추가한다. SCSI 또는 SATA 등 전부 일치시킨다.

가상머신을 부팅하고 root 로 로그인한다.

 

mdadm --detail /dev/md1

확인을 해보면 자동으로 복구되지 않았다. /dev/sdd 에서 /dev/sdf 로 변경된점을 확인할수 있다.

ls -l /dev/sd*

추가한 디스크를 확인한다.

/dev/sdc 처럼  /dev/sdb1 이 없는 것이 개로 장착된 4개의 디스크이다.

fdisk /dev/sdc

Command : n ( 새로운 파티션 분할)

Select : p (Primary 파티션 선택)

Partition number : 1 (파티션 번호 1~4중 1번 지정)

First sector : Enter (1개의 파티션이므로 디폴트로)

Last sector : Enter(디폴트값)

Command : t (파일 시스템 유형 선택)

Hex Code : fd (Linux raid autodetect : 유형 번호. L을 입력하면 전체 유형이 출력된다)

레이드 구축을 위해 별도의 파일 시스템 지정이 필요하다. default 는 83(Linux)이다.

Command : p(설정된 내용 확인)

Command : w(설정 저장)

 

4개 모두 새로운 디스크에 파일 시스템을 만든다.

 

결함을 허용하지 않는 레이드 복구하기

모두 출력된다.

mdadm --stop /dev/md9
mdadm --create /dev/md9 --level=linear --raid-devices=2 /dev/sdb1 /dev/sdc1

확인 메시지가 나오면 'y '

mdadm --stop /dev/md0
mdadm --create /dev/md- --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1

확인 메시지가 나오면 'y '

mdadm --datail /dev/md9
mdadm --datail /dev/md0

명령으로 장치가 잘 작동하는지 확인한다.

 

레이드 2개는 복구 되었다.

 

결함을 허용하는 RAID 1, 5를 재구성하기

mdadm /dev/md1 --add /dev/sdg1
mdadm /dev/md5 --add /dev/sdi1

새로운 디스크를 추가하는 명령으로 재구성된다.

mdadm --detail /dev/md1
mdadm --detail /dev/md5

장치들이 정상작동하는지 확인한다.

spare rebuildeing 상태이더라도 잠시 기다리면 active sync로 변경된다.

vmwar에서는 SATA 슬롯을 4개 지원하고 30개의 sata 장치를 장착 할 수있다.

총 120개까지 장착이 가능하다.

 

SATA 0:1 에는 기본적으로 CD/DVD장치를 장착하기 때문에 다른 장치는 나머지 119개에 설치가 가능하다.

(변경은 언제든지 가능하다)

 

SCSI 하드가 추가되면 리눅스에서 파티션이 /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd 형식이고

 

/dev/sda를 논리적으로 파티션이 나눠지면 /dev/sda1, /dev/sda2, /dev/sda3으로 나타난다.

 

리눅스에서 추가로 저장장치를 설치하려면 다음과 같은 과정을 거친다.

vmware에서 상에서 물리적인 디스크를 추가하는 과정이다.

용량은 1gb 로 잡는다.

nvme를 선택할수도 있지만 책과 동일하게 sata를 선택한다.

파일 이름은 scsi0-1.vmdk 으로 변경한다. 책과 동일하게

적용클릭

 

하드디스크가 sata로 하나더 생겼다

 

server 가상머신을 부팅하고 root 사용자로 로그인한다.

책의 내용을 따르면 터미널에서

fdisk /dev/sdb

실행이지만

파일이나 디렉터리가 없습니다라는 메시지가 나온다.
lsblk

명령으로 디스크 연결을 살펴보면. 

sda 가 1G로 잡혀 있는것을 확인할수 있다.

fdisk /dev/sda

sda로 수정하여 실행

Command : n ( 새로운 파티션 분할)

Select : p (Primary 파티션 선택)

Partition number : 1 (파티션 번호 1~4중 1번 지정)

First sector : Enter (1개의 파티션이므로 디폴트로)

Last sector : Enter(디폴트값)

Command : p(설정된 내용 확인)

Command : w(설정 저장)

mkfs.ext4 /dev/sda1

포맷과 유사한 과정이다.

ext4는 파일스시스템

/dev/sda1 는 파티션 장치

mkdir /mydata
cp anaconda-ks.cfg /mydata/test1
ls -l /mydata/

디렉토리 생성생성한 디렉토리로 파일 복사(어떤 파일도 상관없다)복사 성공 확인

mount /dev/sda1 /mydata
cp anaconda-ks.cfg /mydata/test2
ls -l /mydata/

생성한 데이터로 저장장치를 마운트

test2 파일로 복사

복사 성공 확인

이전에 복사한 test1 파일이 사라졌다 어디로 간걸까?

umount /dev/sdb1
ls -l /mydata/

장치를 언마운트하고

다시 살펴보면 test1 파일이 남아있다. 

파일이 없어진것이 아니라 장치 안에 보관되어 있다.

 

부팅시 자동으로 지정한 하드디스크 마운트하기

nano /etc/fstab

나노 편집기를 열고

fstab는 리눅스 부팅시 참조하는 파일로 오타가 있으면 부팅이 안될수 있다. 수정에 주의한다.

/dev/sda1 /mydata ext4 defaults 0 0

마지막 줄에 추가한다

reboot

재부팅한다.

ls -l /mydata/

로 이전에 복사한 test2 파일이 남아 있는지 확인한다. 있으면 마운트 성공.

 

리눅스를 윈도우 처럼 GUI로 사용방법을 다룬다.

client 가상머신을 이용해서 실습한다.

Thisis.repo 파일을 편집해야 되는데 권한은 없고 root는 로그인이 안되고 어쩔수 없이 재설치했다. 앞에 client 가상머신의 리눅스는 root 로그인을 막아둔걸 깜빡한 댓가이다.

1. 그놈 데스크톱 환경 설정

바탕화면 변경

주소로 가서

다운로드

설정 - 배경 - 사진추가

다운로드 폴더에서 추가

배경화면 선택

배경화면을 바꾸었다.

테마 변경

su -c 'dnf -y install gnome-tweak-tool'

실행해서 테마 관련 패키지 설치

gnome-tweaks

메시지 대화상자 가 나오면

모양새에서 적당한 테마를 고르고 창을 닫는다.

부트로더에 이미지 추가하기

png 이미지 파일이 필요하다.

 

적당한 이미지 다운로드

png 저장

다운로드 폴더의 파일을

su -c 'mv *.png /boot/grub2'

부트로더 폴더로 이동

 su -c 'nano /etc/default/grub'

파일 에디터 열어서

GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true

#GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=1G-4G:256M,4G-64G:320M,64G-:576M rd.lvm.lv=rl/r> GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

GRUB_BACKGROUND="/boot/grub2/wallpaper.png"

주석처리와 마지막 줄 추가

su -c 'grub2-mkconfig -o /boot/grub2/grub.cfg'

변경한 부트로더 내용 적용

 

이상하게 되지 않아서 시간을 낭비했다.
GRUB_BACKGROUND대신에 GRUB_THEME를 사용하라는 해외유저의 글을 보았다.
실패했다.
GIMP로 png로 변환해서 사용해보라는 글도 봤다.
실해했다.
포기

 

노틸러스 이용하기

윈도우 탐색기 같은 기능이다.

새폴더 만들기

복사

잘라내기

붙여넣기

파일 실행

설정-기본프로그램에서 파일 형식에 맞는 연결 프로그램을 지정해둘수 있다.

ISO 파일 레코딩 

su -c 'dnf -y install brasero'

브라세로 설치

설치가 되지 않았다.

Rocky Linux Repositories - pkgs.org

 

록키 리눅스 공식 repo를 찾아보면 Devel에서 찾을 수 있다.

웹페이지를 참고해서 repo를 devel로 지정하고 brasero를 설치하였다.

repo가 devel을 지정하지 않으면 

오류: 일치하는 항목을 찾을 수 없습니다 : 프로그램명

이라는 오류를 출력한다.

dnf --enablerepo=devel install brasero

드디어 설치되었다.
앞으로 프로그램 설치에 문제가 생기면 같은 방법을 사용해야겠다.

 

프로그램이 무거운지 실행에 시간이 조금 걸렸지만 어쨌든 설치는 성공.

 

파이어폭스 최신버전 설치

rpm -qi firefox

버전 확인

 

파이어 폭스 웹페이지에서 최신버전을 다운 받는다.

 

cd ~/다운로드/
tar xfj fire+tab(자동완성)
su
mv firefox /usr/local
chwn -R root.root /usr/local/firefox/
cd /usr/local/bin
ln -s /isr/local/firefox/firefox .

다운로드 디렉터리로 이동

압축풀기

root 사용자 권한얻기

파이어폭스 관련 파일 모두를 root 사용자 소유로 변경

디렉터리로 이동

현재 디렉터리에 파이폭스 링크를 새로 생성

 

메일 클라이언트: 에볼루션

아웃룩과 비슷한 프로그램

 

FTP 클라이언트: gFTP

나중에 자세히 살펴본다.

 

사운드 설정

윈도우는 사운드카드를 따로 설정하지 않아도 소리가 출력됐었는데

록키 리눅스는 자동으로 잡아주지 않았다(책에서는 드라이브가 자동 설치된것을 전제로 설명한다)

lspci | grep -i audio

로 사운드카드 정보를 확인하니 vmware 로 이미 잡혀있었다.

sudo yum install open-vm-tools-desktop

vnware tools를 설치하려고 했지만 이미 설치된 상태였다.

사운드가 출력되지 않는 원인을 정확히 모르겠다.

동영상 플레이어

토템

VLC

텍스트 편집기

gedit

문서 뷰어: evince

PDF 뷰어 : FOxit Reader

그래픽 편집 :GIMP

그림 뷰어 : eog

스크린샷 : 기본제공

리브레오피스

워드프로세서:writer

스프레드시트:Clac

프레젠테이션 . 툴:impress

 

이런 프로그램을 터미널에서 설치해도 되지만 소프트웨어 센터를 통해서 설치해도 상관없다.

1. 모듈의 개념과 커널 컴파일의 필요성

커널에 담긴 하드웨어 제어 코드 중에서 항상 사용하지 않고 필요할 때만 가끔씩 사용되는 부분을 따로 빼둔것이 모듈이다.

주로 하드웨어의 지원문제 때문에 커널 컴파일 또는 커널 업그레이드를 한다.

 

2. 커널 업그레이드하기

지금 하드웨어에서 잘 작동하면 커널을 업그레이드 할 필요는 없다.

www.kernel.org  접속

6.81 최신버전을 다운받는다. 다운로드 폴더에 저장된다.

cd /root/다운로드

다운로드 폴더로 이동

mv linux-6.8.1.tar.xz /usr/src/
cd /usr/src/
tar cfj linux-6.8.1.tar.xz
cd linux + tab키
pwd
ls

/usr/src/ 파일 이동

/usr/src/ 폴더로 이동

파일 해제

폴더 이동

현재 폴더 확인

파일 리스트 출력

터미널 자동완성 기능을 잘 활용한다.

dnf -y install gcc gcc-c++ make bison flex elfutils-libelf-devel openssl-devel dwarves

컴파일을 위한 관련 패키지를 먼저 설치한다.

dnf -y install qt5*

qt5 관련 패키지도 설치 100개 이상이다.

make mrproper

커널 초기화

실제로 make 패키지가 없어서 실행되지 않았다. make 패키지 설치를 하려고 했는데 aarch64용 애플실리콘용 패키지가 있음에도 계속 x86용 파일을 다운받아서 설치가 되지 않았다.

그래서 따로 make-4.3-7.el9.aarch64.rpm Rocky Linux 9 Download (pkgs.org) 에서 rpm 파일을 파이어폭스로 다운받아서

sudo dnf install /다운로드/make-4.3-7.el9.aarch64.rpm

수동으로 설치해보았다.

make 기능을 써보려해도 

make: *** 타겟이 지정되지 않았고 메이크파일이 없습니다.  멈춤.

메시지만 출력되어서 책 부분을 정리만 하고 실습하지 못하였다.

----- 추가

linux-6.8.1.tar.xz 파일을 압축한 폴더에서 실행하여야 한다.

그래도 문제가 완전히 해결되지 않는다.

gcc 관련 패키지가 설치 되지 않았다는 문제가 생겼다.

패키지를 설치하는데 자꾸 문제가 생긴다. make는 수동으로 설치했지만 나머지 패키지도 수동으로 설치하는 것은 곤란하다.

sudo dnf -y --enablerepo=baseos install gcc gcc-c++ make bison flex elfutils-libelf-devel openssl-devel dwarves

repo가 여러개 되면서 충돌이 발생하는것 같아 baseos로 한정했는데도 제대로 설치가 되지 않았다.

sudo dnf -y --enablerepo=baseos install gcc gcc-c++ make bison flex elfutils-libelf-devel openssl-devel dwarves --skip-broken

--skip-broken 옵션을 추가해도 마찬가지다.

-------------------문제 해결-----------------------

nano /etc/yum.repos.d/This.repo

책은 윈도우 기준이기 때문에 repo 주소가 x86_64 이다. 당연히 애플 실리콘에서는 패키지가 설치가 되지 않고 충돌 메시지만 출력된다.

baseurl 를 aarch64 에 맞게 변경하거나 설치 당시 설정을 그대로 사용한다.

이 조치 이후 충돌없이 설치가 되었다.

---------------------------------------

make xconfig

커널 환경 설정창 활성화

책은 왼쪽에 [Processor type and features] - 오른쪽에 [Processor family] - [자신의 cpu type 선택] 이라고 나오지만

찾아봐도 없다.

영상강의에도 CPU Power Management 위에 있는걸로 나오는데 ARM 관련 있지만 프로세서 타입은 아닌것 같다.

 

왼쪽에 [File systems] - [DOS/FAT/NT Filessystems]를 선택하고 오른쪽의 [NTFS file system support]와 그 하위 항목을 모두 체크한다. 이 설정을 통해 NTFS에 쓰기가 가능해진다. NTFS 로 포맷된 USB 도 사용이 가능해진다.

책이 윈도우 기준이라 애플 실리콘 맥에서 NTFS 를 쓸수 있을지 확신하지 못해서 일단 체크하지 않았다.

 

[File] - [Save]

저장하여 창을 닫는다.

gedit .config

책은  7917~7918 행의 내용을 주석처리한다.

# CONFIG_SYSTEM_TRUSTED_KEYRING=y
# CONFIG_SYSTEM_TRUSTED_KEYS="certs/rocky.pem"

rocky는 달라질수 있겠다.

문제는 ls -a로 모든 파일을 표시했을때 .config 파일이 없다. 그래서 스킵하고 진행해보았다.
make clean
make; make modules_install; make install

이전의 컴파일 정보를 삭제한다.

3가지 명령을 한꺼번에 실행한다.

.config 파일이 없어서 컴파일 되지 않았다.

커널 업그레이드가 뒤에 학습과 연계되는 것은 아니라서 일단 넘어간다.

 

 

 

 

 

 

시스템부팅이 다양한 이유가 되지 않는 상황을 가정하고 할수있는 조치들을 다룬다.

 

1. root 사용자의 비밀번호를 잊어버렸을때

부팅하면 부트로더가 나타난다.

화면에서 e 입력. edit

linux로 시작하는 줄에 마지막에

rhgb quiet를 삭제

init=/bin/sh를 입력

ctrl+x 로 부팅

부팅 중간에 정지되고 'sh5-1#'라는 프롬프트가 나온다.

whoami

현재 로그인 사용자가 root인지 확인한다.

passwd

비밀번호를 변경한다.

오류메시지가 출력된다. 변경되지 않는다.

현재 파티션이 읽기 전용모드로 마운트 되어 있기 때문이다. 

mount

출력에서 마지막 줄에 ro(read only)를 확인 할수 있다. 변경한다.

mount -o remount,rw /

변경 명령

mount

출력에서 마지막 줄이 rw로 변경되었다.

passwd

비밀번호를 변경한다.

리부트 하여 변경한 비밀번호로 로그인 되는지 확인한다.

 

vmware 어플에 강제 재부팅한다.

 

주의해야 할 보안문제

위의 방법을 통하면 누구든지 root의 비번을 변경하고 권한을 획득할수있다. 그렇기 때문에 몇가지 대책이 필요하다.

  • 처음 부팅할때 나오는 GRUB부트로드를 편집할수 없도록 설정
  • 컴퓨터 BIOS에 CMOS 비밀번호를 설정한다.

2. GRUB 부트로더

부트로더는 부팅할때 처음 나오는 선택화면을 말한다.

사용자의 임의로 부트정보를 변경하여 부팅하거나, 여러가지 운영체제로 멀티부팅할수 있다.

 

GRUB2의 설정파일은 /boot/grub2/grub.cfg이다. 일반적으로 읽기전용으로 권한설정되어있다. 설정을 변경하고자 할때는 직접 편집해서는 안되며 /etc/default/grub 파일과 /etc/grub.d 디렉터리의 파일을 수정한 후 grub2-mkconfig 명령을 실행해 적용해야한다.

그 링크 파일은 /etc/grub2.cfg이다.

nano /etc/default/grub

나노 편집기 실행

1행 : 부트로더가 나온후 자동 부팅되는 시간 지정. -1이면 자동부팅되지 않고 사용자 선택할때까지 대기한다.

2행 : /etc/system-release 파일에서 'Rocky Linux'라는 글자를 추출하여 초기 부팅화면에서 노출시킨다.

3행: 기본 선택 엔트리를 설정. 0은 첫번째

4행: 서브 메뉴 사용 여부를 결정한느 설정이다. true는 서브 메뉴를 사용하지 않는다. 특별히 설정할 필요가 없다.

5행: GRUB 부트로더가 출력될 장치를 지정하는 설정이다. console은 모니터로 설정된다.

6행: 부팅시 커널에 전달할 파라미터를 지정하는 설정이다. 응급복구시 사용했었다.

7행: 엔트리 복구 관련 내용 표시 여부를 결정하는 설정이다. true에서 변경할 필요가 없다.

8행: BLSCFG. 변경할 필요가 없다.

 

부팅시 대기시간 변경과 GRUB 비밀번호 설정하기

nano /etc/default/grub

GRUB_TIMEOUT=20

~ 생략 ~

grub2-mkconfig -o /boot/grub2/grub.cfg

실행하여 변경내용을 적용

nano /etc/grub.d/00_header

문서를 열고

cat << EOF
set superusers="thisislinux"

password thisislinux 1234
EOF

devport 는 새로운 GRUB 사용자로 임의의 값이며 1234는 비밀번호로 사용할 임의의 값이다.

끝에 4행을 추가하고 저장한다.

grub2-mkconfig -o /boot/grub2/grub.cfg

변경된 내용을 적용한다.

이제 부트로드에서 편집을 하려할때 비밀번호를 요구한다.

 

이상하게 나는 되지 않았다. 그래서 다른 방법을 찾아보았다.

grub2-setpassword 

패스워드를 생성한다. 패스워드로 사용할 문자를 2회 입력

cat /boot/grub2/user.cfg

boot/grub2/user.cfg 파일이 생성되는데 내용을 확인하면 입력한 암호가 복호화 되어 있다.

grub2-mkconfig -o /boot/grub2/grub.cfg

생성한 암호 적용

reboot

재부팅

이제 부트로더에서 편집을 할려고 하면

사용자명과 암호를 요구한다.

이방법은 단일 사용자 모드로서 유저네임은 root가 된다.

1. 프로세스

하드디스크에 저장된 실행 코드(프로그램)가 메모리에 로딩되어 활성화 된 것'

포그라운드 프로세스

실행하면 화면에 나타나 사용자와 상호작용하는 프로세스. 파이어폭스, 크롬 같은 브라우져 실행화면을 생각하면 된다.

 

백그라운드 프로세스

실행은 됐지만 화면에는 나타나지 않는 프로세스. 바이러스 백신, 서버 데몬(서비스) 등

프로세스 번호

메모리에 로딩되어 활성화된 프로세스를 구분하려면 고유 번호가 필요하다. 이 번호를 통해서 메모리에서 활성화된 특정 프로세르르 찾고 강제로 제거할수 있다.

 

작업번호

현재 실행되는 백그라운드 프로세스의 순차번호를 의미한다.

 

부모프로세스와 자식프로세스

파이어폭스는 x윈도 프로세스가 구동된 상태에서 실행되어야 한다.

x윈도가 종료되면 파이어폭스도 같이 종료된다.

x윈도는 부모프로세스가 되고 파이어폭스는 자식프로세스가 된다.

ps
ps -ef | grep 프로세스이름
kill
kill -9 프로세스번호
pstre

현재 프로세스 상태를 확인하는 명령

프로세스를 강제로 종료하는 명령

부모 프로세와 자신 프로세스의 관계를 트리 형태로 출력

출력 예시

실습

yes > /dev/null

무한 루프를 도는 단순한 프로세스를 하나 생성

아무런 메시지 출력이 안되는 것이 정상이다.

터미널에 새로운 탭을 열고(기존의 탭은 무한 루프 중이다)

ps -ef | grep yes

프로세스 번호 확인

root 프로세스 소유주

4610 프로세스 번호

4623 부모프로세스 번호

kill -9 4610

프로세스 종료 명령

첫번째 터미널 탭으로 가면 죽었음이 출력된다.

 

2. 서비스

시스템과는 무관하게 독립적으로 실행되는 프로세스이다.

웹서버 서비스, DB서버 서비스, FTP 서버 서비스 등을 들수 있다.

systemctl start/stop/restart 서비스이름

명령을 사용해 서비스를 실행하거나 종료한다.

systemctl list-unit-files

명령을 실행하면 현재 설정된 자동 실행 여부를 확인할 수 있다.

static 으로 설정된 서비스는 다른 서비스나 소켓에 의존해서 실행되므로 자동 실행 여부를 설정할 수 없다.

systemctl status 서비스이름

서비스 상태 확인

systemctl enable/disable 서비스이름

서비스 사용/사용안함

 

3. 소켓

서비스와 반대되는 개념으로 필요할 때만 작동하는 서버 프로세를 의미한다.

외부에서 특정 서비스를 요청할 경우 systemd가 소켓을 구동한다. 요청이 끝나면 소켓을 종료한다.

대표적인 예로 텔넷 서버이다.

+ Recent posts