Wisdom’s Cloud

[LINUX] 8. 리눅스 관리자를 위한 명령어 본문

LINUX/Beginner

[LINUX] 8. 리눅스 관리자를 위한 명령어

지혜로운지혜쓰 2021. 1. 29. 18:14
RPM(Redhat Package Manager)
  • 초창기 리눅스의 경우 새로운 프로그램을 설치하기가 꽤 어려운 문제가 있었는데, 이를 개선하여 레드햇 사에서 window의 setup.exe와 같이 프로그램 설치 후 바로 실행하 수 있는 설치 파일을 제작했다. 설치 파일의 확장명은 *.rpm이며 이를 '패키지(Package)'라고 부른다.

  • rpm 파일의 형식은 일반적으로 다음과 같다. 여기서 '릴리즈 번호'는 문제점을 개선할 때마다 붙여지는 번호를 의미하고, '아키텍처'는 이 파일을 설치할 수 있는 CPU를 뜻한다.

패키지이름 - 버전 - 릴리즈번호 . CentOS버전 . 아키텍처 . rpm
  • 예전 리눅스의 프로그램 설치보다는 획기적으로 편리해졌지만, rpm 명령어의 가장 큰 문제점은 '의존성'이다. 예를 들면 CentOS의 기본 웹 브라우저인 Firefox는 당연히 X 윈도 상에서 가동된다. 그런데 X 윈도가 설치되지 않은 상태에서 Firefox를 설치하게 되면 Firefox가 X 윈도에 의존성이 있으므로 설치가 되지 않는다. 그래서 이러한 불편을 해결한 것이 바로 dnf 명령이다.

 

 

자주 사용하는 rpm 명령 옵션
rpm -Uvh 패키지파일이름.rpm 설치
rpm -e 패키지 이름 삭제
rpm -qa 패키지이름 시스템에 패키지가 설치되었는지 확인
rpm -qf 파일의절대경로 이미 설치된 파일이 어느 패키지에 포함된 것인지 확인
rpm -ql 패키지이름 특정 패키지에 어떤 파일들이 포함되었는지 확인
rpm -qi 패키지이름 설치된 패키지의 상세 정보
rpm -qlp 패키지파일이름.rpm 패키지 파일에 어떤 파일들이 포함되었는지 확인
rpm -qip 패키지파일이름.rpm 패키지 파일의 상세 정보

 

 

[실습 1] rpm 패키지를 이용해서 프로그램을 설치해보자.

  step 0 Server를 실행하고 root 사용자로 접속하자.

 

  step 1 DVD에 있는 간단한 rpm 패키지를 설치하자. (DVD가 마운트 되어 있지 않다면 마운트 한다.)

1. 터미널을 연다. 명령어를 편리하게 사용할 수 있는 mc 패키지를 설치할 계획이다. 먼저 이미 설치되어 있는지 확인하고, 해당 rpm 패키지가 있는 디렉터리로 이동한 후 해당 rpm 파일에 기능이 포함되어 있는지 미리 확인한다.
2. mc 패키지를 설치하고, 설치한 패키지의 정보를 확인한다.
3. 터미널에서 "mc" 명령을 입력하면 실행된다. 마우스를 사용해서 파일을 선택할 수 있고, "exit" 명령을 입력하면 종료된다.
4. mc 패키지를 제거한다. 패키지를 제거할 때는 패키지 파일이 필요 없기 때문에 아무 디렉터리에서 제거해도 된다.

 

  step 2 의존성 문제가 있는 rpm 파일을 설치해보자.

1. mysql-errmsg 패키지를 설치한다. 하지만 의존성의 문제로 설치되지 않는다. 따라서 mysql-errmsg 패키지가 설치되려면 관련 있는 다른 패키지를 먼저 설치해야 한다.

* 의존성 문제를 해결하기 위해 메시지에 특정 파일명이나 패키지가 필요하다고 나오기는 했지만,

해당 파일이나 패키지를 설치하는 데 또다시 어떤 패키지가 의존성이 있을 수도 있다.

또한 어떤 rpm 파일이 필요한지 알아내더라도 해당 rpm 파일이 CentOS 8 DVD에 들어 있지 않을 수도 있다.

따라서 이러한 문제를 한 번에 해결하기 위해 CentOS에서는 'dnf'라는 명령을 제공한다.

이 외에도 강제로 패키지를 설치하는 '--force' 옵션과 의존성을 무시하고 설치하는 '--nodeps' 옵션도 사용할 수 있으나,

이러한 옵션은 정상 설치를 보장할 수 없으므로 주의해서 사용해야 한다. *

 

 

DNF(DaNdiFied yum)
  • dnf 명령은 rpm 명령의 패키지 의존성 문제를 완전히 해결해준다.

  • rpm 명령어는 설치하려는 rpm 파일이 DVD에 있거나 인터넷에서 미리 다운로드한 후 설치해야 하지만, DNF는 CentOS 프로젝트가 제공하는 rpm 파일 저장소에서 설치할 rpm 파일은 물론, 해당 파일과 의존성이 있는 다른 rpm 파일까지 인터넷을 통해 모두 알아서 다운로드한 후 자동으로 설치까지 해준다.

  • 그러므로 사용자는 rpm 패키지 설치 시 의존성 문제를 고민하지 않아도 된다. 단, '인터넷을 통해' 다운로드한 후 설치하게 되므로 당연히 인터넷에 정상적으로 연결된 상태여야 한다.

  • 또한 저장소의 URL은 /etc/yum.repos.d/ 디렉터리의 파일에 저장되어 있다.

 

 

DNF의 기본 사용법
dnf -y install 패키지이름 기본 설치 방법
dnf install rpm파일이름.rpm rpm 파일 설치 방법
dnf check-update 업데이트 가능한 목록 보기
dnf update 패키지이름 업데이트
dnf remove 패키지이름 삭제
dnf info 패키지이름 정보 확인

 

 

[실습 2] 의존성 문제가 있는 패키지를 dnf 명령으로 설치하자.

  step 0 Server를 실행하고 root 사용자로 접속하자.

 

  step 1 실습 1에서 설치에 실패한 mysql-errmsg 패키지를 설치하자. (DVD 연결은 끊는다.)

1. 먼저 "dnf info mysql-errmsg" 명령을 입력해 설치할 패키지의 정보를 확인한다.
2. 해당 패키지를 설치하기 위해 "dnf install mysql-errmsg" 명령을 입력한다.

* 여기서 '패키지'는 한글로 '꾸러미'로 해석되었다.

지금 설치할 패키지의 경우, 먼저 의존성 있는 패키지가 2개고 총 3개의 패키지가 설치되어야 한다는 메시지가 나왔다.

또한 총 다운로드 크기와 설치 크기까지 나타낸다. *

 

3. 여기서 설치하겠다는 'y'를 입력하면 관련 패키지를 모두 다운로드한 후 자동으로 설치한다.

* 패키지를 설치할 것이 확실하다면 "dnf -y install mysql-errmsg" 명령을 입력하여

설치가 끝날 때까지 아무것도 묻지 않고 설치를 완료할 수 있다. *

 

 

DNF 고급 사용법
dnf groupinstall "패키지그룹이름" 패키지 그룹 설치
dnf list 패키지이름 패키지 리스트 확인
dnf provides 파일이름 특정 파일이 속한 패키지 이름 확인
dnf install --nogpagcheck rpm파일이름. rpm GPG 키 검사 생략
dnf clean all 기존 저장소 목록 지우기

 

 

[실습 3] DNF의 고급 기능을 실습해보자.

  step 0 초기화한 Server를 실행하고 root 사용자로 접속하자.

 

  step 1 dnf 명령을 실행할 때 필요한 파일을 네트워크가 아닌 DVD에 설치해보자.

1. CentOS 8 DVD ISO 파일을 마운트한다. DVD가 자동 마운트되면 디렉터리 경로가 좀 복잡하므로 간단하게 /media/cdrom 디렉터리에 DVD가 마운트되도록 설정한다.
2. /etc/yum.repos.d/의 This.repo 파일도 backup 디렉터리로 이동시킨다. 그리고 dvd.repo라는 이름의 빈 파일도 생성한다.
3. dvd.repo 파일은 /etc/yum.repos.d/ 디렉터리에 있으므로, 앞으로 dnf 명령을 실행하면 자동으로 이 파일을 확인한다. 이 파일을 "gedit dvd.repo" 명령을 입력해 열고 다음과 같이 채워 넣은 후 저장한다.

[DVD-BaseOS]     → 식별자를 지정한다. 
name=CentOS DVD BaseOS     → 식별자의 이름이다.
baseurl=file:///media/cdrom/BaseOS/    → URL을 네트워크가 아닌 DVD의 BaseOS 위치로 연결한다.
gpgcheck=0     → GPG 인증 체크를 생략한다.

[DVD-AppStream]     → 추가로 식별자를 지정한다.
name=CentOS DVD AppStream
baseurl=file:///media/cdrom/AppStream/
gpgcheck=0

 

4. 우선 네트워크가 안 되는 상황을 만들기 위해 "ifdown ens160" 명령을 입력해 네트워크 장치를 중지시켜 놓는다.
5. 이제 "dnf -y install mariadb" 명령을 입력해 패키지를 설치하면 DVD에서 필요한 파일을 가져다 설치하며, 의존성 문제도 DVD의 rpm 파일을 이용해 해결한다.

* 필요한 패키지를 DVD에서 다운로드하므로 순식간에 설치되었으며,

다운로드한 저장소는 만든 dvd.repo 파일의 식별자인 [dvd]로 되어 있음을 확인할 수 있다. *

 

6. 프로그램의 출력 결과로 간단한 매뉴얼 페이지를 만들 수 있는 help2man 패키지를 설치한다.

* help2man 패키지는 CentOS 8의 PowerTools 저장소에서 제공하지만 DVD에는 들어 있지 않기 때문에

help2man 패키지가 없다고 나온다.

CentOS 8 DVD ISO 파일에는 BaseOS와 AppStream의 패키지 파일이 들어 있지만,

그 외 CentOS 8 패키지가 있는 것은 아니다.

이때 기존의 This.repo를 사용하면 네트워크에서 다운로드하여 설치하므로 이런 문제가 없어지지만,

DVD에 있는 패키지를 설치할 때 누릴 수 있는 빠른 다운로드라는 장점은 없어지므로

step 2에서 이 문제를 해결해보자. *

 

  step 2 dnf 명령 실행 시 CentOS 8 DVD를 우선 사용해서 설치하고, 만약 DVD에 패키지 파일이 없을 경우 네트워크에서 다운로드하여 설치하도록 설정을 변경하자.

1. 다시 네트워크를 사용할 수 있도록 "ifup ens160" 명령을 입력해 네트워크 장치를 켠다.
2. "gedit dvd.repo" 명령을 입력해서 다음과 같이 식별자를 제일 아래에 추가하고 저장한 후 gedit을 닫는다.

[Network-PowerTools]
name=CentOS-$releasever - PowerTools
baseurl=http://mirror.centos.org/centos-8/8.0.1905/PowerTools/x86_64/os/         
                  http://vault.centos.org/8.0.1905/PowerTools/x86_64/os/
gpgcheck=0

 

3. "dnf clean all" 명령을 입력해 기존 다운로드 정보를 모두 지운다. 그리고 DVD에 있는 패키지와 없는 패키지를 동시에 설치해본다. '-y' 옵션은 빼고 "dnf install mc help2man" 명령으로 mc 및 help2man 두 패키지를 설치한다.

* 저장소를 보면 help2man 패키지가 DVD에 없기 때문에 [network] 식별자에서 지정한 곳으로부터 다운로드하고,

DVD에 있는 mc 패키지는 DVD에서 다운로드하는 것을 확인할 수 있다. *

 

4. "y"를 입력해 실제 설치를 진행한다.

 

  step 3 여러 개의 패키지 묶음인 '패키지 그룹'을 설치해보자.

1. 패키지 그룹은 "dnf grouplist" 명령을 입력해 확인할 수 있다.

* 하지만 X 윈도상에서는 패키지 그룹 이름이 한글로 나오기 때문에 설치할 때 불편하다.

따라서 영문 패키지 그룹 이름을 파악하기 위해 "chvt 3" 명령을 입력해

가상 콘솔 3번의 텍스트 모드로 가서 root 사용자로 접속한다. *

 

2. 다음 명령으로 패키지 그룹의 이름을 glist.txt에 저장하고 다시 X 윈도 모드로 돌아온다.

dnf clean all     → 기존 dnf 저장소 정보 초기화
dnf grouplist hidden > glist.txt     → 결과를 glist.txt 파일에 저장
chvt 2     → X 윈도(2번 콘솔)로 돌아감

 

3. "gedit /root/glist.txt &" 명령으로 목록 파일을 연다. '&'는 백그라운드로 실행하라는 명령이다.

* 패키지 환경 그룹과 이미 설치된 패키지 그룹 및 추가로 설치 가능한 패키지 그룹 등을 나눠서 표시된다.

먼저, 패키지 그룹은 패키지 파일(*.rpm)을 필요한 주제에 따라 묶어놓은 것으로, 1개 이상의 패키지 파일을 포함한다.

패키지 환경 그룹은 더 큰 단위로 패키지 그룹을 주제에 따라 묶어 놓은 것이라고 생각하면 된다.

즉, 패키지 파일 ⊂ 패키지 그룹 ⊂ 패키지 환경 그룹으로 포함 관계를 갖는다. *

 

4. 패키지 그룹 중에서 Server에 설치되지 않은 패키지 그룹인 Java Platform을 설치한다. "dnf -y groupinstall "Java Platfrom"" 명령을 입력해 Java 개발 관련 패키지 그룹을 설치한다. 패키지 그룹 이름은 큰 따옴표로 묶어줘야 한다.
5. Java Platfrom 패키지 그룹에 포함된 패키지 파일을 인터넷에서 다운로드한 후 자동으로 설치를 진행할 것이다. 설치가 성공적으로 완료되었는지 확인한다.

 

 

파일 압축
  • 리눅스에서 많이 볼 수 있는 압축 파일의 확장명은 xz, bz2, gz, zip, Z 등이다.

  • 예전에는 주로 확장명 gz를 사용했으나, 최근에는 압축률이 더 좋은 xz나 bz2를 더 많이 사용하는 추세다.

 

xz: 확장명 xz로 압축하거나 풀어줌. 비교적 최신 압축 명령이며 압축률이 뛰어남
xz 파일이름 '파일이름'을 압축 파일인 '파일이름.xz'로 만들며 기존 파일은 삭제됨
xz -d 파일이름.xz '파일이름.xz' 압축 파일을 일반 파일인 '파일이름'으로 만듦
xz -l 파일이름.xz '파일이름.xz' 압축 파일에 포함된 파일 목록과 압축률 등을 출력
xz -k 파일이름 압축 후에 기존 파일을 삭제하지 않고 그대로 둠

 

 

bzip2: 확장명 bz2로 압축하거나 풀어줌
bzip2 파일이름 '파일이름'을 압축 파일인 '파일이름.bz2'로 만듦
bzip2 -d 파일이름.bz2 '파일이름.bz2' 압축 파일을 일반 파일인 '파일이름'으로 만듦

 

 

bunzip2: 확장명 bz2의 압축을 풀어줌. 'bzip2 -d'와 동일한 명령

 

 

gzip: 확장명 gz로 압축하거나 풀어줌
gzip 파일이름 '파일이름'을 압축 파일인 '파일이름.gz'로 만듦
gzip -d 파일이름.gz '파일이름.gz' 압축 파일을 일반 파일인 '파일이름'으로 만듦

 

 

gunzip: 확장명 gz의 압축을 풀어줌. 'gzip -d'와 동일한 명령

 

 

zip: Windows용과 호환되는 확장명 zip으로 압축하거나 풀어줌
zip 생성할파일이름.zip 압축할파일이름 압축할 파일 이름을 '생성할파일이름.zip'으로 만듦

 

 

unzip: Windows용과 호환되는 zip으로 묶은 압축 파일을 풀어줌
unzip 압축파일이름.zip '압축파일이름.zip'의 압축을 풀어줌

 

 

파일 묶기
  • 알집이나 반디집 같은 Windows용 압축 프로그램을 생각해보면 aaa, bbb라는 2개 파일을 압축했을 때 ccc.zip이라는 1개의 압축 파일이 생긴다. 즉, aaa와 bbb라는 두 파일이 ccc라는 1개의 파일로 묶인 후 압축된 것이다. 이는 Windows 압축 프로그램이 '파일 압축'과 '파일 묶기'를 한꺼번에 하기 때문이다.

  • 하지만 이와 조금 다르게 리눅스에서는 '파일 압축'과 '파일 묶기'를 원칙적으로 별개의 프로그램으로 실행하도록 되어 있다. 물론 사용자의 편의를 위해 한 번에 할 수 있는 옵션도 제공한다.

  • 파일 묶기 명령어는 tar이며, 묶인 파일의 확정명도 tar다.

 

tar: 확장명 tar로 묶음 파일을 만들거나 묶음을 풀어줌
c (동작) 새로운 묶음을 만듦
x (동작) 묶인 파일을 풀어줌
t (동작) 묶음을 풀기 전에 묶인 경로를 보여줌
C (동작) 묶음을 풀 때 지정된 디렉터리에 압축을 풀어줌.
지정하지 않으면 묶을 때와 동일한 디렉터리에 묶음이 풀림
f (필수) 묶음 파일 이름 지정. 생략하면 테이프로 보내짐
v (옵션) 파일이 묶이거나 풀리는 과정을 보여줌
J (옵션) tar + xz
z (옵션) tar + gzip
j (옵션) tar + bzip2
# tar cvf my.tar /etc/sysconfig/ 묶기
# tar cvfJ my.tar.xz /etc/sysconfig/ 묶기 + xz 압축
# tar cvfz my.tar.gz /etc/sysconfig/ 묶기 + gzip 압축
# tar cvfj my.tar.bz2 /etc/sysconfig/ 묶기 + bzip2 압축
# tar tvf my.tar 파일 확인
# tar xvf my.tar tar 풀기
# tar cxvf newdir my.tar newdir에 tar 풀기
# tar xfJ my.tar.xz xz 압축 해제 + tar 풀기
# tar xfz my.tar.gz gzip 압축 해제 + tar 풀기
# tar xfj my.tar.bz2 bzip2 압축 해제 + tar 풀기

 

 

파일 위치 검색
find 경로 옵션 조건 action 옵션: -name, -user(소유자), -newer(전, 후), -perm(허가권), -size(크기)
action: -print(기본값), -exec(외부 명령 실행)
which 실행파일이름 PATH에 설정된 디렉터리만 검색, 절대 경로를 포함한 위치 검색
whereis 실행파일이름 실행 파일 및 소스, man 페이지 파일까지 검색
locate 파일이름 파일 목록 데이터베이스에서 검색하기 때문에 매우 빠르고 유용하지만, updatedb 명령을 1회 실행해야 사용할 수 있음

 

 

시스템 설정
[설정]의 [날짜 및 시각] 표준 시간대 변경
nmtui 네트워크 설정
firewall-config 방화벽 설정, 외부에 서비스하기 위해 포트를 열 때 사용
ntsysv 서비스(데몬)의 시작, 중지, 재시작 및 사용 여부를 설정

 

 

cron
  • 주기적으로 반복되는 일을 자동으로 실행할 수 있도록 시스템 작업을 예약해놓은 것을 cron이라 부른다.

  • cron과 관련된 데몬(서비스)은 crond이고, 관련 파일은 /etc/crontab이며, /etc/crontab의 형식은 다음과 같다.

분 시 일 월 요일 사용자 실행명령
  • 분에는 0~59, 시에는 0~23, 일에는 1~31, 월에는 1~12, 요일에는 0~6이 올 수 있다. 요일은 0부터 일요일로 시작한다. 사용자는 명령을 실행할 사용자가, 실행 명령에는 그 시간에 실행할 명령이 올 수 있다. 간단한 예를 보면 다음과 같다.

00 05 1 * * root cp -r /home /backup
  • *으로 표시된 월과 요일은 매월과 모든 요일을 의미한다. 즉, 매월 1일 새벽 5시 00분에 실행한다는 의미이며, 사용자는 root의 권한이고, 명령은 cp -r /home /backup 명령을 실행하여 /home 디렉터리가 통째로 /backup 디렉터리에 복사된다.

  • 또한 cron의 경우, 주기적으로 실행할 내용을 디렉터리에 넣어놓고 작동하기 때문에 다음과 같이 /etc/crontab 파일이 시간별, 일별, 주별, 월별로 호출하는 디렉터리를 보여준다.

 

 

at
  • cron은 주기적으로 반복되는 작업을 예약하는 것이지만, at 명령어는 일회성 작업을 예약하는 것이다. 즉, 예약해두면 한 번만 실행되고 소멸된다.

  • 명령어 사용법은 예약 at 시간 -> 예약 명령어 입력 후 Enter -> 완료되면 Ctrl + D -> 확인 at -l -> 취소 atrm 작업번호 순으로 입력하면 된다.

 

 

[실습 4] 매월 15일 새벽 3시 1분에 /home 디렉터리와 그 하위 디렉터리를 /backup 디렉터리에 백업하자.

  step 0 초기화한 Server를 실행하고 root 사용자로 접속하자.

 

  step 1 cron 설정을 하자.

1. 시간 설정을 위해 https://cafe.naver.com/thisisLinux의 자료실에서 openrdate 패키지를 다운로드한다.
2. "dnf -y install openrdate*.rpm" 명령으로 시간 설정과 관련된 패키지를 설치한다.
3. "systemctl status crond" 명령으로 cron과 관련 서비스인 crond가 동작하는지 확인한다. Q를 누르면 종료된다.
4. "gedit /etc/crontab" 명령을 입력해 예약 파일을 열고 맨 아래에 "01 3 15 * * root run-parts /etc/cron.monthly"를 추가한 후 저장하고 닫는다.
5. /etc/cron.monthly/ 디렉터리에서 메시지를 출력하는 스크립트 파일(myBackup.sh)을 만들고, 속성을 실행할 수 있게 바꾼다.
6. "gedit myBackup.sh" 명령을 입력하고 파일 안에 다음과 같이 내용을 입력한 후 저장하고 닫는다.

#! /bin/sh

set $(date)
fname="backup-$2$tar.xz"

tar cfJ /backup/$fname /home

→ 현재 날짜를 추출해서 /backup 디렉터리에 backup-현재날짜.tar.xz라는 파일로 /home 디렉터리 전체의 백업 파일을 생성하라는 의미다.

 

7. 백업용 디렉터리를 생성하고 crond 데몬을 재시작한다.
8. 날짜를 강제로 바꾸고 crond 서비스를 재시작해보면 백업된 데이터가 쌓이는 것을 확인할 수 있다.

date 011503002027     → 01월 15일 03시 00분 2027년으로 날짜를 바꾼다.
systemctl restart crond     → 실행 후 1~2분 기다린다.
ls -l /backup
date 021503002027     → 02월 15일 03시 00분 2027년으로 날짜를 바꾼다.
systemctl restart crond     → 실행 후 1~2분 기다린다.
ls -l /backup

 

  step 2 at 명령어로 내일 새벽 4시에 시스템을 최신 패키지로 업데이트하고, 완료되면 시스템을 재부팅하도록 예약해보자. 그리고 예약된 내용을 삭제해보자.

1. 정확한 시간을 설정하려면 rdate 명령을 실행해 타임 서버에서 시간을 가져온 다음 현재 리눅스에 설정한다. 우리나라에서 운용하는 타임 서버로는 time.bora.net, ntp.kornet.net, ntp.postech.ac.kr 등이 있다.

rdate -s time.bora.net
at 4:00am tomorrow
dnf -y update
reboot
Crtl + D 누름     → 작업 예약을 완료한다.
at -l     → 제일 앞에 출력되는 번호가 작업번호다.
atrm 작업 번호     → 작업을 삭제한다.
at -l