커맨드 라인 표기법: 터미널에 입력해야 하는 커맨드들은 $
로 시작하였다.
특별히 관리자 권한(root 계정)이 요구되는 명령에 대해서는 #
로 표기하였다.
또한 사용자 계정 및 현재 디렉토리를 표시해야 할 필요성이 있는 경우 전체 프롬프트 (예: [lab@master ~]$
) 를
모두 표시하기도 하였다. 이 외에 이러한 글자로 시작되지 않는 것들은 모두 터미널에서 나온 출력으로 보면 된다.
목차
- 사용자 계정 관리
- ls 명령어의 날짜 표시형식 바꾸기
- 명령어 또는 파일의 위치 확인
- awk 와 sort 조합하여 사용하기
- 파일 쉽게 찾기
- ulimit
- 프롬프트 색상 변경하기
- 시스템에 존재하는 CPU 개수 확인
- CentOS 배포판 버전 확인
- 주기적인 스크립트 실행: crontab
- 파일 옮길 때 심볼릭 링크를 유지하면서 복사하는 방법
- 멀티 코어를 활용하는 파일 압축: pigz
- Northbridge Error (node 0): L3 ECC data cache error.
- 폰트 설정
- .bash_profile, .bashrc
- ‘Device or resource busy’ 로 지워지지 않는 파일 지우기
사용자 계정 관리
현재 계정 목록 보기
$ 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
이러한 에러 메시지에 대한 원인은 다음의 두 가지 중 하나인 경우가 대부분이다.
- root 계정의 비밀번호를 설정해놓지 않았다.
/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
파일 쉽게 찾기
각 파일은 세 종류의 기준을 근거로 타임스탬프 값을 가지고 있다.
- access (atime): 파일의 내용을 마지막으로 읽은 시각
- change the status (ctime): 파일 내용 혹은 속성들이 마지막으로 수정된 시각
- modify (mtime): 파일의 내용이 마지막으로 수정된 시각
(오래된 파일들을 지우기 위해 알아보려고 할 때) 수정된 지 60일 보다 오래된 파일들을 찾는다.
$ find ./ -mtime +60
(최근에 수정된 파일들이 무엇이 있는지 알아보고자 할 때) 수정된 지 60일이 되지 않은 파일들을 찾는다.
$ find ./ -mtime -60
텍스트 파일만 찾기 위해서는 -iname
옵션을 이용한다.
$ find ./ -iname "*.txt"
그리고 디렉토리는 제외하고 파일만 찾기 위해서는 -type f
라고 지정해주면 된다.
$ find ./ -type f
ulimit
- ulimit 은 다음 파일에서 설정 가능하다:
/etc/security/limit.conf
- 설정된 ulimit의 확인:
ulimit -a
그렇다면, 새로운 설정값은 어떻게 해야 적용될까? 수정한 내용의 적용은 해당 유저가 새로운 접속을 시도하면 적용된다.
$ 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 으로의 주요 변화
- CentOS 7 은 기본 파일 시스템으로 XFS 를 채택하였다.
- Docker 를 지원하기 시작하였다.
- MySQL 은 완전이 빠지고 MariaDB 로 교체되었다.
- /bin, /sbin, /lib, /lib64 가 /usr/bin, /usr/sbin, /usr/lib, /usr/lib64 로 통합되었다.
- /bin, /sbin, /lib, /lib64는 호환을 위해 심볼릭 링크로 연결되어 있다.
주기적인 스크립트 실행: 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 의 옵션들이다.
-a
: archive 처럼 전송 (symbolic link 를 유지)-r
: recursive-v
: verbose-e ssh
: connection by ssh
멀티 코어를 활용하는 파일 압축: 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 명령으로 다시 한번 삭제 시도를 하면 된다.