리눅스 사용 팁들

커맨드 라인 표기법: 터미널에 입력해야 하는 커맨드들은 $ 로 시작하였다. 특별히 관리자 권한(root 계정)이 요구되는 명령에 대해서는 # 로 표기하였다. 또한 사용자 계정 및 현재 디렉토리를 표시해야 할 필요성이 있는 경우 전체 프롬프트 (예: [lab@master ~]$ ) 를 모두 표시하기도 하였다. 이 외에 이러한 글자로 시작되지 않는 것들은 모두 터미널에서 나온 출력으로 보면 된다.

목차

사용자 계정 관리

현재 계정 목록 보기

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...

사용자 계정 추가

# useradd lab

비밀번호 변경

# passwd lab
[lab@master ~]$ passwd
Changing password for user lab.
Changing password for lab.
(current) UNIX password:

passwd: Only root can specify a user name.

관리자 권한이 필요한 기능인데, 관리자가 아닌 상태에서 명령어를 수행했을 경우.

$ passwd sukjun
passwd: Only root can specify a user name.

su: Authentication failure

root 계정에 대한 비밀번호를 제대로 입력했음에도 불구하고 root 권한을 획득하는 것이 불가능한 문제가 있었다.

$ su
Password: ********
su: Authentication failure

이러한 에러 메시지에 대한 원인은 다음의 두 가지 중 하나인 경우가 대부분이다.

  1. root 계정의 비밀번호를 설정해놓지 않았다.
  2. /bin/su 파일의 퍼미션이 rwsr-xr-x 와 같이 되어있지 않다.

첫번째 원인부터 확인해보기로 하였다. root 계정의 비밀번호를 설정하지 않았을 수 있으므로 다음과 같이 root 계정의 비밀번호를 설정하였다. (다행히도 일반 사용자 계정에 sudo 권한이 있어서 가능했다.)

$ sudo passwd root
[sudo] password for lab:
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

그런데도, 여전히 Authentication failure 에러가 나타났다. 두번째 원인을 확인하기 위해 /bin/su 명령어의 퍼미션을 확인해 보았다. su 명령어는 특수한 퍼미션인 rwsr-xr-x 를 가지고 있어야 한다. 그런데, 세번째 실행 권한이 s 가 아니라 x 로 되어 있었다.

$ sudo ls -al /bin/su
-rwxr-xr-x 1 root root 32088 Nov  6  2016 /bin/su

다음과 같이 /bin/su 파일의 퍼미션을 제대로 되돌려 주었다.

[root@sirna3 ~]# chmod 4755 /bin/su
[root@sirna3 ~]# ls -al /bin/su
-rwsr-xr-x 1 root root 32088 Nov  6  2016 /bin/su

다시 일반 사용자 계정에서 root 계정으로 접근하니 제대로 su 명령이 수행되었다. 본 문제의 경우에는 2번의 이유로 su 명령어가 제대로 수행되지 않았음을 알 수 있었다.

[lab@sirna3 ~]$ su
Password:
[root@sirna3 lab]#

ls 명령어의 날짜 표시형식 바꾸기

ls 명령어의 날짜 표시형식을 YYYY-mm-dd 형식으로 바꾸려면 아래와 같은 내용을 .bashrc 파일에 추가한다.

alias ls='ls --color=auto --time-style=+"%Y-%m-%d %H:%M:%S"'

적용시키기 위해 source 명령어를 이용하거나 다시 로그인을 해 보면 다음과 같이 바뀐 것을 확인할 수 있다.

[lab@master ~]$ ls -al
total 87062
drwx--x--x 59 lab  lab  20480 2020-05-18 12:48:55 .
drwxr-xr-x  4 root root     0 2020-05-17 03:36:10 ..
-rw-------  1 lab  lab  10717 2020-05-18 09:52:25 .bash_history
-rw-r--r--  1 lab  lab     18 2013-07-18 22:19:03 .bash_logout
-rw-r--r--  1 lab  lab    204 2020-05-11 17:58:23 .bash_profile
-rw-r--r--  1 lab  lab    601 2020-05-11 17:49:45 .bashrc

명령어 또는 파일의 위치 확인

리눅스 명령어의 절대경로를 확인하기 위해 which, whereis, locate 와 같은 명령어들을 사용할 수 있다. which 의 경우 -a 옵션을 붙이면 검색 가능한 모든 경로(PATH)에서 해당 명령어의 위치를 찾아준다.

$ which find
/bin/find

$ which -a find
/bin/find
/usr/bin/find

whereis 는 명령어 위치 뿐만 아니라 명령어의 man 페이지 등 부가 정보들을 출력해준다.

$ whereis find
find: /usr/bin/find /usr/share/man/man1/find.1.gz /usr/share/man/man1p/find.1p.gz

locate 는 다양한 패턴의 파일들을 찾고자 할 때 유용하게 사용할 수 있다. 현재 시스템에 확장자가 bak 인 파일들을 다음과 같이 찾을 수 있다. -n 10 옵션을 붙이면 최대 10 개까지 찾아준다.

$ locate *.bak
$ locate -n 10 *.conf

awk 와 sort 조합하여 사용하기

파일 내용에서 3번째 컬럼은 숫자로 sorting, 4번째 컬럼은 그대로 정렬

sort -k3n,3 -k4,4 result.txt

파일의 첫번째 컬럼만 비교하여 중복되는 것은 제외하고 싶을 때

awk '!x[$1]++' result.txt

파일 쉽게 찾기

각 파일은 세 종류의 기준을 근거로 타임스탬프 값을 가지고 있다.

(오래된 파일들을 지우기 위해 알아보려고 할 때) 수정된 지 60일 보다 오래된 파일들을 찾는다.

$ find ./ -mtime +60

(최근에 수정된 파일들이 무엇이 있는지 알아보고자 할 때) 수정된 지 60일이 되지 않은 파일들을 찾는다.

$ find ./ -mtime -60

텍스트 파일만 찾기 위해서는 -iname 옵션을 이용한다.

$ find ./ -iname "*.txt"

그리고 디렉토리는 제외하고 파일만 찾기 위해서는 -type f 라고 지정해주면 된다.

$ find ./ -type f

ulimit

그렇다면, 새로운 설정값은 어떻게 해야 적용될까? 수정한 내용의 적용은 해당 유저가 새로운 접속을 시도하면 적용된다.

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63790
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) unlimited
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

프롬프트 색상 변경하기

여러 클러스터 혹은 서버를 사용할 때 프롬프트가 헷갈려 실수를 유발할 가능성이 있다면, 프롬프트 색상을 변경해 보는 것을 추천한다.

(Step 1) .bashrc 파일에 다음의 줄을 추가한다.

PS1="\e[1;36m[\u@\h \W]\$ \e[m"  # mirna1 - light cyan
PS1="\e[1;32m[\u@\h \W]\$ \e[m"  # mirna2 - light green

(Step 2) 클러스터 내에서 /home/lab 폴더를 공유할 수 있다면 다음과 같이 해주면 된다.

if [ "${HOSTNAME}" == "mirna1.local" ]; then
    PS1="\e[1;36m[\u@\h \W]\$ \e[m"  ## mirna1 - light cyan
elif [ "${HOSTNAME}" == "mirna2.local" ]; then
    PS1="\e[1;32m[\u@\h \W]\$ \e[m"  ## mirna2 - light green
fi

시스템에 존재하는 CPU 개수 확인

논리적 CPU 개수는 다음과 같이 구해진다: CPUs = (Threads per core) x (cores per socket) x (sockets). 만약 여러분의 컴퓨터가 쿼드 코어(4 cores per socket)를 가진 CPU 를 1개 (1 socket) 장착하고 있고, 하이퍼스레딩 옵션으로 1 코어당 2개의 쓰레드를 생성(2 threads per core)하였다면, 총 8 CPUs (= 2 x 4 x 1) 가 있는 셈이다. 이 숫자를 간단히 확인할 수 있는 명령어는 nproc 이다.

$ nproc
8

CentOS 배포판 버전 확인

릴리즈 파일들의 목록 확인

$ cat /etc/centos-release
CentOS Linux release 7.5.1804 (Core)

리눅스 커널 버전 확인

$ uname -r
3.10.0-862.11.6.el7.x86_64

$ rpm -qa kernel
kernel-3.10.0-693.el7.x86_64
kernel-3.10.0-862.14.4.el7.x86_64
kernel-3.10.0-693.21.1.el7.x86_64
kernel-3.10.0-862.11.6.el7.x86_64

CentOS 6 에서 CentOS 7 으로의 주요 변화

주기적인 스크립트 실행: crontab

리눅스에는 cron 이라는 기본적인 작업 스케쥴러가 있다. 주기적으로 실행되어야 할 작업들이 있을 때 매우 유용한 도구이다. 스케쥴 수정은 crontab -e 명령으로 가능하다. 스케쥴을 수정한 이후 적용을 위해서는 /etc/init.d/crond restart 를 통해 데몬을 재시작 해주어야 한다.

그렇다면 cron 내용은 어떻게 써주어야 할까? 하나의 예제를 들어보자. 만약 매일 오전 2시 0분에 백업을 진행하고자 하는 경우에 아래와 같이 작성해주면 된다.

0 2 * * * /home/sukjun/scripts/backup.sh

다섯 개의 숫자는 순서대로 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-6)을 의미한다. 지정하면 지정된 조건에 맞는 시간에 작업이 실행되며, 매번 해당 단위 간격으로 수행되는 것을 원하면 * 를 입력하면 된다.

파일 옮길 때 심볼릭 링크를 유지하면서 복사하는 방법

scp 를 통해 파일들을 전송하면 symbolic link 가 일반 파일로 복사되는 단점이 있다. 두 번 복사되므로 시간낭비, 공간낭비다. 기본적으로 rsync 명령도 symbolic link 를 일반 파일처럼 전송하지만 옵션을 이용하여 symbolic link 를 유지시킬 수 있다.

$ rsync -avz -e ssh /src/dir user@remote_host:dst/dir

실제 사용 예제는 아래와 같다. 현재 위치에 있는 archive 라는 폴더를 목적지 서버의 /extdata1 라는 위치에 복사하는 경우이다.

$ rsync -avz -e ssh archive 198.76.23.13:/extdata1/

미러링을 위해서라면 원격지에서 지워진 파일도 그대로 목적지에서도 지우고 싶을 때가 있다. 그럴 때에는 --delete 옵션을 추가해서 cron 에 등록해 놓으면 된다.

$ rsync -avz --delete -e ssh {src} {dst}

클러스터 간 미러링을 하기 위해 사용했던 스크립트인 mirror.sh 의 내용은 다음과 같다. 이를 cron 에 적정한 주기를 두고 실행하도록 하면 두 서버의 내용이 동기화 된다.

#!/bin/bash

pubkey=$HOME/.ssh/id_rsa
src=lab@198.76.23.13:/home/lab/Sukjun
dst=/home/lab/Sukjun/mirrored
rsync -avz --delete -e "ssh -i $pubkey" $src $dst

자주 사용되는 rsync 의 옵션들이다.

멀티 코어를 활용하는 파일 압축: pigz

gzip 은 코어를 하나만 사용하기 때문에 큰 파일을 압축해야 할 때에 시간이 많이 필요하다. tar 아카이빙을 만들 때 pigz 을 이용하면 현재 존재하는 코어를 모두 다 활용하여 압축할 수 있다.

$ tar -cf - eclip | pigz > eclip.tar.gz

Northbridge Error (node 0): L3 ECC data cache error.

갑자기 터미널에 다음과 같은 에러 메시지가 나타났다. 원인은 보통 메모리 에러인 경우이다. 불량이 난 메모리를 교체하거나 제거해주면 정상 작동한다.

Message from syslogd@mirna1 at Feb 18 23:03:00 ...
 kernel: [Hardware Error]: MC4_STATUS[-|CE|MiscV|-|AddrV|CECC]: 0x9c514080001c017b

Message from syslogd@mirna1 at Feb 18 23:03:00 ...
 kernel: [Hardware Error]: Northbridge Error (node 0): L3 ECC data cache error.

Message from syslogd@mirna1 at Feb 18 23:03:00 ...
 kernel: [Hardware Error]: cache level: L3/GEN, tx: GEN, mem-tx: EV

폰트 설정

리눅스에서 Arial 폰트를 사용하기 위한 설정 방법이다. batik rasterizer 라는 래스터 이미지 변환 툴을 사용하여 svg 를 png 로 변환하는 작업에 많이 사용하고 있다. 기본적으로 리눅스에서는 Arial 폰트가 존재하지 않아서 래스터 이미지로 변환 시에 다른 글꼴로 바뀌어 변환되는 문제가 있다. 윈도우의 fonts 폴더에서 Arial 폰트 그룹들을 리눅스의 /usr/share/fonts/truetype 디렉토리에 넣는다.

혹시 그렇게 했는데도 되지 않는다면, svg 파일에서 <g font-family="Arial"> 라고 명시되었는지를 한번 확인해 보자.

.bash_profile, .bashrc

리눅스 시스템에 로그인 할 때에 .bash_profile 이 적용되고, 새로운 터미널 세션이 시작될 때에는 .bashrc 가 적용된다.

.bash_profile 의 내용을 바꾸었다면 다시 로그인 해야 정상적으로 적용이 되고, .bashrc 의 내용을 바꾸었다면 다시 로그인 하지 않고 그냥 세션만 종료했다가 다시 만들어주면 적용이 된다. 특히 screen 을 사용할 경우에는 세션만 나갔다가 다시 만들어주면 적용된다.

.bash_profile 의 내용을 살펴보면 아래와 같이 .bashrc 파일이 있으면 부르는 동작이 정의되어 있다.

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

‘Device or resource busy’ 로 지워지지 않는 파일 지우기

다음과 같이 Device or resource busy 상태로 인해 지워지지 않는 파일을 지우는 방법을 알아보려고 한다.

$ rm -rf .nfs000000010bbab7610000015b
rm: cannot remove ‘.nfs000000010bbab7610000015b’: Device or resource busy

실제로 내가 사용하고 있지도 않은 파일이라면 해당 파일이 연결되어 있는 프로세스 ID 를 확인해야 할 필요가 있다.

$ lsof .nfs000000010bbab7610000015b
COMMAND  PID  USER  FD   TYPE DEVICE SIZE/OFF       NODE NAME
python  6439 sonic mem    REG   0,43 50780000 4491753313 .nfs000000010bbab7610000015b

PID 가 6439 인 프로세스가 해당 파일을 점유하고 있으므로 지워지지 않았던 것이었다. 해당 프로세스를 종료해 준다.

$ sudo kill -9 6439

이 파일은 mount 시에 생성된 임시 파일이어서 자동으로 삭제가 되었다. 만약 파일이 계속 남아 있는 경우 rm 명령으로 다시 한번 삭제 시도를 하면 된다.