리눅스는 시스템 운영을 효율적이고 빠르게 처리할 수 있도록 다양한 명령어와 도구를 제공합니다.
시스템 관리자의 역할은 소프트웨어 설치 및 실행, 접근 제어, 시스템 모니터링, 가용성 유지, 데이터 백업 및 복구, 그리고 긴급 상황 대처 등을 포함합니다. 😜
본 글에서는 리눅스 시스템 관리자들이 일상적인 작업에서 자주 사용하는 몇 가지 명령어들을 자세히 살펴보겠습니다.
uname
시스템 정보를 확인하려면 uname
명령어를 -a
옵션과 함께 사용하세요. 이 명령어는 커널 이름, 릴리스 버전, 버전 정보, 호스트 이름, 프로세서 종류, 그리고 하드웨어 플랫폼 관련 정보를 제공합니다.
[email protected]:~$ uname -a Linux ubuntu18 5.3.0-1028-azure #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
위 결과의 각 항목은 다음과 같은 의미를 가집니다:
kernel name: Linux hostname: ubuntu18 kernel release: 5.3.0-1028-azure kernel version: #29~18.04.1-Ubuntu SMP Fri Jun 5 14:32:34 UTC 2020 machine hardware name: x86_64 processor: x86_64 hardware-platform: x86_64 operating system: GNU/Linux
df
파일 시스템의 크기와 사용 가능한 공간을 확인하려면 df
명령어를 사용합니다. 옵션 없이 실행하면 출력 결과가 1K 블록 단위로 표시됩니다.
[email protected]:~$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 437208 0 437208 0% /dev tmpfs 91100 692 90408 1% /run /dev/sda1 30309264 2383952 27908928 8% / ....
-h
옵션을 사용하면 출력 결과가 사람이 읽기 쉬운 형식(MB, GB)으로 표시됩니다.
[email protected]:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 427M 0 427M 0% /dev tmpfs 89M 692K 89M 1% /run /dev/sda1 29G 2.3G 27G 8% / tmpfs 445M 0 445M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 445M 0 445M 0% /sys/fs/cgroup /dev/sda15 105M 3.6M 101M 4% /boot/efi /dev/sdb1 3.9G 16M 3.7G 1% /mnt tmpfs 89M 0 89M 0% /run/user/1001
특정 파일 시스템(예: tmpfs
)을 제외하고 결과를 보려면 -x
옵션을 사용하세요.
[email protected]:~$ df -h -x tmpfs Filesystem Size Used Avail Use% Mounted on udev 427M 0 427M 0% /dev /dev/sda1 29G 2.3G 27G 8% / /dev/sda15 105M 3.6M 101M 4% /boot/efi /dev/sdb1 3.9G 16M 3.7G 1% /mnt
특정 파일 시스템 종류만 표시하려면 -t
옵션을 사용합니다. 예를 들어, ext4
파일 시스템만 보려면 다음과 같이 실행합니다:
[email protected]:~$ df -h -t ext4 Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 2.3G 27G 8% / /dev/sdb1 3.9G 16M 3.7G 1% /mnt
--total
옵션을 추가하면 총 사용량 요약 라인이 출력됩니다.
[email protected]:~$ df -h -t ext4 --total Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 2.3G 27G 8% / /dev/sdb1 3.9G 16M 3.7G 1% /mnt <b>total 33G 2.3G 31G 8% -</b>
du
특정 디렉토리의 디스크 사용량을 확인하려면 du
명령어를 사용합니다. 예를 들어, /var/log
디렉토리의 사용량을 확인하려면 -h
옵션을 사용하여 사람이 읽기 쉬운 형식으로 출력합니다.
[email protected]:~$ sudo du -h /var/log 24K /var/log/Microsoft/Azure/NetworkWatcherAgent/Logs 28K /var/log/Microsoft/Azure/NetworkWatcherAgent 32K /var/log/Microsoft/Azure 36K /var/log/Microsoft 60K /var/log/apt 4.0K /var/log/samba 177M /var/log/journal/0f4f926f583b4691af7de11025b19ff6 177M /var/log/journal ... 204M /var/log
총 사용량만 확인하려면 -s
(요약) 옵션을 사용합니다.
[email protected]:~$ sudo du -hs /var/log 204M /var/log
free
시스템의 총 메모리, 사용된 메모리, 사용 가능한 메모리 정보를 보려면 free
명령어를 사용합니다. 사람이 읽기 쉬운 형식으로 결과를 출력하려면 -h
옵션을 사용합니다.
[email protected]:~$ free -h total used free shared buff/cache available Mem: 889M 272M 100M 712K 517M 443M Swap: 0B 0B 0B
각 항목의 의미는 다음과 같습니다:
total - 총 설치된 메모리 용량 (memtotal + swaptotal) used - 사용 중인 메모리 free - 사용하지 않는 메모리 (memfree + swapfree) buffers - 커널 버퍼에 사용된 메모리 cache - 페이지 캐시에 사용된 메모리 buff/cache - 버퍼와 캐시의 총합 available - 스왑을 사용하지 않고 새로운 애플리케이션을 시작하는 데 사용할 수 있는 예상 메모리
ps
시스템에서 실행 중인 프로세스들의 상태 정보를 확인하려면 ps
명령어를 사용합니다. 특정 사용자가 소유한 모든 프로세스를 보려면 사용자 이름과 함께 -u
옵션을 사용합니다.
[email protected]:~$ ps -u ubuntu PID TTY TIME CMD 7804 ? 00:00:00 systemd 7805 ? 00:00:00 (sd-pam) 7940 ? 00:00:00 sshd 7941 pts/0 00:00:00 bash 8111 ? 00:00:00 sshd 8112 pts/1 00:00:00 bash 13868 ? 00:00:00 sshd 13869 pts/2 00:00:00 bash 13885 pts/0 00:00:00 man 13895 pts/0 00:00:00 pager 18111 pts/2 00:00:00 man 18121 pts/2 00:00:00 pager 18485 pts/1 00:00:00 ps
시스템의 모든 프로세스를 보려면 aux
옵션을 사용하여 ps
명령어를 실행하세요.
[email protected]:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 160076 7020 ? Ss Jun29 0:34 /sbin/init root 2 0.0 0.0 0 0 ? S Jun29 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< Jun29 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< Jun29 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< Jun29 0:00 [kworker/0:0H-kb] ....
각 열의 의미는 다음과 같습니다:
항목 | 의미 |
PID | 프로세스 식별 번호 |
CPU % | 프로세스가 사용하는 CPU 시간의 백분율 |
%MEM | 프로세스가 사용 중인 RAM 비율 |
VSZ | 프로세스가 사용 중인 가상 메모리(KB) |
RSS | 프로세스가 사용 중인 실제 메모리(KB) |
TTY | 프로세스와 연결된 터미널 |
STAT | 프로세스 상태 (R: 실행 중, S: 대기 중, I: 유휴, T: 중지됨, Z: 좀비, D: 디스크 I/O 대기 중, X: 작동 불가, W: 스왑됨, N: 우선순위 낮음, <: 우선순위 높음) |
top
ps
명령어가 특정 시점의 프로세스 상태를 보여주는 스냅샷이라면, top
명령어는 시스템 프로세스 목록을 실시간으로 업데이트하여 보여줍니다 (기본적으로 3초마다 갱신).
top
명령어의 출력 결과는 시스템 요약 정보와 CPU 활동별로 정렬된 프로세스 테이블로 구성됩니다.
top - 14:25:32 up 44 days, 11:37, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 114 total, 1 running, 59 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 910992 total, 101208 free, 274712 used, 535072 buff/cache KiB Swap: 0 total, 0 free, 0 used. 458492 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 50497 ubuntu 20 0 44528 3944 3368 R 0.7 0.4 0:00.15 top 1 root 20 0 160076 7020 4400 S 0.0 0.8 0:34.85 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.08 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:+ 9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_+
시스템 요약 정보 항목은 다음과 같습니다:
up: 시스템 가동 시간. 시스템이 마지막으로 부팅된 이후 경과된 시간입니다.
load average: 로드 평균은 실행 대기 중인 프로세스 수를 나타냅니다. 1.0 미만 값은 시스템이 사용 중이 아님을 의미합니다. 세 개의 값은 각각 최근 1분, 5분, 15분 평균입니다.
%Cpu: CPU 사용 정보를 보여주는 행입니다.
- us (user): 사용자 프로세스에 사용되는 CPU 시간 비율
- sy (system): 시스템 프로세스에 사용되는 CPU 시간 비율
- ni (nice): 낮은 우선순위 프로세스에 사용되는 CPU 시간 비율
- id (idle): 유휴 상태의 CPU 시간 비율
- wa (wait): I/O 작업을 기다리는 데 사용되는 CPU 시간 비율
- hi (hardware interrupts): 하드웨어 인터럽트에 소요된 시간
- si (software interrupts): 소프트웨어 인터럽트에 소요된 시간
- st (steal time): 하이퍼바이저에 의해 가상 머신이 사용하는 시간
프로세스 테이블 항목은 다음과 같습니다:
항목 | 의미 |
PID | 프로세스 식별 번호 |
USER | 프로세스 소유자 |
PR | 우선순위 |
NI | nice 값 |
VIRT | 프로세스가 사용하는 가상 메모리 (KB) |
RES | 프로세스가 사용하는 실제 메모리 |
SHR | 프로세스가 사용하는 공유 메모리 |
S | 프로세스 상태. (R: 실행 중, S: 대기 중, I: 유휴, T: 중지됨, Z: 좀비, D: 디스크 I/O 대기 중, W: 스왑됨, X: 작동 불가) |
%CPU | 프로세스가 사용하는 CPU 시간 백분율 |
%MEM | 프로세스가 사용하는 물리 메모리 백분율 |
TIME+ | 프로세스가 사용한 총 CPU 시간 |
COMMAND | 프로그램 이름 |
top
명령어 실행 중 여러 키를 눌러 명령어를 사용할 수 있습니다. h
또는 ?
키를 누르면 사용 가능한 명령 목록을 확인할 수 있습니다. k
키를 누르면 프로세스를 종료할 수 있고, q
키를 누르면 top
명령어를 종료할 수 있습니다.
dig
dig
명령어는 DNS 쿼리 도구로 사용됩니다. 사용법은 다음과 같습니다:
dig <DNS 서버> <도메인> <쿼리 종류>
<DNS 서버>
: 쿼리를 보낼 DNS 서버 이름<도메인>
: 쿼리할 도메인 이름<쿼리 종류>
: 쿼리할 레코드 종류 (A, MX, NS, SOA 등)
자세한 출력을 줄이려면 +short
옵션을 사용합니다.
google.com
의 A 레코드를 확인하려면 다음과 같이 실행합니다:
[email protected]:~$ dig google.com +short 172.217.164.174
google.com
의 MX 레코드를 확인하려면 다음과 같이 실행합니다:
[email protected]:~$ dig google.com MX +short 50 alt4.aspmx.l.google.com. 10 aspmx.l.google.com. 20 alt1.aspmx.l.google.com. 40 alt3.aspmx.l.google.com. 30 alt2.aspmx.l.google.com.
인터넷에서 DNS 레코드를 쿼리해야 하는 경우 온라인 DNS 조회 도구를 사용할 수도 있습니다.
who 및 w
who
명령어는 현재 시스템에 로그인한 사용자를 표시합니다.
[email protected]:~$ who ubuntu pts/0 2020-08-14 17:28 (183.83.211.129) ubuntu pts/1 2020-08-14 17:58 (183.83.211.129)
w
명령어는 현재 로그인한 사용자와 해당 프로세스를 보여줍니다. 명령어 헤더에는 현재 시간, 시스템 가동 시간, 로그인 사용자 수, 시스템 로드 평균이 표시됩니다.
[email protected]:~$ w 18:07:33 up 46 days, 15:19, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ubuntu pts/0 183.83.211.129 17:28 2.00s 0.10s 0.00s w ubuntu pts/1 183.83.211.129 17:58 9:07 0.05s 0.01s vi
출력 결과는 사용자 이름, 터미널, 원격 로그인 IP 주소, 로그인 시간, 유휴 시간, JCPU, PCPU, 그리고 실행 중인 프로그램 정보를 보여줍니다. JCPU는 터미널에 연결된 모든 프로세스가 사용한 총 CPU 시간이고, PCPU는 현재 프로세스가 사용한 CPU 시간입니다.
tar
GNU tar
명령어는 여러 개의 파일들을 하나의 아카이브 파일로 묶는 데 사용됩니다.
예를 들어, myfiles
디렉토리를 생성하고 그 안에 a.txt
, b.txt
, c.txt
파일을 만들어 보겠습니다.
[email protected]:~$ mkdir myfiles ; touch myfiles/{a.txt,b.txt,c.txt}
이제 myfiles
디렉토리의 모든 파일을 포함하는 allfiles.tar
라는 아카이브 파일을 만들려면 다음과 같이 실행합니다.
[email protected]:~$ tar -cvf allfiles.tar myfiles myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
현재 디렉토리 내용을 확인해 보면 myfiles
디렉토리와 allfiles.tar
아카이브 파일이 있음을 확인할 수 있습니다.
[email protected]:~$ ls allfiles.tar myfiles
-x
옵션을 사용하여 아카이브 파일의 압축을 풀 수 있습니다. allfiles.tar
파일의 압축을 풀려면 다음과 같이 실행합니다.
[email protected]:~$ tar -xvf allfiles.tar myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
-z
옵션을 사용하여 아카이브를 gzip 형식으로 압축할 수 있습니다.
[email protected]:~$ tar -zcvf allfiles.tar.gz myfiles myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt [email protected]:~$ ls allfiles.tar.gz myfiles
압축된 아카이브 파일의 압축을 풀려면 -z
옵션과 함께 -x
옵션을 사용합니다.
[email protected]:~$ tar -zxvf allfiles.tar.gz myfiles/ myfiles/c.txt myfiles/a.txt myfiles/b.txt
grep
grep
명령어는 파일이나 여러 파일에서 특정 패턴을 검색하는 데 사용됩니다. 지정된 패턴과 일치하는 모든 줄을 출력합니다. 예를 들어, /etc/apache2/apache2.conf
파일에서 “ServerRoot” 문자열이 포함된 줄을 검색하려면 다음과 같이 실행합니다.
[email protected]:~$ grep ServerRoot /etc/apache2/apache2.conf # ServerRoot: The top of the directory tree under which the server's #ServerRoot "/etc/apache2"
특정 디렉토리 내 모든 파일을 검색하려면 *
문자를 사용합니다. 하위 디렉토리를 포함하여 검색하려면 -r
(재귀) 옵션을 사용합니다. 예를 들어, /etc/apache2
디렉토리 내 모든 파일에서 “VirtualHost” 패턴을 포함하는 모든 줄을 찾으려면 다음과 같이 실행합니다.
[email protected]:~$ cd /etc/apache2 [email protected]:/etc/apache2$ grep -r VirtualHost * apache2.conf:# If you do not specify an ErrorLog directive within a <VirtualHost> apache2.conf:# logged here. If you *do* define an error logfile for a <VirtualHost> conf-available/localized-error-pages.conf:# even on a per-VirtualHost basis. If you include the Alias in the global server conf-available/other-vhosts-access-log.conf:# Define an access log for VirtualHosts that don't define their own logfile ports.conf:# have to change the VirtualHost statement in sites-available/000-default.conf:<VirtualHost *:80> ...
rsync
rsync
명령어는 두 위치 간에 파일 및 디렉토리를 동기화하는 데 사용되는 빠르고 강력한 도구입니다. 로컬 복사 및 원격 복사 모두에 사용될 수 있으며, 변경된 부분만 전송하므로 속도가 빠릅니다.
백업 및 일상적인 파일 복사에 유용하게 사용됩니다.
다음은 몇 가지 예입니다.
myfiles
디렉토리의 모든 파일을 backups
디렉토리에 복사/동기화하려면 다음과 같이 실행합니다.
[email protected]:~$ rsync -avh myfiles/ /backups sending incremental file list ./ a.txt b.txt c.txt sent 218 bytes received 76 bytes 588.00 bytes/sec total size is 0 speedup is 0.00
myfiles
디렉토리의 모든 파일을 원격 호스트의 backups
디렉토리에 동기화하려면, 대상 이름에 remote_user@remote_host
정보를 포함합니다. 따라서, myfiles
폴더를 10.0.0.50
IP 주소를 가진 원격 호스트로 동기화하려면 다음과 같이 실행합니다:
[email protected]:~$ rsync -avh myfiles/ [email protected]:/home/vagrant [email protected]'s password: sending incremental file list ./ a.txt b.txt c.txt sent 230 bytes received 76 bytes 47.08 bytes/sec total size is 0 speedup is 0.00
ss
ss
명령어는 소켓 통계를 표시하는 데 사용되는 도구입니다. netstat
명령어의 현대적인 대체재로 볼 수 있습니다. TCP 소켓을 확인하려면 -t
옵션을 사용합니다.
[email protected]:~$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 10.0.0.4:53852 168.63.129.16:8037 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:64118 ESTAB 0 0 10.0.0.4:33256 169.254.169.254:http ESTAB 0 1080 10.0.0.4:ssh 222.186.30.35:11527 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:63049
이 결과는 수신 대기 중인 소켓을 보여주지 않습니다. 수신 대기 소켓과 비 수신 대기 소켓을 모두 표시하려면 -t
와 -a
옵션을 함께 사용합니다.
[email protected]:~$ ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* LISTEN 0 80 127.0.0.1:mysql 0.0.0.0:* LISTEN 0 128 127.0.0.53%lo:domain 0.0.0.0:* ESTAB 0 0 10.0.0.4:53852 168.63.129.16:8037 ESTAB 0 0 10.0.0.4:ssh 183.83.211.129:64118 ESTAB 0 0 10.0.0.4:33256 169.254.169.254:http ESTAB 0 1080 10.0.0.4:ssh 222.186.30.35:11527 ESTAB 0 120 10.0.0.4:ssh 183.83.211.129:63049 LISTEN 0 128 [::]:ssh [::]:* LISTEN 0 128 *:http *:*
locate
locate
명령어는 데이터베이스를 사용하여 파일을 검색하므로, find
명령어보다 훨씬 빠른 검색 결과를 보여줍니다. apache2.conf
와 같은 특정 파일을 검색하는 데 유용합니다.
[email protected]:~$ locate apache2.conf /etc/apache2/apache2.conf /var/lib/dpkg/info/apache2.conffiles
검색 패턴과 일치하는 파일의 개수만 확인하려면 -c
옵션을 사용할 수 있습니다.
[email protected]:~$ locate -c apache2.conf 2
가끔 locate
명령어가 사용하는 데이터베이스 (mlocate
)를 갱신해야 할 수 있습니다. 데이터베이스를 업데이트하려면 updatedb
명령어를 사용합니다. 이 명령어는 관리자 권한이 필요합니다.
[email protected]:~$ sudo updatedb
find
find
명령어는 리눅스에서 가장 많이 사용되는 명령어 중 하나입니다. 파일 이름, 권한, 사용자 ID, 그룹 ID, 크기, 파일 종류 등 다양한 기준을 사용하여 파일을 검색할 수 있습니다.
현재 디렉토리에서 이름으로 파일을 검색하려면 -name
옵션과 함께 검색할 파일 이름을 사용합니다.
[email protected]:~$ find . -name a.txt ./myfiles/a.txt
디렉토리를 검색하려면 -type d
옵션을 사용합니다.
[email protected]:~$ find . -type d . ./.ssh ./myfiles ./.cache ./.gnupg ./.gnupg/private-keys-v1.d ./docker
20MB보다 큰 파일을 크기별로 검색하려면 -size
옵션을 사용합니다.
[email protected]:~$ find . -size +20M ./docker/docker-ce-cli_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb ./docker/docker-ce_5%3a19.03.12~3-0~ubuntu-bionic_amd64.deb
systemctl
현재 대부분의 리눅스 배포판에서 systemd
가 SysV init 프로세스를 대체하였으므로, systemctl
명령어를 사용하여 systemd
서비스 및 장치를 관리할 수 있습니다.
서비스를 시작하려면 (예: apache2
):
[email protected]:~$ sudo systemctl start apache2.service
서비스 접미사는 생략할 수 있습니다.
서비스를 중지하려면:
[email protected]:~$ sudo systemctl stop apache2
서비스 상태를 보려면 systemctl status
명령어를 사용합니다. 다음은 실행 중인 apache2
서비스의 상태 정보 예시입니다.
[email protected]:~$ sudo systemctl status apache2 ● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/apache2.service.d └─apache2-systemd.conf Active: active (running) since Wed 2020-08-19 11:34:04 UTC; 2s ago Process: 25346 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS) Process: 18202 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS) Process: 25536 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS) Main PID: 25555 (apache2) Tasks: 55 (limit: 1024) CGroup: /system.slice/apache2.service ├─25555 /usr/sbin/apache2 -k start ├─25558 /usr/sbin/apache2 -k start └─25559 /usr/sbin/apache2 -k start Aug 19 11:34:04 ubuntu18 systemd[1]: Starting The Apache HTTP Server... Aug 19 11:34:04 ubuntu18 systemd[1]: Started The Apache HTTP Server.
ufw
UFW (Uncomplicated Firewall)는 iptables를 쉽게 사용할 수 있도록 해주는 방화벽 도구입니다. Ubuntu 기반 배포판에서 기본적으로 사용할 수 있으며, CentOS에서는 EPEL 저장소에서 설치할 수 있습니다.
UFW를 활성화하려면 다음과 같이 실행합니다:
$ sudo ufw enable
UFW 상태를 확인하려면 다음과 같이 실행합니다:
$ sudo ufw status Status: active
UFW의 기본 정책은 모든 아웃바운드 트래픽을 허용하고 모든 인바운드 트래픽을 차단하는 것입니다.
HTTP 포트에서 들어오는 트래픽을 허용하려면 다음과 같이 실행합니다:
$ sudo ufw allow http Rule added Rule added (v6)
모든 포트의 트래픽을 차단할 수도 있습니다. 다음은 포트 21의 트래픽을 차단하는 예