journalctl 명령

journalctl 이란?

  • systemd의 서비스 로그를 확인할 수 있다.
  • systemd-journald.service에 의해서 systemd의 정보들을 분석한다.

journalctl 옵션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-a : 표시할 수 없는 문자가 있거나 매우 긴 경우에도 모든 Log 내용을 출력
-b : 마지막 부팅 후의 Log만 출력
-r : 최신항목이 먼저 표시되도록 역순으로 출력
-c : 커서가 지정한 저널의 위치부터 Log 표시를 시작
-f : 가장 최근 Log만 표시하고 새롭게 추가되는 Log는 계속 출력
-k : 커널 메시지만 출력 (dmesg랑 같음)
-q : 일반 사용자로 실행될 때 접근할 수 없는 시스템 저널에 관한 경고메시지를 표시하지 않음
-u : unit으로 systemctl list-units에서 출력되는 첫번째 항목
-p : 메시지의 우선순위로 log level을 의미
emerg=0, alert=1, crit=2, err=3, warning=4, notice=5, info=6, debug=7
-o : Log 출력 형식을 설정
short : 기본값으로 syslog파일의 형식과 동일하다. 한 행에 하나의 Log만 출력
short-iso : short와 비슷하지만 ISO 8601의 시간 형식으로 출력
short-precise : short와 비슷하지만 마이크로 초 단위로 시간 출력
short-monotonic : short와 비슷하지만 단조로운 시간 형식으로 출력
verbose : 전체 Log를 모두 자세하게 출력
export : Log내용을 내보낸다. (백업 및 전송에 적합한 바이너리 스트림으로 직렬화)
json : 한줄에 하나씩 JSON 데이터 구조로 형식화
json-pretty : JSON 데이터 구조로 형식화 하지만 여러줄로 형식을 지정하여 사람이 읽을 수 있게 한다.
json-see : JSON 데이터 구조로 형식화 하지만 Server-Sent Events에 적합한 형식으로 한다.
cat : 매우 간결한 출력을 생성하며 메타 데이터가 없고 Log만 표시하며 시간은 표시하지 않음
-l : 출력되는 Log의 필드를 줄일때 사용, 기본값은 전체 필드를 표시하여 사용자가 해당 필드를 붙이거나 자를 수 있도록 한다.
_UID= 33 : 33번 UID를 가진 프로세스에 대한 Log를 출력
--disk-usage : 저널 파일의 디스크 사용량을 표시 (압춘된 모든 더널 파일과 사용중인 저널 파일의 합계를 표시)

사용법

마지막 부팅 후 로그 보기

1
2
# 마지막 부팅 후 로그 보기
$ journalctl -b

오늘 날짜 로그 보기

1
# journalctl --since=today

특정 기간별 로그 보기

1
2
3
4
5
journalctl --since "2017-05-25 00:00:00" --until "2017-05-30 10:30:00"

journalctl --since "1 hour ago"

journalctl --since "2 days ago"

특정 서비스 로그 보기

-u 로 유니트 이름을 지정한다.

1
$ journalctl -u sshd

/etc/systemd/system/my_server.service 에 등록한 유니트

1
journalctl -u my_server.service

mysql 서비스의 로그 보기

1
sudo journalctl -u mysql

~$ journalctl -p err -u mysql

특정 이벤트 속성 조회

1
# journalctl -p crit

Error 로그 자세히 보기

1
journalctl -p err -o verbose
  1. 특정 서비스데몬 및 속성과 날짜 로그 보기

journalctl -u libvirtd –since=yesterday -p err

  1. 특정 이벤트 조회

journalctl /sbin/crond

  1. 밑에서부터 로그 보기

journalctl -f

journalctl -r -b

  1. UID 로 검색 (id)
    journalctl _UID=108

journalctl이 느릴때(btrfs)

  1. Log의 크기를 확인

journalctl –disk-usage

  1. 로그를 저장하는 파일 데이터베이스에 단편화를 확인

filefrag /var/log/journal//

  1. 단편화를 제거
1
# btrfs fi defrag -v -f -clzo /var/log/journal/*/* 

설정파일

/etc/systemd/journald.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse= -> journal log 파일의 최대 Size를 지정
#SystemKeepFree=
#SystemMaxFileSize=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month -> journal log 파일의 최대보관일수를 지정
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

– 참고 —

https://lascrea.tistory.com/70
https://www.loggly.com/ultimate-guide/using-journalctl/

Windows: net 관련 commands

Windows 10/11 에서 가끔 사용하는 net 명령을 정리했다.

interface 명령으로 포트 포워드

  • 포트 포워드: netsh interface

Port forward 보기

1
2
3
4
5
6
7
> netsh interface portproxy show v4tov4

Listen on ipv4: Connect to ipv4:

Address Port Address Port
--------------- ---------- --------------- ----------
0.0.0.0 2020 localhost 2020

Port 5000을 내부 IP 192.168.0.10의 포트 5555번으로 포워딩

1
> netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=192.**168**.0.10

wsl 쪽 호스트로 Port 5000을 내부포트 5555번으로 포워딩

1
> netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=(wsl hostname -I)

포트 포워드 삭제

1
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

방화벽

https://learn.microsoft.com/ko-kr/windows/security/operating-system-security/network-security/windows-firewall/configure-with-command-line?tabs=powershell

  • 방화벽 설정 켜기/끄기: netsh advfirewall set currentprofile state on/off
  • 방화벽 프로필 설정: netsh advfirewall show profile 또는 netsh advfirewall set currentprofile
  • 방화벽 규칙 관리: netsh advfirewall rule add/show/delete
  • 방화벽 설정 보기: netsh advfirewall show allprofile

모든 방화벽 프로파일 보기

1
> netsh advfirewall show allprofile 

방화벽에 TCP 5000 포트를 허용

1
> netsh advfirewall firewall add rule name="TCP/5000" protocol=TCP dir=in localport=5555 action=allow

TCP/5000 포트의 방화벽 보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> netsh advfirewall firewall show rule name="TCP/5000"

Rule Name: TCP/5000
----------------------------------------------------------------------
Enabled: Yes
Direction: In
Profiles: Domain,Private,Public
Grouping:
LocalIP: Any
RemoteIP: Any
Protocol: TCP
LocalPort: 5000
RemotePort: Any
Edge traversal: No
Action: Allow
Ok.

포트 포워드 삭제

1
2
3
4
5
# 포트 포워드 삭제
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

# 방화벽 삭제
netsh advfirewall firewall delete rule name="TCP/5000"

[Linux] ls, ps, find, grep, awk 명령

파일, 디렉토리의 크기

ls 옵션

  • -h, --human-readable : with -l and -s, print sizes like 1K 234M 2G etc.
1
ls -lh /home

파일, 디렉토리 전체 날짜

1
2
3
4
5
6
7
8
9
 ls --time-style=long-iso -al             
total 156
dr-xr-x--- 12 root root 4096 2022-05-06 13:22 .
drwxr-xr-x 18 root root 4096 2022-04-01 14:02 ..
-rw------- 1 root root 1201 2021-11-19 22:38 anaconda-ks.cfg
drwx------ 3 root root 4096 2022-03-31 12:01 .ansible
-rw-r--r-- 1 root root 804 2022-02-03 10:50 authorized_keys
-rw------- 1 root root 28346 2022-05-06 13:22 .bash_history
-rw-r--r-- 1 root root 18 2021-03-15 04:35 .bash_logout

오늘 생성한 파일

1
2
3
#  ls -al --time-style=+%D | grep `date +%D`
dr-xr-x--- 12 root root 4096 05/06/22 .
-rw------- 1 root root 28428 05/06/22 .bash_history

ps 명령

p는 사용자의 프로세스 PID, 명령어 등을 알 수 있다.

ps 명령어 출력 항목

이름 설명
USER (BSD)
UID (System V)
프로세스 소유자의 이름
PID 프로세스의 식별 번호
PPID 부모 프로세스의 PID
%CPU CPU 사용 비율의 추정치 (BSD)
%MEM Memory 사용 비율의 추정치(BSD)
VSZ K 단위 또는 페이지 단위의 가상 메모리 사용량
RSS 실제 메모리 사용량
TTY 프로세스와 연결된 터미널
S (System V)
STAT (BSD)
현재 프로세스의 상태 코드
TIME 총 CPU 사용 시간
COMMAND 프로세스의 실행 명령행
STIME 프로세스가 시작된 시간 혹은 날짜
C (System V)
CP (BSD)
짧은 기간 동안의 CPU 사용률
F 플래그
PRI 실제 실행 우선순위
NI nice 우선순위 번호

ps 명령 옵션:

옵션 설명
-A 모든 프로세스를 출력
a (BSD) 터미널과 연관된 프로세스를 출력, x 옵션과 같이 사용하여 모든 프로세스를 출력할 때 사용
-a 세션 리더를 제외하고 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력
-e 커널 프로세스를 제외한 모든 프로세스를 출력
-f 출력을 풀 포맷으로 표기 (유닉스 스타일). UID, PID , PPID 등이 함께 표시
-l(System V)
l (BSD)
출력을 긴 포맷으로 표기. 프로세스의 정보를 길게 보여주는 옵션으로 우선순위와 관련된 PRI 값과 NI 값을 확인
-o 출력 포맷을 지정
-M 64비트 프로세스들을 출력
-m 프로세스뿐만 아니라 커널 스레드도 출력
-p 특정 PID를 지정하여 출력
-r 현재 실행 중인 프로세스 출력
u (BSD) 프로세스의 소유자를 기준으로 출력
-u [사용자] 특정 사용자의 프로세스 정보를 출력, 사용자를 지정하지 않는다면 현재 사용자 기준으로 출력
x (BSD) 데몬 프로세스처럼 터미널에 종속되지 않은 프로세스를 출력
-x 로그인 상태에 있는 동안 아직 완료되지 않은 프로세스를 출력.
*유닉스 시스템은 사용자가 로그아웃한 뒤에도 임의의 프로세서가 계속 동작 가능 -> 해당 프로세서는 자신이 실행시킨 쉘이 없어도 계속 자신의 일을 수행하는 데 이 프로세스는 해당 옵션 없이는 확인이 불가능

모든 프로세스

프로세스 정보를 컬럼 UID PID PPID C STIME TTY TIME CMD 를 표시한다.

  • System V: -ef
  • BSD : aux

System V 계열 옵션을 사용한 모든 프로세스 보기

1
2
3
4
5
6
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar18 ? 00:00:10 /sbin/init
root 2 1 0 Mar18 ? 00:00:00 /init
root 8 2 0 Mar18 ? 00:00:00 plan9 --control-socket 7 --log-level 4 --server-fd 8 --pipe-fd 1
0 --log-truncate

BSD 계열 옵션을 사용한 모든 프로세스 보기

1
2
3
4
5
6
:~$ ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 22184 13372 ? Ss Mar18 0:10 /sbin/init
root 2 0.0 0.0 2776 1928 ? Sl Mar18 0:00 /init
root 8 0.0 0.0 2776 132 ? Sl Mar18 0:00 plan9 --control-socket 7 --log-level 4 --server-f
d 8 --pipe-fd 10 --log-truncate

프로세스의 긴 정보

  • -el : 모든 프로세스를 긴 정보 형식으로 출력: 한 F, S, PRI, NI 등 출력.
1
2
3
4
5
6
7
~$ ps -el |more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 5546 - ? 00:00:10 systemd
5 S 0 2 1 0 80 0 - 694 - ? 00:00:00 init-systemd(Ub
0 S 0 8 2 0 80 0 - 694 - ? 00:00:00 init
4 S 0 50 1 0 79 -1 - 26934 - ? 00:00:06 systemd-journal
4 S 0 76 1 0 80 0 - 6106 - ? 00:00:23 systemd-udevd

tty 정보

ps -t [tty 명] : 해당 tty의 프로세스 출력

tty는 로그인 사용자 사용하는 시스템 터미널의 번호이다. 보통 로그인시 tty 에 접속되어 로그인 쉘이 가동되어 터미널에 접속하게 되고 가상의 pseudo terminal 번호를 사용한다.

다음은 pts 3번에 접속한 결과

1
2
$ tty
/dev/pts/3

해당 3번 터미널의 프로세스를 출력

1
2
3
4
$ ps -t 3
PID TTY TIME CMD
517366 pts/3 00:00:00 bash
543401 pts/3 00:00:00 ps

PID

ps -p PID : 해당 PID의 프로세스 정보를 출력

1
2
3
4
5
6
7
$ ps -p 517366
PID TTY TIME CMD
517366 pts/3 00:00:00 bash

$ ps -p 1
PID TTY TIME CMD
1 ? 00:00:10 systemd

사용자 아이디

`ps -u [사용자명]: 사용자 아이디에 해당하는 프로세스 정보를 출력

1
2
3
4
5
6
7
8
9
10
$ ps -u root
PID TTY TIME CMD
1 ? 00:00:10 systemd
2 ? 00:00:00 init-systemd(Ub
8 ? 00:00:00 init
50 ? 00:00:06 systemd-journal
76 ? 00:00:23 systemd-udevd
146 ? 00:00:00 cron
154 ? 00:00:01 systemd-logind
157 ? 00:00:02 wsl-pro-service

Filtering

grep, awk, cut 등 명령과 조합해 사용

grep

grep : 특정 문자열 찾는 명령어

1
2
3
4
[ grep  주요 옵션 ]
-i 대소문자 구분하지않고 검색
-n 줄 번호를 함께 출력
-x 패턴과 단어 전체가 일치하는 라인 출력

특정 파일내에서 특정 단어 찾기

1
grep "찾을 문자열"  FileName

ps 명령에서 특정 문자열 찾기

1
ps -ef |grep python

BSD 형식의 ps 명령 결과에서 찾기

1
ps aux | grep python

grep 명령어는 로그에서 특정 문자열로 검색할때 자주 사용하기도함

단어의 대소문자 구분없이 단어찾기

1
grep -i  "찾을 문자열"  FileName

몇번째 줄에 단어가 포함되어 있는지 찾기

1
grep -n "찾을 문자열" FileName

cut 명령령

AWK

1
ps -u qkboo -f | grep python | awk '{print $2, $9}'

파일 이름, 크기만 나오게 awk 사용

1
ls -lh / | awk -v OFS='\t' '{print $5, $9}

Linux system commands 요약

사용자와 그룹

chown, chgrp

chown 명령어는 파일의 소유권을 바꿔줍니다. root 가 특정 사용자가 소유한 파일을 다른 사용자용으로 바꾸려고 할 때 유용하게 쓰입니다. 하지만, 일반 사용자는 자신이 소유한 파일조차도 소유권을 바꿀 수 없습니다.

1
# chown bozo \*.txt**

chgrp 명령어는 파일의 그룹 소유권을 바꿔줍니다. 이 명령어를 쓰려면 그 파일의 소유자이고 바꾸려는 그룹의 멤버여야 합니다(혹은 root 이거나).

chgrp –recursive dunderheads *.data

$PWD 디렉토리의 모든 하위 디렉토리(“recursive”에 의해)의

모든 “*.data” 파일들은 “dunderheads” 그룹이 그 소유권을 갖습니다.

useradd, userdel

관리자용 명령어인 useradd 는 시스템에 사용자 계정을 추가해 주고 그 사용자용으로 지정된 홈 디렉토리를 만들어 줍니다. useradd 와 쌍을 이루는 userdel 는 시스템에서 사용자 계정을 삭제해 주고 해당 파일들도 삭제해 줍니다.

참고: adduser

명령어는

useradd

의 동의어로서, 보통 useradd 를 가르키는 심볼릭 링크 파일입니다.

id

id 명령어는 현재 사용자의 실제 ID와 유효 사용자 ID, 그룹 ID를 보여줍니다. 내부 bash 변수인 $UID, $EUID, $GROUPS 와 짝을 이룹니다.

1
2
$ id
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)

현재 세션의 UID 출력

1
2
$ echo $UID
501

who

시스템에 현재 로그인해 있는 모든 사용자를 보여줍니다.

1
2
3
4
5
$ who
bozo tty1 Apr 27 17:45
bozo pts/0 Apr 27 17:46
bozo pts/1 Apr 27 17:47
bozo pts/2 Apr 27 17:49

-m 옵션을 주면 오직 현재 사용자에 대한 자세한 정보만을 보여줍니다. who am iwho The Man 처럼 who 에 아무 인자나 두 개 넘겨주면 who -m 이라고 한 것과 같습니다.

bash$ who -m
localhost.localdomain!bozo pts/2 Apr 27 17:49

whoamiwho -m 과 비슷하지만 사용자 이름만 보여줍니다.

bash$ whoami
bozo

w

로그인 되어 있는 사용자와 그 사용자와 관련된 모든 프로세스를 보여 줍니다. 이는 who 의 확장 버전인데, w 의 출력에 grep 으로 파이프를 걸어서 특정한 사용자나 프로세스를 찾을 수 있습니다.

bash$ w | grep startx
bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx

logname

현재 사용자의 로그인 이름을 /var/run/utmp 에서 찾아서 보여줍니다. 위에서 설명한 whoami 와 거의 동일한 명령어 입니다.

bash$ logname
bozo

bash$ whoami
bozo

그렇지만…

bash$ su
Password: ……

bash# whoami
root

bash# logname
bozo

su

다른 사용자 (Substitute User) 로 프로그램이나 스크립트를 실행 시킵니다. rjones 란 사용자로 쉘을 새롭게 시작하고 싶으면 su rjones 라고 하면 됩니다. 옵션 없이 su 만 실행시키면 기본적으로 root 로 받아들입니다.

users

로그인 하고 있는 모든 사용자를 보여줍니다. 이 명령어는 who -q 와 거의 비슷한 명령어입니다.

ac

사용자가 로그인 해 있던 시간을 /var/log/wtmp 에서 읽어서 보여줍니다. 이 명령어는 GNU 계정 유틸리티 (accounting utility) 중 하나입니다.

bash$ ac
total 68.08

last

사용자가 마지막으로 로그인 한 시간을 /var/log/wtmp 에서 읽어서 보여줍니다. 이 명령어는 외부에서 로그인 한 정보도 보여줄 수 있습니다.

groups

현재 사용자가 속해 있는 그룹을 보여줍니다. 내부 변수인 $GROUPS 에 해당하는 명령어이지만 숫자가 아닌 그룹 이름으로 보여줍니다.

bash$ groups
bozita cdrom cdwriter audio xgrp

bash$ echo $GROUPS
501

newgrp

로그아웃 없이 사용자의 그룹 ID를 변경하기. 이 명령어를 쓰면 새 그룹의 파일에 접근할 수 있게 됩니다. 사용자는 보통 동시에 여러 그룹의 멤버이기 때문에 이 명령어를 쓸 일은 별로 없습니다.

터미널 [Top]

tty

현재 사용자의 터미널 이름을 보여줍니다. 서로 다른 한텀, 엑스텀 윈도우는 서로 다른 터미널로 인식되는것에 주의하세요.

bash$ tty
/dev/pts/1

stty

터미널 세팅을 보여주거나 변경해 줍니다. 이 복잡한 명령어는 스크립트에서 쓰여 터미널 동작이나 출력하는 방법을 제어할 수 있습니다. info 페이지를 참고하고, 조심해서 공부하세요.

예제1. 지움 글자(erase character) 세팅하기

#!/bin/bash

erase.sh: “stty”로 입력시의 지움 글자(erase character)를 세트하기.

echo -n “이름이 뭐에요? “
read name # 아무 글자나 치고 지우려고 해보세요.
# 안 될 겁니다.
echo “이름이 $name 군요.”

stty erase ‘#’ # “hashmark” (#) 를 지움 글자로 세트.
echo -n “이름이 뭐죠? “
read name # 마지막에 친 글자를 # 으로 지워보세요.
echo “$name 가 당신 이름이군요.”

exit 0

예제2. 비밀스런 비밀번호: 터미널 에코 끄기

#!/bin/bash

echo
echo -n “비밀번호를 넣으세요 “
read passwd
echo “비밀번호는 $passwd 입니다.”
echo -n “누군가가 어깨 너머로 당신을 보고 있었다면, “
echo “당신의 비밀번호를 알아냈을 수도 있습니다.”

echo && echo # “and list”로 묶인 라인 피드 두 줄”

stty -echo # 화면 에코를 끕니다.

echo -n “비밀번호를 다시 넣으세요 “
read passwd
echo
echo “비밀번호는 $passwd 입니다.”
echo

stty echo # 화면 에코를 킵니다.

exit 0

stty 를 창조적으로 써서 사용자가 ENTER 를 안 눌러도 어떤 키를 눌렀는지를 알아낼 수 있습니다.

예제3. 키누름 알아내기

#!/bin/bash

keypress.sh: 키누름 알아내기(“hot keyboard”).

echo

old_tty_settings=$(stty -g) # 현재 세팅을 저장.
stty -icanon
Keypress=$(head -c1) # GNU 시스템이 아니라면
# $(dd bs=1 count=1 2> /dev/null)

echo
echo “\“”$Keypress”\“ 키가 눌렸습니다.”
echo

stty “$old_tty_settings” # 원래 세팅으로 복구.

Thanks, Stephane Chazelas.

exit 0

예제3. 참고.

터미널과 모드

터미널은 보통 캐노니컬 (canonical) 모드로 동작합니다. 사용자가 키를 누르면 그 터미널에서 실행중인 프로그램에게 즉시 전달되지 않고, 터미널 지역 버퍼가 키 누름을 저장하고 있다가 ENTER 를 눌렀을 때에 저장하고 있던 값들을 모두 전달하게 됩니다. 터미널에 기본적인 줄단위 편집기가 들어 있는 것과 비슷합니다.

bash$ stty -a
speed 9600 baud; rows 36; columns 96; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = ; eol2 = ;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;

isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt

캐노니컬 모드에서는 지역 터미널 줄단위 편집기용 특수키의 재정의가 가능합니다.

bash$ cat > filexxx
whaIfoo barhello world

bash$ cat filexxx
hello world
bash$
bash$ wc -c < file
13

터미널을 제어하는 프로세스는 사용자가 26번의 키를 눌렀음에도 오직13개의 문자(알파벳 12개, 뉴라인 한 개)만 받았습니다.

넌캐노니컬(“raw”) 모드에서는 누르는 모든 키 (ctl-H 같은 편집용 특수키도 포함) 가 제어 프로세스에게 즉시 전달됩니다.

bash 프롬프트는 icanon 옵션과 echo 옵션을 둘 다 꺼서 기본적인 줄 단위 편집을 더 정교하게 제어할 수 있게 합니다. 예를 들어, bash 프롬프트 상에서 ctl-A 을 누르면 ^A 가 터미널에 찍히지 않고 bash 가 \1 문자를 읽고 해석해서 커서를 줄 제일 처음으로 이동시켜 줍니다.

Stephane Chazelas

tset

터미널 세팅을 보여주거나 초기화 함. stty 보다 기능이 떨어집니다.

bash$ tset -r
Terminal type is xterm-xfree86.
Kill is control-U (^U).
Interrupt is control-C (^C).

setserial

시리얼 포트 매개변수를 세트하거나 보여줍니다. root 로 실행시켜야 하고 보통은 시스템 셋업 스크립트에서 찾을 수 있습니다.

# /etc/pcmcia/serial 스크립트에서 발췌:

IRQ=`setserial /dev/$DEVICE | sed -e ‘s/.*IRQ: //‘`
setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ

getty, agetty

터미널용 초기화 프로세스가 gettyagetty 를 써서 사용자의 로그인을 설정해 줍니다. 이 명령어들은 사용자의 쉘 스크립트에서 쓰이지 않기 때문에 쉘 스크립트에서 이런 기능을 쓰려면 stty 를 쓰기 바랍니다.

mesg

현재 사용자의 터미널에 대한 쓰기 접근을 제어합니다. 접근을 못하게 설정되면 네트워크에 있는 다른 사용자가 현재 터미널로 write 를 하지 못하게 해 줍니다.

작은 정보: 여러분이 텍스트 파일을 편집하고 있는데 갑자기 피자 주문 메세지가 뜨면 아주 짜증날 것입니다. 다중 사용자 네트워크에서는, 방해받기 싫을 때 여러분의 터미널에 대한 쓰기 접근을 막고 싶은 경우가 생길겁니다.

wall

write all” 의 앞글자를 따서 wall 이 된 이 명령어는 현재 로그인 되어 있는 모든 사용자에게 메세지를 날립니다. 원래는 유용한 시스템 관리자용 도구입니다. 예를 들어, 시스템에 문제가 생겨서 잠깐 동안 다운 시켜야 할 필요가 생겼을 때 모든 사용자들에게 경고를 할 수 있게 해 줍니다.

bash$ wall System going down for maintenance in 5 minutes!
Broadcast message from bozo (pts/1) Sun Jul 8 13:53:27 2001…

System going down for maintenance in 5 minutes!

참고: mesg 로 쓰기가 막혀있는 터미널은 wall 메세지를 받을 수 없습니다.

dmesg

시스템 부팅 메세지를 표준출력으로 보여 줍니다. 디버깅 할 때, 어떤 디바이스 드라이버가 설치됐는지 확인할 때, 사용중인 시스템 인터럽트가 무엇인지 확인할 때 편하게 쓸 수 있습니다. 스크립트에서 dmesg 의 출력을 grep 이나 sed, awk 로 파싱해서 쓸 수 있습니다.

정보및 통계 [Top]

uname

시스템 사양 (OS, 커널 버전등) 을 표준출력으로 보여줍니다. -a 옵션을 주면 시스템 정보를 아주 자세하게 보여주고, -s 옵션을 주면 OS 종류만 보여줍니다.

bash$ uname -a
Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST 2000 i686 unknown

bash$ uname -s
Linux

arch

시스템 아키텍쳐를 보여줍니다. uname -m 과 동일한 명령어입니다.

bash$ arch
i686

bash$ uname -m
i686

lastcomm

/var/account/pacct 파일에 저장돼 있는 이전 명령어들에 대한 정보를 알려줍니다. 옵션으로 명령어와 사용자 이름을 지정해 줄 수 있습니다. 이 명령어는 GNU 계정 유틸리티 (accounting utility) 중의 하나입니다.

lastlog

시스템의 모든 사용자가 마지막으로 로그인한 시간을 보여줍니다. 이 명령어는 /var/log/lastlog 파일을 참조합니다.

bash$ lastlog
root tty1 Fri Dec 7 18:43:21 -0700 2001
bin **Never logged in**
daemon **Never logged in**

bozo tty1 Sat Dec 8 21:14:29 -0700 2001

bash$ lastlog | grep root
root tty1 Fri Dec 7 18:43:21 -0700 2001

경 고

/var/log/lastlog 파일에 읽기 퍼미션이 없는 사용자가 이 명령어를 실행시키면 실패합니다.

lsof

현재 열려 있는 파일들을 보여줍니다. 이 명령어는 현재 열려 있는 모든 파일들에 대한 자세한 표와 각각의 파일에 대한 소유자, 크기, 관련 프로세스등의 정보를 보여 줍니다. 당연히, lsof 의 출력은 파이프를 통해 grepawk 로 넘겨서 파싱해서 분석할 수 있습니다.

bash$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root mem REG 3,5 30748 30303 /sbin/init
init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so
init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so
cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr

strace

시스템 콜과 시그널을 추적해서 진단하고 디버깅해 주는 도구입니다. 가장 간단하게 실행시키는 방법은 strace COMMAND 라고 치는 것입니다.

bash$ strace df
execve(“/bin/df”, [“df”], [/* 45 vars */]) = 0
uname({sys=”Linux”, node=”bozo.localdomain”, …}) = 0
brk(0) = 0x804f5e4 …

이 명령어는 리눅스에서의 truss 입니다.

free

메모리와 캐쉬 사용량을 탭이 들어간 형태로 보여줍니다. 이 명령어의 출력은 grep 이나, awk, Perl 을 써서 파싱하기에 알맞은 형태입니다. procinfo 명령어는 free가 보여주는 정보 이외에 더 많은 정보도 보여줍니다.

bash$ free
total used free shared buffers cached
Mem: 30504 28624 1880 15820 1608 16376
-/+ buffers/cache: 10640 19864
Swap: 68540 3128 65412

사용하지 않는 램 용량을 보려면:

bash$ free | grep Mem | awk ‘{ print $4 }’
1880

procinfo

/proc 가상 파일시스템에서 여러 정보와 통계를 뽑아내서 광범위하고 자세하게 보여 줍니다.

bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829

lsdev

설치된 하드웨어 디바이스의 목록을 보여줍니다.

bash$ lsdev
Device DMA IRQ I/O Ports

cascade 4 2
dma 0080-008f
dma1 0000-001f
dma2 00c0-00df
fpu 00f0-00ff
ide0 14 01f0-01f7 03f6-03f6

du

디스크의 파일 사용량을 재귀적으로 보여줍니다. 특별히 지정하지 않으면 현재 디렉토리에 대해서 동작합니다.

bash$ du -ach
1.0k ./wi.sh
1.0k ./tst.sh
1.0k ./random.file
6.0k .
6.0k total

df

파일시스템 사용량을 탭이 들어간 형태로 보여 줍니다.

bash$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 273262 92607 166547 36% /
/dev/hda8 222525 123951 87085 59% /home
/dev/hda7 1408796 1075744 261488 80% /usr

stat

주어진 파일 (디렉토리나 디바이스 파일도) 에 대해서 자세한 통계 (statistics) 를 알려줍니다.

bash$ stat test.cru
File: “test.cru”
Size: 49970 Allocated Blocks: 100 Filetype: Regular File
Mode: (0664/-rw-rw-r–) Uid: ( 501/ bozo) Gid: ( 501/ bozo)
Device: 3,8 Inode: 18185 Links: 1
Access: Sat Jun 2 16:40:24 2001
Modify: Sat Jun 2 16:40:24 2001
Change: Sat Jun 2 16:40:24 2001

존재하지 않는 파일에 대해서 stat 을 실행시키면 에러 메세지를 냅니다.

bash$ stat nonexistent-file
nonexistent-file: No such file or directory

vmstat

가상 메모리 (virtual memory) 통계 (statistics) 를 보여 줍니다.

bash$ vmstat
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89

netstat

라우팅 테이블이나 활성화되어 있는 네트워크 연결같은 네트워크 통계와 정보를 보여 줍니다. 이 유틸리티는 /proc/net 에서 정보를 얻어 옵니다.

uptime

시스템이 얼마나 오랫동안 돌고 있었는지 관련 통계와 함께 보여줍니다.

bash$ uptime
10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27

hostname

시스템의 호스트명을 보여줍니다. 이 명령어는 /etc/rc.d 에 들어 있는 셋업 스크립트에서 호스트명을 설정해 줍니다 (/etc/rc.d/rc.sysinit 이나 비슷한 스크립트). uname -n 과 동일한 명령어이고 내부 변수인 $HOSTNAME 과 연관이 있습니다.

bash$ hostname
localhost.localdomain

bash$ echo $HOSTNAME
localhost.localdomain

hostid

호스트 머신에 대한 32비트 16진수 구분자를 에코해 줍니다.

bash$ hostid
7f0100

참고: 이 명령어는 특정 시스템에 대해 “유일한” (unique) 시리얼 숫자를 구해줍니다. 몇몇 상업용 제품의 등록 과정에서 이 숫자를 이용해 사용자 라이센스를 만들어 냅니다. 하지만 불행하게도 hostid 는 오직 네트워크 주소를 두 바이트 단위로 뒤집어 16진수로 리턴해 줍니다.

네트워크에 물리지 않은 리눅스 머신의 전형적인 네트워크 주소는 /etc/hosts 에서 알아낼 수 있습니다.

bash$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost

공교롭게도 127.0.0.1 을 두 바이트 단위로 뒤집으면 0.127.1.0 이 되고 이를 16진수로 변환하면 007f0100 이 되는데 이는 위에서 살펴본 hostid 가 리턴하는 값과 정확히 일치합니다. 결국 동일한 hostid 를 갖는 리눅스 머신이 수 백만 개가 존재하게 되는 것입니다.

시스템 로그 [Top]

logger

사용자가 만들어낸 메세지를 시스템 로그 (/var/log/messages) 에 추가 시킵니다. 이 명령어는 일반 사용자도 쓸 수 있습니다.

logger Experiencing instability in network connection at 23:10, 05/21.

자, 이제 ‘tail /var/log/messages’ 라고 해 보세요.

스크립트에 logger 명령어를 넣어서 디버깅 정보를 /var/log/messages 에 쓸 수 있습니다.

logger -t $0 -i Logging at line “$LINENO”.

“-t” 옵션은 logger 엔트리용 태그를 지정합니다.

“-i” 옵션은 프로세스 ID를 지정합니다.

tail /var/log/message

Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.

logrotate

이 유틸리티는 시스템 로그 파일들을 적당하게 로테이트 시키고, 압축하고, 지우고, 메일을 보내는 일들을 처리해 줍니다. 보통 crondlogrotate 를 가장 기본적인 하루 일과로 삼습니다.

/etc/logrotate.conf 에 적당한 내용을 적어주면 시스템 전체 로그뿐만 아니라 개인용 로그 파일을 관리할 수 있습니다.

작업 제어 [Top]

ps

프로세스 통계 (Process Statistics) 로 현재 실행중인 프로세스들을 사용자PID (프로세스 아이디) 에 의해서 보여 줍니다. 보통은 ax 옵션을 줘서 부르고, grep 이나 sed 로 파이프를 걸어서 특정 프로세스를 찾습니다.

bash$ ** ps ax | grep sendmail**
295 ? S 0:00 sendmail: accepting connections on port 25

pstree

현재 실행중인 프로세스를 “나무” (tree) 형태로 보여 줍니다. -p 옵션을 주면 프로세스 이름뿐만 아니라 PID 까지 보여 줍니다.

top

CPU 를 집중적으로 사용하는 프로세스를 중심으로 최신 정보를 계속 보여줍니다. -b 옵션은 결과를 텍스트 모드로 보여주기 때문에 파싱을 하거나 스크립트에서 접근할 수가 있습니다.

bash$ top -b
8:30pm up 3 min, 3 users, load average: 0.49, 0.32, 0.13
45 processes: 44 sleeping, 1 running, 0 zombie, 0 stopped
CPU states: 13.6% user, 7.3% system, 0.0% nice, 78.9% idle
Mem: 78396K av, 65468K used, 12928K free, 0K shrd, 2352K buff
Swap: 157208K av, 0K used, 157208K free 37244K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
848 bozo 17 0 996 996 800 R 5.6 1.2 0:00 top
1 root 8 0 512 512 444 S 0.0 0.6 0:04 init
2 root 9 0 0 0 0 SW 0.0 0.0 0:00 keventd

nice

백그라운드 작업의 우선순위를 바꿔줍니다. 우선순위는 19 (제일 낮음) 에서 -20 (제일 높음) 까지 인데, 오직 root 만이 음수(높은) 우선순위를 줄 수 있습니다. 관련 명령어로는 renice, snice, skill 이 있습니다.

nohup

사용자가 로그 아웃을 하더라고 명령어가 계속 돌게 해 줍니다. 명령어에 & 를 붙여 실행하지 않으면 포그라운드로 실행이 될 것입니다. nohup 을 스크립트에서 쓸 때는, 고아 프로세스나 좀비 프로세스가 생기지 않도록 wait 와 같이 써야 합니다.

pidof

실행중인 작업의 프로세스 ID (pid) 를 식별해 줍니다. kill 이나 renice 같은 작업 제어 명령어들은 프로세스 이름이 아니라 pid 에 대해 동작하기 때문에 종종 pid 로 구분할 필요가 생깁니다. pidof 명령어는 내부 변수인 $PPID 와 거의 쌍을 이룹니다.

bash$ pidof xclock
880

예제4. pidof 로 프로세스를 죽이기

#!/bin/bash

kill-process.sh

NOPROCESS=2

process=xxxyyyzzz # 존재하지 않는 프로세스를 가지고,

그냥 데모용임…

… 실제로 돌고 있는 어떤 프로세스도 죽이려고 하는게 아니니까.

하지만, 예를 들어 인터넷에서 로그오프하고 싶다면

#+ process=pppd
#+ 됩니다.

t=`pidof $process` # $process의 pid(프로세스 ID)를 찾고,

‘kill’은 프로그램 이름이 아니라 pid를 쓰기 때문에

if [ -z “$t” ] # 해당 프로세스가 없다면 ‘pidof’는 널을 리턴함.
then
echo “$process 는 현재 실행중이 아니므로 그냥 종료합니다.”
exit $NOPROCESS
fi

kill $t # 잘 죽지 않는 프로세스라면 ‘kill -9’라고 해야 할지도 모릅니다.

죽지 않게 돼 있는 프로세스일수도 있기 때문에

다시 한 번 “ t=`pidof $process` “ 로 확인해 볼 필요가 있습니다.

위 전체 스크립트는

kill $(pidof -x process_name)

이라고 할 수도 있겠으나 그러면 교육적이지는 않은것 같군요.

exit 0

fuser

어떤 파일이나, 파일 집합, 디렉토리에 접근하고 있는 프로세스를 PID 로 식별해 줍니다. -k 옵션을 쓰면 해당 프로세스를 죽일 수 있습니다. 이 명령어는 시스템 보안 차원에서 아주 흥미로운 구현인데 주로 스크립트에서 쓰여 시스템 서비스에 대해 허가 받지 않은 사용자의 접근을 막는 용도로 쓰입니다.

crond

시스템 관리용 스케쥴러 프로그램으로서, 시스템 로그 파일을 정리하고 지운다거나 slocate 데이타 베이스를 업데이트 하는 등의 일을 해 줍니다. atroot 사용자 버전용 명령어 입니다 (물론, 각 사용자는 crontab 명령어를 써서 자신만의 crontab 파일을 가질 수도 있습니다). 데몬 으로 돌면서 /etc/crontab 의 내용들을 스케쥴에 따라 실행시켜 줍니다.

프로세스 제어및 부팅 [Top]

init

init 명령어는 모든 프로세스의 부모 프로세스로서, 시스템 부팅 과정의 제일 마지막에 불리면서 /etc/inittab 을 읽어서 시스템의 런레벨을 결정합니다. 오직 root 만이 별명인 telinit 으로 부를 수 있습니다.

telinit

init 를 가르키는 심볼릭링크로서, 시스템 런레벨을 바꿀 때 쓰는데 보통은 시스템 관리나 긴급하게 파일 시스템을 수리해야 할 때 씁니다. 오직 root 만 이 명령어를 쓸 수 있습니다. 이 명령어는 아주 위험하기 때문에 쓰기 전에 이 명령어를 잘 이해하고 있어야 합니다!

runlevel

현재와 바로 전의 런레벨을, 시스템이 정지 상태인지(런레벨 0), 단일 사용자 모드인지(1), 다중 사용자 모드인지(23), X 윈도우 모드인지(5), 리부팅 중인지(6)등으로 보여 줍니다. 이 명령어는 /var/run/utmp 파일을 통해 정보를 얻어 옵니다.

halt, shutdown, reboot

보통 시스템 전원을 끄기 전에 시스템을 정지시키는 명령어들 입니다.

네트워크 [Top]

ifconfig

네트워크 인터페이스 설정 및 튜닝 유틸리티로서 이 명령어는 부팅시 인터페이스를 설정할 때나 리부팅때 인터페이스를 내리기 위해 쓰입니다.

# /etc/rc.d/init.d/network 의 일부분

네트워킹이 가능한지 확인.

[ ${NETWORKING} = “no” ] && exit 0

[ -x /sbin/ifconfig ] || exit 0

for i in $interfaces ; do
if ifconfig $i 2>/dev/null | grep -q “UP” >/dev/null 2>&1 ; then
action “Shutting down interface $i: “ ./ifdown $i boot
fi

“grep”의 GNU 전용인 “-q” 옵션은 “quiet”를 뜻하고, 어떤 출력도 하지 않게 합니다.

따라서 출력을 /dev/null 로 재지향 하는 것이 꼭 필요하지 않습니다.

echo “현재 동작중인 디바이스:”
echo `/sbin/ifconfig | grep ^[a-z] | awk ‘{print $1}’`

^^^^^ globbing 을 막기 위해 쿼우트 시켜야 합니다.

다음도 역시 동작합니다.

echo $(/sbin/ifconfig | awk ‘/^[a-z]/ { print $1 })’

echo $(/sbin/ifconfig | sed -e ‘s/ .*//‘)

S.C.가 주석을 더 넣어 줬습니다. 고마워요.

route

커널 라우팅 테이블 정보를 보거나 바꿀 수 있게 해 줍니다.

bash$ route
Destination Gateway Genmask Flags MSS Window irtt Iface
pm3-67.bozosisp * 255.255.255.255 UH 40 0 0 ppp0
127.0.0.0 * 255.0.0.0 U 40 0 0 lo
default pm3-67.bozosisp 0.0.0.0 UG 40 0 0 ppp0

chkconfig

네트워크 설정을 체크해줍니다. 이 명령어는 /etc/rc?.d 디렉토리에 들어있고 부팅시 시작되는 네트워크 서비스들을 보여주고 관리해 줍니다.

원래는 IRIX 에 있던 것을 레드햇 리눅스가 포팅한 것으로 다른 리눅스 배포판에서는 기본 설치에 속하지 않을 수도 있습니다.

bash$ chkconfig –list
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rwhod 0:off 1:off 2:off 3:off 4:off 5:off 6:off

tcpdump

네트워크 패킷 “스니퍼” 로서. 주어진 기준에 맞는 패킷 헤더의 덤프를 떠서 네트워크 트래픽을 분석하고 문제점을 해결할 수 있게 해 줍니다.

bozovillecaduceus 두 호스트간의 IP 패킷 트래픽을 덤프:

bash$ tcpdump ip host bozoville and caduceus

당연히 tcpdump 의 출력은 앞에서 논의했던 텍스트 처리 유틸리티들을 이용해서 파싱할 수가 있습니다.

파일시스템 [Top]

mount

파일시스템을 마운트해 줍니다. 보통은 플로피나 시디롬 같은 외부 디바이스에 대해서 쓰입니다. /etc/fstab 에 가능한 파일시스템이나 파티션, 디바이스, 옵션등을 적어 놓으면 자동이나 수동으로 마운트를 편하게 할 수 있습니다. /etc/mtab 파일은 /proc 같은 가상 파일시스템도 포함해서 현재 마운트 되어 있는 파일 시스템을 보여 줍니다.

mount -a/etc/fstab 에 들어 있는 파일 시스템과 파티션중에 noauto 옵션이 있는 항목만 빼고 모두 마운트 해 줍니다. 부팅될 때, 모든 파티션이 마운트 되도록 /etc/rc.d 디렉토리에 들어 있는 시스템 구동 스크립트 (rc.sysinit 이나 비슷한 것) 에서 이 명령어를 부릅니다.

mount -t iso9660 /dev/cdrom /mnt/cdrom

CDROM 마운트

mount /mnt/cdrom

/mnt/cdrom 이 /etc/fstab 에 들어 있을 경우 짧게 부르기

이 다재다능한 명령어는 보통 파일을 블럭 디바이스에 존재하는 파일 시스템처럼 마운트 할 수도 있습니다. 이런 능력은 루프백 디바이스 (loopback device) 라고 하는 파일을 이용해서 가능해 집니다. 이 루프백 디바이스를 적용한 예로서, ISO9660 이미지를 CDR 로 굽기 전에 마운트해서 테스트 해보는 것이 있습니다.

예제5. CD 이미지 확인하기

# 루트로…

mkdir /mnt/cdtest # 마운트 포인트가 없다면 준비함.

mount -r -t iso9660 -o loop cd-image.iso /mnt/cdtest # 이미지 마운트.

“-o loop” 옵션은 “losetup /dev/loop0” 와 같음.

cd /mnt/cdtest # 이제 이미지를 확인.
ls -alR # 이미지에 들어있는 디렉토리 트리에 들어 있는 파일들을 나열.
# 기타 등등…

umount

현재 마운트 되어 있는 파일 시스템을 언마운트 해 줍니다. 이미 마운트 되어 있는 플로피나 시디롬 디스크를 빼기 전에 꼭 umount 를 해 줘야 합니다. 안 그러면 파일 시스템이 깨질 수도 있습니다.

umount /mnt/cdrom

이제 이젝트 버튼을 눌러 디스크를 안전하게 뺄 수 있습니다.

참고: automount 유틸리티가 적절하게 설치되어 있다면 플로피나 시디롬 디스크에 접근시나 제거시에 자동으로 마운트와 언마운트를 할 수 있습니다. 플로피나 시디롬 드라이브를 꼈다 뺐다 할 수 있는 랩탑에서는 문제를 일으킬 수도 있습니다.

sync

버퍼에 들어 있는 최신 데이타를 하드 드라이브로 즉시 쓰게 합니다(버퍼와 드라이브를 동기화). 이 명령어가 꼭 필요한 것은 아니지만 시스템 관리자나 사용자에게 자신들이 변경한 데이타가 갑작스런 전원 이상에도 살아남을 수 있게 해 줍니다. 예전에는 sync; sync (아주 확실히 하기 위해서 두 번 내림) 라고 해서 시스템을 리부팅하기 전의 유용한 예방책으로 쓰였습니다.

파일을 안전하게 지우거나 천장의 전등이 깜빡이기 시작했을 때 버퍼를 즉시 플러쉬시키고 싶을 때가 있을지도 모릅니다.

losetup

루프백 디바이스 를 설정해 줍니다.

예제6. 한 파일에서 한번에 파일 시스템 만들기

SIZE=1000000 # 1 meg

head -c $SIZE < /dev/zero > file # 지정된 크기로 파일을 설정.
losetup /dev/loop0 file # 루프백 디바이스로 설정.
mke2fs /dev/loop0 # 파일 시스템 만들기.
mount -o loop /dev/loop0 /mnt # 마운트.

Thanks, S.C.

mkswap

스왑 파티션이나 스왑 파일을 만들어 줍니다. 이 명령어 다음에는 꼭 swapon 으로 활성화를 시켜줘야 합니다.

swapon, swapoff

스왑 파티션이나 스왑 파일을 활성화/비활성화 시켜 줍니다. 이 명령어는 보통 부팅시나 셧다운시에 효력을 갖습니다.

mke2fs

리눅스 ext2 파일시스템을 만들어 줍니다. 이 명령어는 root 로 실행 시켜야 합니다.

예제7. 새 하드 드라이브 추가하기

#!/bin/bash

시스템에 두 번째 하드 드라이브 추가하기.

소프트웨어 설정. 하드웨어가 이미 마운트돼 있다고 가정함.

본 문서의 저자가 “Linux Gazett”, http://www.linuxgazette.com, 38호에

쓴 기사에서 발췌.

ROOT_UID=0 # 이 스크립트는 루트로 실행 시켜야 됩니다.
E_NOTROOT=67 # root 가 아닌 경우의 종료 에러.

if [ “$UID” -ne “$ROOT_UID” ]
then
echo “이 스크립트는 루트만 실행시킬 수 있습니다.”
exit $E_NOTROOT
fi

이 스크립트는 정말 주의해서 쓰기 바랍니다!

만약 무언가가 잘못된다면 여러분의 파일 시스템을 홀라당 날려먹을 수 있습니다.

NEWDISK=/dev/hdb # /dev/hdb 가 비어 있다고 가정함. 꼭 확인해 볼 것!
MOUNTPOINT=/mnt/newdisk # 아니면 다른 마운트 포인트 지정.

fdisk $NEWDISK
mke2fs -cv $NEWDISK1 # 배드 블럭 확인및 자세한 출력.

주의: /dev/hdb 가 *아니라* /dev/hdb1 입니다!

mkdir $MOUNTPOINT
chmod 777 $MOUNTPOINT # 새 드라이브는 모든 사용자가 접근할 수 있도록 함.

자, 테스트를 해 보죠.

mount -t ext2 /dev/hdb1 /mnt/newdisk

디렉토리를 만들어 보고 잘 된다면 umount 한 다음 하던 일을 계속하면 됩니다.

마지막 단계:

다음을 /etc/fstab 에 추가해 주세요.

/dev/hdb1 /mnt/newdisk ext2 defaults 1 1

exit 0

tune2fs

ext2 파일 시스템을 튜닝해 줍니다. 최대 마운트 숫자같은 파일 시스템 매개변수를 바꾸는데 쓰일 수 있습니다. root 로 실행해야 됩니다.

주 의

이 명령어는 굉장히 위험합니다. 부주의하게 쓴다면 여러분 파일 시스템을 박살낼 수도 있기 때문에 여러분 스스로 책임을 지고 써야 합니다.

dumpe2fs

아주 자세한 파일 시스템 정보를 표준출력으로 덤프해 줍니다. root 로 실행되야 합니다.

root# dumpe2fs /dev/hda7 | grep ‘ount count’
dumpe2fs 1.19, 13-Jul-2000 for EXT2 FS 0.5b, 95/08/09
Mount count: 6
Maximum mount count: 20

hdparm

하드 디스크 매개변수를 보여주거나 바꿀 수 있습니다. root 로 실행시켜야 되고 잘못 쓸 경우 위험할 수 있습니다.

fdisk

보통은 하드 드라이브일, 저장용 디바이스에 대해서 파티션 테이블을 만들고 변경할 수 있게 해 줍니다. root 로 실행해야 됩니다.

주 의

이 명령어는 아주 조심해서 써야 됩니다. 만약에 뭔가가 잘못되면 여러분의 파일 시스템을 망가트릴 수도 있습니다.

fsck, e2fsck, debugfs

파일 시스템 체크, 치료, 디버그용 명령어들 입니다.

fsck : 유닉스 파일 시스템을 체크해 주는 프론트 엔드 (front end) 로서 다른 유틸리티가 이 명령어를 부름니다. 실제로 체크할 파일 시스템 타입은 ext2 가 기본으로 잡혀 있습니다.

e2fsck : ext2 파일 시스템 체커.

debugfs : ext2 파일 시스템 디버거.

경 고

이 명령어들은 root 로 실행시켜야 합니다. 잘못 쓰면 파일 시스템이 손상되거나 망가질 수도 있습니다.

badblocks

저장용 디바이스에 대해 배드 블럭 (미디어의 물리적인 결함) 을 체크해 줍니다. 새 하드 드라이브를 설치하고 포맷할 때나 백업 미디어의 무결성을 테스트 해보려고 할 때 쓸 수 있습니다. 예를 들어 badblocks /dev/fd0 라고 하면 플로피 디스크를 테스트해 줍니다.

badblocks 명령어는 모든 데이타를 다 덮어써버리도록 불릴 수도 있고 읽기 전용 모드로 안전하게 불릴 수도 있습니다. root 사용자가 테스트할 디바이스를 소유하고 있다면, 보통 그런 상황일테지만, root 가 이 명령어를 실행시켜야 합니다.

mkbootdisk

예를 들어 MBR (master boot record) 이 깨진 상황등에서 시스템을 다시 살릴 수 있도록 부팅 디스켓을 만들어 줍니다. mkbootdisk 는 실제로는 Erik Troan 이 만든 Bash 스크립트/sbin 디렉토리에 들어 있습니다.

chroot

루트 디렉토리를 바꿔줍니다 (CHange ROOT directory). 명령어들은 보통 기본 루트 디렉토리인 / 를 기준으로 $PATH 에 따라 해석됩니다. 이 명령어는 이 루트 디렉토리를 다른 곳으로 바꾼다음 작업 디렉토리도 그 쪽으로 바꿔줍니다. 보안용으로 아주 유용한데, 예를 들면 시스템 관리자가 텔넷 으로 접속중인 사용자를 보안과 관련된 파일 시스템에 접근시키지 않으려 할 때에 사용할 수 있습니다 (가끔 guest 사용자를 “chroot 감옥” (chroot jail) 에 가둔다라고도 합니다). chroot 후에는 시스템 바이너리에 대한 실행 경로가 더 이상 맞지 않는 것에 주의하기 바랍니다.

chroot /opt 라고 하면 /usr/bin/opt/usr/bin 이라고 해석합니다. 비슷하게, 보통의 상황에서는 / 를 기본 디렉토리로 삼지만 chroot /aaa/bbb /bin/ls 라고 하면 그 후로 실행되는 ls/aaa/bbb 을 기본 디렉토리로 인식합니다. 사용자의 ~/.bashrcalias XX ‘chroot /aaa/bbb ls’ 라는 줄을 넣으면 그 사용자가 “XX” 를 실행 시키는 파일 시스템을 효과적으로 제한할 수 있습니다.

chroot 는 비상용 부트 플로피로 부팅했을 때 편하게 쓸 수 있고 (/dev/fd0chroot 걸기), 시스템이 박살나서 고치려고 할 때 lilo 에 옵션으로 줄 수도 있습니다. 또한 다른 파일 시스템을 통해서 설치를 할 경우나 (rpm 옵션), CDROM 같은 읽기 전용 파일 시스템에서 실행할 때 쓸 수 있습니다. 오직 root 사용자로 실행할 수 있으며, 조심해서 써야 합니다.

경 고

몇 개의 시스템 파일들은 chroot 된 디렉토리에 복사해 놓아야 $PATH 가 그들을 제대로 인식할 수 있습니다.

lockfile

이 유틸리티는 procmail 패키지 중의 하나입니다 (www.procmail.org). 이 명령어는 잠금 파일을 만들어 주는데, 잠금 파일이란 특정 파일이나 디바이스, 리소스에 대해서 접근 제어를 해주는 세마포어 파일입니다. 잠금 파일은 이 특정한 파일, 디바이스, 리소스를 특정 프로세스가 쓰고 있다(“busy”)는 플래그로 쓰여, 다른 프로세스에게 제한된 접근만을 허용하거나 아예 접근을 못하도록 만들어 줍니다.

잠금 파일은 여러 사용자에 의해 시스템 메일 폴더가 동시에 변경되는 것을 막아주고, 모뎀 포트가 사용중이라는 것을 알려주며, 넷스케이프가 캐쉬를 사용중이라는 것을 보여주는데 쓰일 수 있습니다. 스크립트에서 특정 프로세스가 만들어 놓은 잠금 파일이 있는지 확인해서 그 프로세스가 이미 떠 있는지 알아낼 수도 있습니다. 만약에 스크립트에서 이미 존재하는 잠금 파일을 다시 만들려고 한다면 그 스크립트는 멈춰 버릴 수도 있으니 조심하기 바랍니다.

보통의 어플리케이션들은 잠금 파일을 만들고 체크하는 기본 디렉토리를 /var/lock 으로 삼습니다. 다음 스크립트처럼 해서 잠금 파일이 있는지 없는지를 확인할 수 있습니다.

appname=xyzip

“xyzip” 어플리케이션은 “/var/lock/xyzip.lock” 란 잠금 파일을 만듭니다.

if [ -e “/var/lock/$appname.lock ]
then

mknod

블럭 디바이스나 문자 디바이스 파일을 만들어 줍니다 (예를 들면 하드웨어를 새로 설치할 경우에 필요하겠죠?).

tmpwatch

특정 기간동안 접근이 없는 파일을 자동으로 지워줍니다. 보통은 오래된 로그 파일을 지우기 위해 crond 에 걸어 놓고 씁니다.

MAKEDEV

디바이스 파일을 만들어 주는 유틸리티로서, root 로 실행시켜야 합니다. 이 명령어는 /dev 디렉토리에 있습니다.

root# ./MAKEDEV

이 명령어는 일종의 mknod 의 향상된 버전입니다.

백업 [Top]

dump, restore

dump 명령어는 복잡한 파일 시스템 백업 유틸리티로서 보통은 규모가 큰 설치와 네트워크에서 쓰입니다. 디스크 파티션을 있는 그대로 (raw) 읽고 바이너리 형태로 백업 파일을 만들어 냅니다. 백업 되는 파일들은 디스크나 테입 드라이브같은 다양한 저장 미디어로 저장됩니다. restore 명령어는 dump 로 백업된 파일들을 복구시켜 줍니다.

fdformat

플로피 디스크에 대해서 로우레벨 포맷을 해 줍니다.

시스템 리소스 [Top]

ulimit

시스템 리소스에 대해서 최대 한계 (upper limit) 를 지정해 줍니다. 보통 -f 옵션을 써서 쉘이 만들 수 있는 파일 크기를 제한 시킵니다 (ulimit -f 1000 이라고 하면 파일 크기를 1 메가로 잡아 줍니다). -t 옵션은 코어덤프 파일의 크기를 제한 시킵니다 (ulimit -c 0 이라고 하면 코어덤프를 생성시키지 않습니다). ulimit 값은 보통, /etc/profile 이나 ~/.bash_profile 에서 지정해 줍니다.

umask

사용자(User) 파일 생성 마스크(MASK)로서 사용자 각자의 기본 파일 속성을 제한해 줍니다. 사용자가 생성하는 모든 파일은 umask 로 지정된 속성의 영향을 받습니다. umask 로 넘겨준 값은 해당 파일 소유권을 꺼버립니다. 예를 들어, umask 022 는 새로 만들어 지는 파일이 최소한 755 소유권을 갖도록 해 줍니다 (777 NAND 022). 사용자는 당연히 나중에 그 파일의 속성을 chmod 로 바꿀 수 있습니다. 보통 umask 값을 설정할 때는 /etc/profile 이나 ~/.bash_profile 에서 합니다.

rdev

루트 디바이스, 스왑 영역, 비디오 모드에 대한 정보를 얻거나 변경. rdev 의 기능은 lilo 로 넘어갔지만 아직 램 디스크를 설정할 때는 유용합니다. 역시 잘못 쓰면 위험한 명령어입니다.

모듈 [Top]

lsmod

설치된 커널 모듈을 보여줍니다.

bash$ lsmod
Module Size Used by
autofs 9456 2 (autoclean)
opl3 11376 0
serial_cs 5456 0 (unused)
sb 34752 0
uart401 6384 0 [sb]
sound 58368 0 [opl3 sb uart401]
soundlow 464 0 [sound]
soundcore 2800 6 [sb sound]
ds 6448 2 [serial_cs]
i82365 22928 2
pcmcia_core 45984 0 [serial_cs ds i82365]

insmod

커널 모듈을 강제로 올립니다. root 로 실행해야 합니다.

modprobe

보통 시스템 구동 스크립트에서 자동으로 불리는 모듈 로더 입니다.

depmod

모듈간 의존 파일을 만들어 줍니다. 보통 시스템 구동 스크립트에서 불립니다.

기타 명령어들 [Top]

env

현재의 환경 변수, 혹은 그 값을 바꿔 프로그램이나 스크립트를 실행 시킵니다 (시스템 전체 환경은 건드리지 않습니다). [varname=xxx] 옵션을 주면 스크립트가 실행될 동안에만 환경 변수 varname 의 값을 바꿔줍니다. 아무 옵션도 안주면 현재 세팅되어 있는 모든 환경 변수를 보여줍니다.

참고: Bash본쉘에서 파생된 다른 쉘들에서는 단일 명령어 환경에서 변수를 설정하는 것이 가능합니다.

var1=value1 var2=value2 commandXXX

‘commandXXX’ 의 환경에서만 $var1 과 $var2 를 설정.

작은 정보: 스크립트의 첫번째 줄 (“**#!**” 가 있는 줄) 에 env 를 써서 경로를 모르는 쉘이나 명령어 해석기를 지정해 줄 수도 있습니다.

#! /usr/bin/env perl

print “펄이 어디에 있는지 몰라도\n”;
print “이 펄 스크립트는 잘 동작할 것입니다.\n”;

펄 실행 파일이 원하는 곳에 없을 수도 있기 때문에

이식성 있는 크로스 플랫폼용 스크립트에 아주 좋습니다.

Thanks, S.C.

ldd

실행 파일에 필요한 공유 라이브러리를 보여줍니다.

bash$ ldd /bin/ls
libc.so.6 => /lib/libc.so.6 (0x4000c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

strip

실행 가능한 바이너리 파일에서 디버깅용 심볼릭 참조 정보를 제거해 줍니다. 이 명령어를 쓰면 실행 파일의 크기는 작아지지만 디버깅은 할 수가 없습니다.

주로 Makefile 에서나 나오고 쉘 스크립트에서는 잘 쓰이지 않습니다.

nm

strip 되지 않은 컴파일된 바이너리에 들어 있는 심볼들을 보여줍니다.

rdist

리모트 분산 클라이언트: 리모트 서버에 있는 파일 시스템으로 동기화, 복사, 백업을 해 줍니다.

지금까지 배운 시스템 관리자용 명령어들에 대한 지식과 함께 간단한 시스템 스크립트를 하나 소개하겠습니다. killall 은 시스템 셧다운시에, 돌고 있는 프로세스를 멈추게 해 주는 프로세스로서, 짧으면서도 이해하기 쉬운 스크립트중의 하나입니다.

예제8. killall, /etc/rc.d/init.d 에서 인용

#!/bin/sh

–> “# –>” 표시는 본 문서의 저자가 붙인 주석입니다.

–> 여기서 소개하는 부분은

–> Miquel van Smoorenburg(miquels@drinkel.nl.mugnet.org)의

–> ‘rc’ 스크립트 패키지중의 일부입니다.

–> 이 스크립트는 레드햇 전용 스크립트인 것처럼 보이기 때문에

–> 다른 배포판에는 없을 수도 있습니다.

쓰이지 않으면서 실행중인 모든 서비스를 죽입니다(실제로 실행중인지를

확실히 확인하기 때문에 아무 서비스도 안 죽일 수 있습니다).

for i in /var/lock/subsys/*; do
# –> 표준 for/in 루프이나 “do” 가 같은 줄에 있기 때문에
# –> “;” 를 붙여줘야 됩니다.
# 스크립트가 실제로 있는지 확인.
[ ! -f $i ] && continue
# –> “and list”를 아주 잘 썼습니다. 다음처럼 해도 똑같습니다.
# –> if [ ! -f “$i” ]; then continue

# 서브시스템 이름을 알아냅니다.
subsys=${i#/var/lock/subsys/}
# --> 변수 이름 매칭인데 여기서는 파일 이름이 되겠죠.
# --> subsys=\`basename $i\` 와 완전히 똑같은 표현입니다.

# --> 잠금 파일의 이름을 알아내는데, 잠금 파일이 있다면
# --> 해당 프로세스가 실행중이라는 증거입니다.
# --> 앞에서 설명했던 "lockfile" 을 참고하세요.

# 그 서브시스템을 내립니다.
if \[ -f /etc/rc.d/init.d/$subsys.init \]; then
    /etc/rc.d/init.d/$subsys.init stop
else
    /etc/rc.d/init.d/$subsys stop
# --> 쉘 내장명령인 'stop'을 써서 돌고 있는 작업과 데몬을 중지시킵니다.
fi

done

출처 : http://www.viper.pe.kr/docs/linux\_syscmd.html

Window Host에서 WSL 서비스로 port forward 사용

윈도우에서 WSL2 사이에 port forward 를 통해서 WSL에서 사용중인 서비스에 접속하고 사용할 수 있다.

  • 원격에서 WSL2에 SSH서비스로 접근하고자 할 때
  • 원격에서 WSL2에 서비로 동작하는 django 등 서비스에 접근하고자 할 때

WSL2 에 포트 포워드

초기 WSL2 버전까지만 해도 WSl2의 IP로 직접 포트 포워딩을 하거나 VM의 IP를 변경해 사용하는데 왜그런지 최신 WSL2 의 VM IP 는 호스트의 네트워크 인터페이스에서 게스트 머신 WSL2의 IP 네트워크가 확인이 안된다.

예를 들어 윈도우의 ipconfig로 아래 처럼 가상머신 어뎁터가 나오지만 IP network 이 다르다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

이더넷 어댑터 vEthernet (Default Switch):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:c23a:366b:1078%47
IPv4 주소 . . . . . . . . . : 192.168.160.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

이더넷 어댑터 vEthernet (WSL (Hyper-V firewall)):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:2b1a:9d22:efc5%55
IPv4 주소 . . . . . . . . . : 172.18.80.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

WSL2의 게스트 머신과 윈도우 호스트 머신 사이의 라우팅을 담당하는 어뎁터가 172.18.80.1 이 WSL의 라우팅 포인트 같은데 실재 wsl 의 IP 는 다음 같이 나온다.

1
2
> wsl hostname -I
172.18.82.228

즉 호스트의 라우팅 테이블에서 알 수 없는 네트워크로 정의된다. 그래서 윈도우에서 직접 게스트 머신으로 라우팅이 안된다. 포트 포워딩시 WSL 게스트 머신의 IP를 직접 사용이 어렵다는 의미다.

게스트머신 IP로 ssh 접근은 된다. 그런데 port forwarding 에선 잘 안된다. 그런데 localhost 는 직접 게스트 머신의 포트에 접근이 가능하다. 그래서 localhost 를 사용하면 된다.

포트 포워드 스크립트

.ps1 파일에 아래 스크립트를 작성한다. WSL2 의 IP에 대해서,

  • 줄막음 처리한 것은 이전에 사용했던 방식이다. (어떤 버전인진 모르겠다)
  • 127.0.0.1 혹은 localhost 를 사용하면 된다.

스크립트

-

1
2
3
4
5
6
7
8
9
10
11
# `start_wsl2_portforward.ps1` 파일
$script = {
# netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=(wsl hostname -I)
# netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=(wsl hostname -I)
# portforward for Router
netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=127.0.0.1
netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=127.0.0.1
netsh advfirewall firewall add rule name="TCP/5000" protocol=TCP dir=in localport=5555 action=allow
netsh advfirewall firewall add rule name="TCP/2000" protocol=TCP dir=in localport=2222 action=allow
}
Start-Process -FilePath powershell.exe -ArgumentList "-Command & {$script run}" -verb RunAs

윈도우를 시작하고 Powershell 에서 이 스크립트를 실행하면 관리자 모드 허용을 받아 포트 포워드와 방화벽이 모두 업데이트 된다.

1
2
3
4
> start_wsl2_portforward.ps1

확인됨...

호스트의 포트 포워드 구성을 확인.

1
2
3
4
5
6
7
8
PS C:\Users\daddy> netsh interface portproxy show v4tov4

ipv4 수신 대기: ipv4에 연결:

주소 포트 주소 포트
--------------- ---------- --------------- ----------
0.0.0.0 2000 127.0.0.1 2222
0.0.0.0 5000 127.0.0.1 5555

호스트의 방화벽을 확인

1
> netsh advfirewall firewall show rule name="TCP/8686"

포워드 / 방화벽 구성 삭제

포드워와 방화벽을 삭제할 수 있다.

1
2
3
4
5
# 포트 포워드 삭제
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

# 방화벽 삭제
netsh advfirewall firewall delete rule name="TCP/5000"

Ubuntu 20.04 - Cheat sheet

Ubuntu 20.04 를 설치/운영하면서 필요한 팁/트릭과 쓸모있는 사용법을 정리한다.

비슷한 문서:

Timezone 관련

CLI에서 설정을 할 수 있다.

timedatectl timedatectl 명령으로

1
2
3
4
5
6
$ timedatectl list-timezones
...
Asia/Seoul
...

$ sudo timedatectl set-timezone Asia/Seoul

만약 손으로 수정을 한다면,

timedatectl 로 지정되는 설정 Timezone/etc/localtime 이라는 바이너리로 저장되므로
명령행에서 지원하는 timezone을 복사할 수 도 있다고 한다..

1
$ sudo cp /usr/share/zoneinfo/Europe/London /etc/localtime

LCD/Screen off

기존에 글 Ubuntu/시스템 전원관리, 2017년 에서 Ubuntu 18.x 에서 디스플레이(특히 노트북 LCD)를 끄기 위해서 사용되던 직접 vbetool 명령으로 동작하지 않는다.

그래서 Ubuntu 20.04 에서는 링크 ubuntu-20-04-on-a-laptop-is-there-any-way-toturn-off-the-screen 에 있는 방법으로 사용하고 있다.

디스플레이를 끄려면

1
2
3
sudo mount -o remount,exec /dev
sudo vbetool dpms off
sudo mount -o remount,noexec /dev

다시 디스플레이를 켜려면

1
2
3
sudo mount -o remount,exec /dev
sudo vbetool dpms on
sudo mount -o remount,noexec /dev

Network 상태 확인

ss 명령

ss 명령은 Socket Statistics 를 출력해 준다. open 된 소켓에 대한 정보를 표시한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ss [-a -t -u -l -p -n] [filter]

-a:
-t: TCP
-u: UDP
-l: LISTEN 상태 포트
-n: 호스트/포트/사용자 이름을 숫자로 표시
-p: 프로세스 이름
-r, --resolve: resolve host names
-w, --raw : display only RAW sockets
-x, --unix : display only Unix domain sockets
-4, --ipv4 : display only IP version 4 sockets
-6, --ipv6 : display only IP version 6 sockets
-m, --memory : show socket memory usage

LISTEN Port 확이

netstat 같이 LISTEN 상태 프로세스를 확인할 수 있다. 다음은 t: tcp 포트, l: LISTEN 상태의 소켓 정보를 출력한다.

1
2
3
4
5
6
7
8
9
10
$ ss -lntu
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
udp UNCONN 0 0 12.42.168.213%enp3s0:68 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 10 127.0.0.1:9000 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:53000 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:2020 0.0.0.0:*

IPv4, IPv6 소켓

1
2
3
4
5
6
7
8
9
$ ss -tl4
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
$
$ ss -tl6
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 [::]:2020 [::]:*
q

lsof

Linux에서 open file을 확인하는데 사용되는 lsof 명령입니다. Unix/Linux의 모든 것은 파일로 이루어져있기때문에 스트림이나 네트워크 파일도 lsof 로 확인할 수 있습니다.

1
2
$ lsof -i
$ lsof -l

Ubuntu/시스템 전원관리, 2017년

Docker CLI 요약

docker cli 명령을 정리

docker architecture 이미지 소스

비슷한 문서:

docker cli

docker cli는 docker 명령 뒤에 docker commands 로 도커를 제어한다. 그리고 대상 컨테이너를 지정하고 컨테이너에서 실행 할 수 있는 명령형식으로 구성되어 있다.

1
docker [docker commands] [container] [container command] 

Use the Docker command line docker

search 이미지 검색

Docker hub에서 이미지를 검색한다.

1
docker search busybox

Docker hub에서 상위 몇개 정도만 검색하고 싶을때 limit 옵션을 사용한다.

1
docker search busybox --limit 5

Docker hub에서는 이미지 중 별점을 검색한다.

1
2
3
4
5
# 최소 별정 50인 이미지
docker search busybox --filter=stars=50

# 별점이 3인 이미지
docker search --filter stars=50 busybox

정규 빌드 버전만 지시하려면 is-official 옵션 사용

1
2
docker search --filter is-official=true --filter stars=50 busybox

--format 옵션을 사용해 출력되는 내용을 필터링 할 수 있다. 다음은 별점만 출력하는 예이다.

1
docker search --format "{{.Name}}: {{.StarCount}}" nginx

pull 이미지를 다운로드 한다

Docker image를 내려 받는다. 이미지 이름 뒤에 :[version] 을 붙이면 지정한 버전을 내려 받고, latest 를 붙이면 최신 버전을 대상으로 한다.

1
docker pull nginx:latest

images 다운로드 이미지

Docker에서 다운로드 받는 이미지를 확인한다. docker images는 모든 이미지를 보여준다.

1
$ docker images

특정 이미지만 지시할 수 있다.

1
$ docker images nginx

run 이미지를 컨테이너로 실행한다.

Docker image를 컨테이너로 생성하고, 실행합니다.

1
docker run -p 8080:8080 nginx

옵션:

1
2
3
4
5
`-p`: Local과 Container 와 port를 연결하는 옵션
`-i`: interactive (대화방식)
`-t`: Pseudo-tty (콘솔 및 터미널 환경)
`— name`: 실행 컨테이너 이름을 지정합니다.
`-d`: 백그라운드에서 실행되는 옵션입니다.

docker image를 실행하고 bash 쉘을 연다.

1
docker run -i -t --name nginx nginx bash

ps 컨테이너 목록을 확인

Docker 컨테이너 목록을 확인합니다.

1
2
$ docker ps
$ docker ps -a

옵션:

1
2
`-a` : 실행 중이 아닌 컨테이너까지 확인
`-q` : 컨테이너의 CONTAINER ID 만 표시

start 컨테이너를 시작한다.

중단되어 있는 컨테이너를 실행합니다.

1
2
docker start nginx
nginx

attach 컨테이너 연결

실행중인 Docker Container 의 standard input, output, error streams 에 연결한다.

1
docker attach nginx

docker attach 명령 사용 사례.

exec 컨테이너 명령 실행

Docker Container의 쉘의 명령어을 실행할 수 있다.

1
docker exec nginx ls

옵션

1
2
3
4
5
-d, --detach : 명령을 detach mode, 백그라운드로 실행
-e, --env : 환경변수 설정하고 실행
-it [SHELL]: iteractive tty 옵션. 사용할 shell을 지시한다, 보통 bash
-u, --user: User ID, UID
-w, --workdir: 작업 디렉토리 지정

다음은 nginx 컨테이너의 bash 쉘을 실행한다.

1
docker exec -it nginx bash

다음은 nginx 컨테이너를 qkboo 사용자 쉘로 연결한다.

1
docker exec -it -u qkboo nginx bash

inspect 컨테이너 상세 정보

Docker Container에 상세 정보를 확인 한다.

1
docker inspect nginx

옵션

--format : 필터링

1
docker inspect  --format='{{range .NetworkSettings.Networks}}

logs 명령

Docker 컨테이너에서 sysout 또는 syserr 로그를 보려면 logs 명령을 사용한다.

docker logs

stop 컨테이너 종료

ps 명령으로 실행중인 컨테이너 아이디와 이름을 확인하고 아이디를 준다.

1
2
3
docker ps

docker stop e417951d25fd

이름으로 종료시 --name 옵션 사용

1
docker stop --name nginx2

rm 컨테이너를 삭제한다.

Docker Container 삭제합니다. 삭제할때는 실행 상태가 아닌 컨테이너만 가능합니다.

1
docker rm nginx

강제 삭제시 -f 옵션 사용.

rmi 이미지를 삭제한다.

Docker image를 삭제 하는데 이미지가 중첩된 경우가 많기 때문에 링크 같이 untag 한 후 사용한다.

1
2
3
docker rmi fd484f19954f

docker rmi test2:latest

혹은 -f 옵션으로 중첩된 이미지를 모두 함께 삭제 할 수 있다.

1
docker rmi -f fd484f19954f

참고

HTTPS 를 위한 Private SSL

Web server certificates 과정

Securing a web site with a server certificate 단계

  1. 비밀키를 생성한다.
  2. 비밀키로 CSR certificate siging requests 을 생성한다.
  3. CSR 을 CA 로 사인한다.
  4. 사인한 CERT 를 받고 설치한다.

1. 비밀키를 생성한다.

rsa 를 사용해 4096크기 비밀키를 생성한다.

1
2
3
4
5
# cd /etc/ssl/private 
# openssl genrsa -out my_rsa.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)

# chmod 0600 private/my_rsa.key
1
# chmod 0600 private/my_rsa.key

Public Key 생성

1
명령: openssl rsa -in [private key 파일명] -pubout -out [파일명]
1
# openssl rsa -in my_rsa.key -pubout -out my_rsa.pub 

2. Create a CSR(certificate signing request) from this key,

인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청서를 작성한다.

1
명령어 : openssl req -new -key [private key 파일명] -out [파일명]

비밀키에서 CSR 파일 작성을 요청하면 아래 내용을 묻는다.

1
# openssl req -new -sha256 -key ./my_rsa.key -out ./my_rsa.csr 
1
# openssl req -new -key private.key -out private.csr

인증서 발급을 위한 필요한 정보를 담고 있는 인증서 신청 형식 데이터 이다.

  • Country Name (국가코드) KR
  • State or Province Name (시/도의 전체이름) Seoul
  • Locality Name (시/군/구 등의 이름) Songpa-gu
  • Organization (회사이름) XXXX
  • Organization Unit (부서명) Server
  • Common Name (SSL 인증서를 설치할 서버의 Full Domain) www.xxxx.com
      • Common Name 에는 인증서를 설치할 사이트의 도메인의 이름을 넣어야 한다. (ip, port, http, https 포함불가능)

4. CA 인증한 CRT 인증서 만들기

CSR 을 CA에서 인증해 CRT 파일을 생성한다. 여기서는 비밀키와 CSR 요청서를 바탕으로 CRT 인증서를 생성한다.

1
명령어 : openssl req -x509 -days [기간] -key [private key 파일명] -in [csr 파일명] -out [파일명] -days [기간]

x509 를 이용하고 365일 사용 가능한 crt 인증서를 생성한다.

1
openssl req -x509 -days 365 -key my_rsa.key -in my_rsa.csr -out my_rsa.crt -days 365

생성한 혹은 CA에서 받은 CRT 파일은 아래 같이 확인해 볼 수 있다.

1
openssl x509 -text -in yourdomain.crt -noout

5. CRT 파일을 PEM 파일로 변환한다.

1
openssl x509 -in mycommoncrt.crt -out mycommonpem.pem -outform PEM 

[Tip] 인증서 Config 파일 (test.conf)

위에서 만들다 보면 계속 같은 내용을 써야 한다. 그래서 그 부분을 파일로 만들어 놓고 csr, crt 생성할때 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[dn]
C=KR
ST=Seoul
L=Seoul
O=COMPANY
OU=DEV
emailAddress=test@test.com
CN = testmachine

[req_ext]
subjectAltName = @alt_names

[alt_names]
IP.1 = 111.111.111.111
DNS.1 = test.com

csr 을 생성한다.

1
openssl req -new -key private.key -out private.csr -config test.conf

csr, crt 파일을 생성한다.

1
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf

그리고 이렇게 해서 인증서를 만들었을때 subjectAltName 이 안들어간다 . 그 부분이 필요할 경우에는 이렇게 명령어를 사용하면 된다.

1
openssl req -x509 -days 365 -key private.key -in private.csr -out mycommoncrt.crt -days 365 -config test.conf -extensions req_ext

openssl 팁 몇가지

CRT 파일 확인

openssl x509 -text -noout -in <인증서파일> : 인증서 내용을 볼수 있다.

Verifying Your Keys Match

1
2
3
openssl pkey -pubout -in .\private.key | openssl sha256
openssl req -pubkey -in .\request.csr -noout | openssl sha256
openssl x509 -pubkey -in .\certificate.crt -noout | openssl sha256

NGINX 웹 서버 TLS 암호화 추가

개인키와 TLS 인증서 crt 파일을 사용한다.

1
2
$ sudo mkdir /etc/nginx/tls/private
$ mv my_rsa.key my_rsa.crt /etc/nginx/tls/private
  1. 개인 키는 /etc/nginx/tls/private/my_rsa.key 파일에 저장됩니다.
  2. 개인 키 및 CSR(인증서 서명 요청) 생성 및 CA(인증 기관)에서 인증서 TLS 인증서는
    • /etc/nginx/tls/private/example.com.crt 파일에 저장됩니다.
1
2
3
4
5
6
7
server {
listen 443 ssl;
server_name www.thinkbee.kr;
root /home/qkboo/Home/www/thinkbee.kr/;
ssl_certificate /etc/nginx/tls/private/my_rsa.crt;
ssl_certificate_key /etc/nginx/tls/private/my_rsa.key;
}

참고

  1. Howto – Install a self signed web server certificate
  2. openssl quick reference guide
  3. Openssl로 SSL 을 위한 인증서 발급하기 (HTTPS),blog
  4. Nginx - HTTPS and Certificate SSL,blog
  5. NodeJS와 Nginx 웹 서버,blog

parted로 Partition, Format하기

새 디스크 / USB 저장장치를 리눅스 계열에서 사용하고자 할 때.

디스크 확인 lsblk

lsblk 명령은 디바이스 장치가 마운트 된 곳을 출력해 준다.

1
2
3
4
5
6
7
8
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 91.8M 1 loop /snap/lxd/23991
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 118.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 118.1G 0 lvm /

새 디스크 장치(SSD, HDD, USB 등) 를 붙이고 다시 확인하면 새로운 디스크는 sd[a-z] 형식으로 표현된다.

아래 sdb 는 현재 파티션이 1개 존재하는 상태이다.

1
2
3
4
5
6
7
8
9
10
11
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 63.3M 1 loop /snap/core20/1828
loop1 7:1 0 91.8M 1 loop /snap/lxd/23991
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 118.2G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 118.1G 0 lvm /
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 931.5G 0 part

[USB 장치]

USB 장치는 mmcblk[0-9] 형식으로 표시된다. 참고 Raspberry Pi:mmcblk

1
2
3
4
5
6
7
8
9
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 84.5G 0 part
└─sda6 8:6 0 28.9G 0 part /
mmcblk0 179:0 0 7.5G 0 disk
├─mmcblk0p2 179:2 0 6.8G 0 part /media/qkboo/ROOT
├─mmcblk0p3 179:3 0 486.1M 0 part
└─mmcblk0p1 179:1 0 200M 0 part /media/qkboo/EFI

parted 사용

파티션 및 포맷을 위해 마운트된 파티션을 언마운트 한다. parted 는 상호작용 프롬프트에서 사용하거나 단일 명령어로 사용할 수 있다.

parted 프롬프트 사용

[ext4 파티션 생성]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo parted /dev/sdb
(parted) print
Number Start End Size File system Name Flags
1 0.00GB 32.0GB 32.0GB

(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on
this disk will be lost. Do you want to continue?
Yes/No? y

(parted) unit GB
(parted) mkpart primary 0 1000.0GB #디스크 크기 입력

(parted) print
Number Start End Size File system Name Flags
1 0.00GB 32.0GB 32.0GB primary lvm
(parted) quit

[fat32 파티션 생성]

USB 스토리지는 아래 같이 나타난다. 다음은 USB 파티션에 fat32 파일시스템을 프롬프트로 생성하고 있다.

1
2
3
4
5
sudo parted /dev/mmcblk0
(parted) mklabel msdos
(parted) mkpart primary fat32 1MiB 100%
(parted) set 1 boot on
(parted) quit

쉘에서 parted 명령 사용

parted 를 쉘 명령으로 사용해 단계별로 파티션을 생성할 수 있다.

1
2
3
sudo parted /dev/mmcblk0 rm 1
sudo parted /dev/mmcblk0 rm 2
sudo parted /dev/sdc mkpart primary ext3 4MiB 100%

Format, Mount & fstab

생성한 파티션에 시스템 지원 파일 시스템을 생성해야 한다. 해당 파일 시스템으로 파티션을 포맷한 후에 지정한 디렉토리에 마운트를 해서 사용하면 된다. 지속적인 사용을 위해서 /etc/fstab 에 파티션을 마운트 포인트로 등록하면 재시동 후에도 동일한 폴더에 마운트 된다.

mkfs

mkfs 명령은 파일 시스템에 따랴서 -t 옵션에 파일시스템을 지시하거나 mkfs.[FS] 형식을 명령을 바로 쓰기도 한다.

다음을 sdb1 파티션을 ext4 로 포맷하고 있다.

1
sudo mkfs -t ext4 /dev/sdb1

[USB vfat 파일시스템 생성]

1
sudo mkfs -V -t vfat /dev/mmcblk0p1

fstab 에 등록

/etc/fstab 에 새로 포맷한 디스크 경로를 추가 한다.

1
2
3
4
5
6
# HDD
/dev/sdb1 /Home2 ext4 defaults 0 1

# USB LV volume
/dev/vg_usb/dbvol /data ext4 defaults 0 1
/dev/vg_usb/workvol /home/pi/work ext4 defaults 0 1

참고

WSL2 잘 사용하기

WSL2 이용 Linux 사용시 쓸만한 팁

  1. wsl 사용 명령
  2. WSL 쉘 사용
  3. wsl 하위 시스템 디렉토리
  4. wsl 구성 파일
  5. wsl 외부 디스크 마운트 하기
  6. wsl 배포본 이름 변경하기

1. wsl 사용 명령

윈도우즈 하위 시스템 목록

1
2
3
4
5
# Linux용 Windows 하위 시스템의 목록
PS> wsl -l

# Linux용 Windows 하위 시스템의 상태를 표시
PS> wsl --status

wsl 재시작

혹은 윈도우 서비스를 재시작할 수 있다. Windows에서 PowerShell을 관리자 권한으로 열고 다음 명령을 실행하면 됩니다.

1
PS> Restart-Service LxssManager

wsl 종료

하위 시스템 배포본을 지정해 종료하려면 -t <Distro> 명령을 사용한다.

1
2
3
4
PS> wsl -l
Ubuntu-20.04(기본값)

PS> wsl -t Ubuntu-20.04

wsl shutdown

모든 하위 시스템을 종료 시키려면 --shutdown 명령을 사용한다. --shutdown 명령은 실행 중인 모든 배포과 WSL 2 경량 유틸리티 가상 머신을 즉시 종료한다.

1
PS> wsl --shutdown

Unregister

Window store 에서 설치한 배포본을 삭제해도 wsl 의 Distro 목록에는 남아 있다. 이것은 --unregistre 명령으로 제거할 수 있다.

1
2
3
4
PS> wsl -l --all
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)
Ubuntu-22.04

--unregistre 명령으로 제거한 Distro 등록을 해제한다.

1
2
3
4
5
6
7
PS> wsl --unregister Ubuntu-22.04
등록 취소 중입니다.
작업을 완료했습니다.

PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)

2. WSL 쉘 사용

--system : 현재 시스템의 distro의 셸을 시작한다.

1
2
3
4
5
PS> wsl --system
wslg [ /mnt/c/Users/daddy ]$ cd
wslg [ ~ ]$
wslg [ ~ ]$ exit
logout

--exec, -e: 시스템 distro의 명령을 현재 PowerShell에서 실행한다.

1
2
3
PS> wsl -e bash
()qkboo:/mnt/c/Users/daddy$ cd
()qkboo:~$

wsl IP 주소

1
wsl hostname -I

2. WSL 하위 시스템 디렉토리

윈도우즈와 하위 시스템의 디렉토리를 Host 의 프로그램 들에서 사용할 수 있다.

탐색기에서 직접 접근하기

윈도우즈에서 네트워크 경로로 WSL 하위 시스템 디렉토리를 접근할 수 있다.

1
\\wsl$\<Distribution>:

예를 들어 하위 시스템 이름이 Ubuntu-20.04 이고 계정이 qkboo 이라면 탐색기에서 qkboo 계정의 홈디렉토리를 이렇게 접그할 수 있다.

1
\\wsl$\Ubuntu-20.04\home\qkboo

아래는 윈도우즈 탐색기에서 wsl 홈디렉토리를 접근한 캡쳐 화면인다.

터미널에서 홈디렉토리 탐색기 열기

터미널에서 윈도우즈 탐색기를 직접 열 수 있다.

1
$ explorer.exe .

VisualStudio Code 에서 현재 디렉토리를 연다.

1
$ code.exe .

3. WSL 고급 설정 구성

배포본 구성 파일 wsl.conf 와 전역 구성 파일 .wslconfig 이 있다.

전역 구성 파일 .wslconfig

wslconfig 예제 파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Settings apply across all Linux distros running on WSL 2
[wsl2]

# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=4GB

# Sets the VM to use two virtual processors
processors=2

# Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
kernel=C:\\temp\\myCustomKernel

# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
kernelCommandLine = vsyscall=emulate

# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=8GB

# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx

# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=false

# Turn off default connection to bind WSL 2 localhost to Windows localhost
localhostforwarding=true

# Disables nested virtualization
nestedVirtualization=false

# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=true

배포본 구성 파일 wsl.conf

  • 위치: /etc/wsl.conf
  • wsl1, wsl2 배포본에 대한 구성을 지정한다.
  • 단, Windows 빌드 17093 이상에서만 사용할 수 있다.
  • systemd 지원
  • automount 지원
    DrvFS 지원
    interop 설정 등등
  • wsl.conf 구성 설정

wsl.conf 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Automatically mount Windows drive when the distribution is launched
[automount]

# Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above. Set to false means drives won't be mounted automatically, but need to be mounted manually or with fstab.
enabled = true

# Sets the directory where fixed drives will be automatically mounted. This example changes the mount location, so your C-drive would be /c, rather than the default /mnt/c.
root = /

# DrvFs-specific options can be specified.
options = "metadata,uid=1003,gid=1003,umask=077,fmask=11,case=off"

# Sets the `/etc/fstab` file to be processed when a WSL distribution is launched.
mountFsTab = true

# Network host settings that enable the DNS server used by WSL 2. This example changes the hostname, sets generateHosts to false, preventing WSL from the default behavior of auto-generating /etc/hosts, and sets generateResolvConf to false, preventing WSL from auto-generating /etc/resolv.conf, so that you can create your own (ie. nameserver 1.1.1.1).
[network]
hostname = DemoHost
generateHosts = false
generateResolvConf = false

# Set whether WSL supports interop process like launching Windows apps and adding path variables. Setting these to false will block the launch of Windows processes and block adding $PATH environment variables.
[interop]
enabled = false
appendWindowsPath = false

# Set the user when launching a distribution with WSL.
[user]
default = DemoUser

# Set a command to run when a new WSL instance launches. This example starts the Docker container service.
[boot]
command = service docker start

4. wsl 외부 디스크 마운트 하기

윈도우즈 wsl 에서 리눅스 파티션 혹은 USB 파티션 디스크를 마운트해서 사용하려고 한다.

  1. 관리자 모드에서 Powershell 을 연다.

파워쉘에서 연결된 디스크 목록을 확인한다.

1
2
3
4
5
6
7
PS> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

DeviceID Caption Partitions Size Model
-------- ------- ---------- ---- -----
\\.\PHYSICALDRIVE0 ST2000DM008-2FR102 1 2000396321280 ST2000DM008-2FR102
\\.\PHYSICALDRIVE1 WDS500G3X0C-00SJG0 4 500105249280 WDS500G3X0C-00SJG0
\\.\PHYSICALDRIVE2 ATA HGST HTS721010A9 USB Device 1 1000202273280 ATA HGST HTS721010A9...
  1. 관리자 모드 PowerShell 에서 마운트할 Device ID를 마운트 한다.

--bare 를 사용해 마운트 여부를 확인할 수 있다.

1
PS> wsl --mount \\.\PHYSICALDRIVE2 --bare
  1. WSL 리눅스 터미널에서 디스크를 확인한다.

아래 같이 마운트를 실행한다.

1
2
3
4
PS> wsl --mount \\.\PHYSICALDRIVE2 -type ext4
디스크가 '/mnt/wsl/PHYSICALDRIVE2'(으)로 탑재되었습니다.
참고: /etc/wsl.conf에서 automount.root 설정을 수정한 경우 위치가 달라집니다.
디스크를 분리하고 분리하려면 'wsl.exe --unmount \\.\PHYSICALDRIVE2'을 실행하십시오.

파티션을 마운트 한다면

1
2
3
4
PS> wsl --mount \\.\PHYSICALDRIVE2 -p 1   # partition 1
디스크가 '/mnt/wsl/PHYSICALDRIVE2p1'(으)로 탑재되었습니다.
참고: /etc/wsl.conf에서 automount.root 설정을 수정한 경우 위치가 달라집니다.
디스크를 분리하고 분리하려면 'wsl.exe --unmount \\.\PHYSICALDRIVE2'을 실행하십시오.

연결된 디스크가 sdd 에 표시된다.

1
2
3
4
5
6
7
~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 363.1M 1 disk
sdb 8:16 0 8G 0 disk [SWAP]
sdc 8:32 0 256G 0 disk /mnt/wslg/distro
sdd 8:48 0 931.5G 0 disk
└─sdd1 8:49 0 931.5G 0 part

어떠 파일 시스템인지 확인하려면 lsblk -f 명령을 사용한다.

1
2
3
4
5
6
7
8
~$ lsblk -f
NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT
sda ext4
sdb swap 44bcbb9a-3a2c-44db-99e4-9c14dec69098 [SWAP]
sdc ext4 3255683f-53a2-4fdf-91cf-b4c1041e2a62 159.1G 32% /mnt/wslg/distro
sdd
└─sdd1 ext4 9b3c51ab-a49b-41c7-a105-fb9d47a86476
(3.11.1)qkboo@desktop-goyangi:~$

df 명령으로 확인해 보자,

1
2
3
4
5
6
7
8
9
10
s$ df -h
Filesystem Size Used Avail Use% Mounted on
none 16G 4.0K 16G 1% /mnt/wsl
drivers 465G 397G 69G 86% /usr/lib/wsl/drivers
none 16G 0 16G 0% /usr/lib/wsl/lib
/dev/sdc 251G 80G 160G 34% /

...

/dev/sdd1 917G 852G 19G 98% /mnt/wsl/PHYSICALDRIVE2p1

6. 배포본 이름 변경하기

  1. 먼저 모든 WSL 실행 배포본을 종료한다.

현재 배포본 Ubuntu 20.04 인데 do-os-relase 업그레이드로 22.04 로 완료된 상태이다. 하지만 배포본 이름은 20.04 라서 이름을 22.04 로 변경하려고 한다.

1
2
3
PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-20.04(기본값)
  1. 레지스트리 편집기를 열고 다음 위치로 이동한다.

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss

  1. Lxss 항목 중 배포본 레지스트리를 선택하면 아래 같은 내용에서 *DistributionName 을 찾아 변경한 배포본 이름으로 바꾸고 저장한다.
  1. 변경된 이름을 저장하고 wsl 배포본 목록을 확인한다.
1
2
3
PS> wsl -l
Linux용 Windows 하위 시스템 배포:
Ubuntu-22.04(기본값)

— 참고

  1. WSL 시작하기: https://github.com/wslhub/wsl-firststep/