LFCS 수행에 필요한 Linux 기초
공식 competency 실습 전에 익혀야 할 셸, 파일, 텍스트 처리, 권한, 압축, 프로세스와 도움말 탐색
이 장의 항목은 LFCS 공식 competency를 다시 나열한 것이 아니다. 공식 과제를 실제로 수행할 때 전제되는 공통 도구다. 읽는 것보다 기초 실습을 터미널에서 수행하는 것이 중요하다.
작성·검증 상태: AI 보조 초안이다. POSIX·GNU/Linux의 공통 동작과 local man page를 기준으로 검토했으며, shell·tool version에 따라 다른 option은 실습 환경의
--help와 man page를 우선한다.
학습 목표
이 장을 마치면 다음 작업을 도움 없이 수행할 수 있어야 한다.
- 현재 사용자·호스트·경로와 명령의 출처를 확인한다.
- 절대 경로와 상대 경로를 구분해 파일을 안전하게 다룬다.
- 표준 입력·출력·오류를 리다이렉션하고 파이프로 연결한다.
- 큰 출력에서 필요한 행과 열을 검색·정렬·집계한다.
- 파일을 조건으로 찾고 공백이 있는 이름도 안전하게 처리한다.
- 소유권·mode bit·특수 권한·umask를 읽는다.
- hard link와 symbolic link의 차이를 설명하고 검증한다.
- archive와 compression을 구분해 생성·목록·복원한다.
- process와 job을 찾고 적절한 signal을 보낸다.
- 모르는 명령·옵션·설정 형식을 로컬 문서에서 찾는다.
1. 셸에서 먼저 확인할 것
관리 작업 전에는 누구로, 어느 호스트에서, 어느 경로를 대상으로 작업하는지 확인한다.
whoami
id
hostname
pwd
printf '%s\n' "$SHELL"
# 프롬프트처럼 보인다고 root라고 단정하지 말고 id -u를 확인한다. root 권한이 필요할 때는 문제 환경에서 허용된 방식으로 sudo 또는 root shell을 사용한다.
id -u
sudo -l
sudo -i
명령 이름이 alias, shell builtin, 함수, 실행 파일 중 무엇인지도 확인할 수 있다.
type cd
type -a ls
command -v systemctl
which는 외부 실행 파일을 찾는 데 도움이 되지만 shell builtin·함수·alias까지 설명하지 못할 수 있다. 시험형 진단에는 type -a와 command -v가 더 명확하다.
2. 경로와 파일 다루기
절대 경로와 상대 경로
/etc/ssh/sshd_config:/에서 시작하는 절대 경로configs/sshd_config: 현재 디렉터리를 기준으로 한 상대 경로.: 현재 디렉터리..: 상위 디렉터리~: 현재 사용자의 home 디렉터리로 shell이 확장
관리 작업에서는 대상 혼동을 줄이기 위해 설정 파일과 장치에 절대 경로를 사용하는 편이 안전하다.
pwd
ls -ld . .. /etc /var/log
realpath ./configs/../configs/example.conf
생성·복사·이동·삭제
install -d -m 0750 /srv/example
touch /srv/example/empty.txt
cp -a /etc/hosts /srv/example/hosts.copy
mv /srv/example/hosts.copy /srv/example/hosts.saved
stat /srv/example/hosts.saved
install -d는 디렉터리를 만들면서 mode·owner·group을 함께 지정할 수 있어 시험형 작업에 유용하다. cp -a는 가능한 범위에서 mode, owner, timestamp, link 같은 속성을 보존한다.
삭제 전에는 대상이 예상한 경로인지 출력한다.
find /srv/example -maxdepth 1 -mindepth 1 -printf '%M %u:%g %p\n'
특히 root에서 변수, wildcard, 재귀 삭제를 함께 사용할 때는 확장 결과를 먼저 확인한다.
파일 내용 확인
cat /etc/os-release
less /var/log/messages
head -n 20 /etc/passwd
tail -n 20 /var/log/messages
tail -F /var/log/messages
tail -f는 현재 파일 descriptor를 계속 따라가고, tail -F는 log rotation으로 파일이 교체되어도 파일 이름을 다시 열려고 한다.
3. quoting과 shell expansion
공백·wildcard·변수가 들어간 인자는 quoting에 따라 달라진다.
name='LFCS practice'
printf '%s\n' "$name"
printf '%s\n' '$name'
- 작은따옴표
'...': 내부 문자를 그대로 취급 - 큰따옴표
"...": 변수와 일부 치환은 수행하되 결과를 한 인자로 유지 - quoting 없음: 공백 분리와 wildcard 확장이 발생할 수 있음
변수는 일반적으로 큰따옴표로 감싼다.
target='/srv/LFCS practice'
mkdir -p -- "$target"
--는 이후 값을 옵션이 아닌 operand로 해석하도록 지원하는 명령에서 옵션 처리를 끝낸다.
명령 치환 결과를 바로 파괴적인 명령의 대상으로 사용하지 않는다. 먼저 출력과 개수를 확인한다.
4. 표준 입출력과 파이프
process는 일반적으로 세 file descriptor를 사용한다.
| 번호 | 이름 | 기본 대상 |
|---|---|---|
| 0 | standard input | keyboard 또는 앞 command |
| 1 | standard output | terminal |
| 2 | standard error | terminal |
command > output.txt # stdout 덮어쓰기
command >> output.txt # stdout 이어쓰기
command 2> error.txt # stderr 덮어쓰기
command > all.txt 2>&1 # stdout 대상에 stderr도 연결
command < input.txt # 파일을 stdin으로 사용
리다이렉션은 왼쪽부터 처리되므로 순서가 중요하다.
command > all.txt 2>&1
command 2>&1 > output.txt
두 번째 줄에서는 stderr가 원래 stdout인 terminal에 먼저 연결되므로 첫 번째 줄과 결과가 다르다.
파이프는 왼쪽 command의 stdout을 오른쪽 command의 stdin으로 전달한다.
getent passwd | cut -d: -f1 | sort
journalctl -b --no-pager | grep -i error
파이프 앞 명령의 실패도 잡아야 하는 shell script에서는 set -o pipefail을 검토한다. 대화형 시험 작업에서는 각 단계의 exit status와 출력을 직접 확인하는 편이 단순하다.
printf 'exit=%s\n' "$?"
5. 텍스트 검색·변환·집계
grep
grep -n 'PermitRootLogin' /etc/ssh/sshd_config
grep -Rni --include='*.conf' 'listen' /etc 2>/dev/null
grep -E '^(root|student):' /etc/passwd
grep -vE '^[[:space:]]*(#|$)' /etc/ssh/sshd_config
-n: 줄 번호-i: 대소문자 무시-R: symbolic link까지 따라가는 재귀 검색-r: 기본 재귀 검색-E: extended regular expression-v: 일치하지 않는 행
열 분리와 정렬
cut -d: -f1,3 /etc/passwd
getent passwd | awk -F: '$3 >= 1000 {print $1, $3}'
printf '%s\n' alpha beta alpha | sort | uniq -c
cut은 일정한 delimiter의 단순 열 선택에 적합하고, awk는 조건·계산·출력 형식이 필요한 경우에 적합하다.
sed
먼저 stdout으로 결과를 확인한 뒤 파일을 변경한다.
sed -n '1,20p' /etc/ssh/sshd_config
sed 's/^OPTION=.*/OPTION=value/' example.conf
sed -i.bak 's/^OPTION=.*/OPTION=value/' example.conf
-i.bak는 원본 백업을 남기지만 모든 명령에서 같은 방식이 제공되는 것은 아니다. 서비스 설정은 전용 문법 검사 후 reload한다.
6. 파일 찾기와 안전한 일괄 처리
find /var/log -type f -size +100M -printf '%s %p\n'
find /srv -xdev -type f -user student -perm -020 -print
find /tmp -maxdepth 1 -type f -mtime +7 -print
자주 쓰는 조건:
| 조건 | 의미 |
|---|---|
-type f | regular file |
-type d | directory |
-name / -iname | 이름 일치 / 대소문자 무시 |
-user, -group | 소유 사용자·그룹 |
-size +100M | 100 MiB 초과 |
-mtime +7 | 7일보다 오래전에 수정 |
-perm -020 | group write bit가 모두 포함 |
-xdev | 다른 filesystem으로 넘어가지 않음 |
공백이나 줄바꿈이 있는 이름까지 안전하게 전달하려면 NUL delimiter를 사용한다.
find /srv/example -type f -print0 | xargs -0 -r stat --
find /srv/example -type f -exec stat -- {} +
변경·삭제 command를 붙이기 전에 -print로 대상 집합을 확인한다.
7. 소유권, mode bit와 umask
stat -c '%A %a %U:%G %n' /srv/example
chown root:operators /srv/example
chmod 2770 /srv/example
기본 mode bit:
| 값 | 파일 | 디렉터리 |
|---|---|---|
4 (r) | 내용 읽기 | 이름 목록 읽기 |
2 (w) | 내용 변경 | 항목 생성·삭제 |
1 (x) | 실행 | 경로 통과·항목 접근 |
특수 bit:
| 값 | 의미 |
|---|---|
4000 | setuid |
2000 | setgid; 디렉터리에서는 새 항목의 group 상속에 사용 |
1000 | sticky; 공유 디렉터리에서 일반적으로 소유자 중심 삭제 제한 |
umask는 새 객체에서 제거할 권한을 정한다.
umask
umask -S
일반적으로 regular file은 실행 bit 없이 0666, directory는 0777을 출발점으로 하고 umask가 적용된다. ACL이 있으면 최종 effective permission은 ACL mask까지 함께 확인한다.
getfacl /srv/example
namei -l /srv/example/file
사용자·그룹·ACL의 전체 실습은 사용자·그룹 핵심 정리에서 이어진다.
8. hard link와 symbolic link
printf 'data\n' > original.txt
ln original.txt hard.txt
ln -s original.txt symbolic.txt
ls -li original.txt hard.txt symbolic.txt
readlink symbolic.txt
readlink -f symbolic.txt
- hard link는 같은 filesystem의 같은 inode를 가리킨다. 원본 이름을 지워도 다른 hard link가 남아 있으면 데이터는 유지된다.
- symbolic link는 다른 pathname을 저장한 별도 inode다. 대상이 사라지면 dangling link가 될 수 있고 filesystem 경계를 넘을 수 있다.
검증할 때는 이름만 보지 말고 inode, link count, resolved path를 확인한다.
9. archive와 compression
tar는 여러 경로를 하나의 archive로 묶고, gzip·bzip2·xz는 byte stream을 압축한다.
tar -czf etc-example.tar.gz /etc/hosts /etc/os-release
tar -tzf etc-example.tar.gz
mkdir restore
tar -xzf etc-example.tar.gz -C restore
절대 경로를 archive에 넣으면 GNU tar가 기본적으로 앞의 /를 제거한다. 복원 대상과 기존 파일 덮어쓰기 가능성을 확인하고 가능하면 빈 디렉터리에 먼저 푼다.
단일 파일 압축:
gzip -k example.log
gzip -cd example.log.gz | head
xz -k example.log
archive를 만들었다는 출력만으로 끝내지 않고 목록과 시험 복원으로 검증한다.
10. process, job과 signal
ps -ef
ps -eo pid,ppid,user,stat,ni,%cpu,%mem,etime,cmd --sort=-%cpu
pgrep -a sshd
pstree -p
대화형 shell의 job:
sleep 300 &
jobs -l
fg %1
signal은 process에 동작을 요청한다.
kill -TERM PID
kill -HUP PID
kill -KILL PID
먼저 기본 TERM으로 정상 종료 기회를 주고, 상태와 로그를 확인한다. KILL은 process가 정리 작업을 수행할 수 없으므로 마지막 수단이다. 서비스 process는 가능하면 해당 service manager로 관리한다.
systemctl stop example.service
systemctl status example.service --no-pager
11. 편집과 원자적인 설정 변경
시험 환경에서 제공되는 editor 하나는 검색·저장·종료까지 사용할 수 있어야 한다. vi/vim의 최소 조작:
i insert mode
Esc normal mode
/pattern 아래 방향 검색
n / N 다음 / 이전 검색 결과
:w 저장
:q 종료
:wq 저장 후 종료
:q! 저장하지 않고 종료
설정 파일은 가능하면 임시 파일 작성 → 전용 문법 검사 → 원래 위치로 교체 → reload 순서를 사용한다. 단, 명령이 요구하는 소유권·mode·SELinux context도 보존해야 한다.
cp -a /etc/example.conf /etc/example.conf.bak
파일 전체를 덮어쓰기보다 요구된 항목만 최소 변경하고, 기존 설정과 충돌하는 중복 directive가 없는지 확인한다.
12. 로컬 도움말 탐색
시험형 문제에서는 외부 노트보다 설치된 문서에서 답을 찾는 능력이 중요하다.
man -k 'logical volume'
apropos -s 5,8 'ssh configuration'
command --help
man 8 command
info coreutils
find /usr/share/doc -maxdepth 2 -iname '*example*' -print
man section:
| section | 주로 다루는 내용 | 예시 |
|---|---|---|
| 1 | 사용자 command | man 1 tar |
| 5 | 파일 형식·설정 | man 5 fstab |
| 7 | 개념·관례 | man 7 inode |
| 8 | 관리자 command | man 8 mount |
같은 이름이 여러 section에 있으면 section 번호를 명시한다. man 안에서는 /keyword, n, N으로 필요한 부분만 찾는다.
명령을 찾는 전체 흐름은 문제 해석과 막혔을 때 찾는 순서와 영문 요구사항·로컬 문서 찾기에서 이어진다.
완료 기준
- 임의의 파일 트리를 만들고 소유권·mode·link를
stat,namei,ls -li로 설명할 수 있다. - 파이프와 리다이렉션으로 stdout·stderr를 의도한 파일에 분리할 수 있다.
-
grep,cut,awk,sort,uniq,find를 조합해 요구된 대상만 찾는다. - archive를 만들고 목록 확인과 빈 경로 복원으로 검증한다.
- process를 정확히 식별한 뒤
TERM부터 단계적으로 종료한다. - 처음 보는 작업의 command와 설정 형식을
man -k,--help, man section에서 찾는다.