Home Linux Filesystem and Users
Post
Cancel

Linux Filesystem and Users

# Linux Filesystem and Users

Q&A: 터미널 프롬프트, ~, /

질문

리눅스 터미널에 나오는 shin@DESKTOP-LBOABJ3:~$ 는 뭐라고 지칭하는가? 처음 경로가 ~로 되어 있는데, cd / 명령어를 입력하는 것과 무엇이 다른가? ~와 /의 차이는 무엇인가?

답변

shin@DESKTOP-LBOABJ3:~$ 는 보통 프롬프트(prompt) 라고 부른다. 셸이 사용자에게 “명령어를 입력할 준비가 되었다”고 보여주는 표시다.

구성은 보통 다음처럼 해석할 수 있다.

1
shin@DESKTOP-LBOABJ3:~$
  • shin: 현재 로그인한 사용자 이름
  • DESKTOP-LBOABJ3: 현재 접속한 컴퓨터 또는 호스트 이름
  • ~: 현재 작업 디렉토리가 사용자의 홈 디렉토리라는 뜻
  • $: 일반 사용자 권한의 셸이라는 뜻

여기서 중요한 차이는 ~와 /다.

~는 현재 사용자의 홈 디렉토리를 뜻하는 축약 표현이다. 예를 들어 사용자가 shin이라면 보통 다음 경로를 의미한다.

1
/home/shin

그래서 아래 두 명령은 거의 같은 의미다.

1
2
cd ~
cd /home/shin

반면 /는 리눅스 파일 시스템의 최상위 디렉토리, 즉 루트 디렉토리다. 모든 디렉토리와 파일은 / 아래에서 시작한다.

1
cd /

이 명령을 입력하면 홈 디렉토리가 아니라 파일 시스템의 가장 위로 이동한다. 예를 들어 / 아래에는 보통 이런 디렉토리들이 있다.

1
bin  boot  dev  etc  home  usr  var

정리하면 다음과 같다.

1
2
~  = 내 홈 디렉토리, 예: /home/shin
/  = 파일 시스템 전체의 시작점

따라서 shin@DESKTOP-LBOABJ3:~$ 에서 ~가 보인다는 것은 “현재 나는 내 홈 디렉토리에 있다”는 뜻이고, cd /를 입력하면 “홈 디렉토리를 벗어나 파일 시스템의 최상위로 이동한다”는 뜻이다.

Q&A: 리눅스 기본 디렉토리와 /dev/null

질문

리눅스 기본 폴더의 역할은 각각 무엇인가? home, usr, bin, etc, dev, lib 등이 있는데, 이것이 명령어에 붙는 /dev/null과 관련이 있는가?

답변

리눅스의 기본 디렉토리들은 아무렇게나 만들어진 폴더가 아니라, 파일 시스템에서 각 종류의 파일을 어디에 둘지 정한 약속에 가깝다. 리눅스에서는 프로그램, 설정, 장치, 사용자 파일까지 모두 하나의 디렉토리 트리 안에 배치된다.

자주 보는 디렉토리의 역할은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
/        파일 시스템의 최상위 디렉토리
/home    일반 사용자의 홈 디렉토리
/bin     기본 명령어 실행 파일
/usr     사용자용 프로그램, 라이브러리, 문서 등
/etc     시스템 설정 파일
/dev     장치 파일
/lib     시스템 실행에 필요한 기본 라이브러리
/var     자주 변하는 데이터
/tmp     임시 파일
/root    root 사용자의 홈 디렉토리

조금 더 구체적으로 보면 다음과 같다.

/home은 일반 사용자의 개인 공간이다. 예를 들어 사용자 이름이 shin이면 보통 홈 디렉토리는 /home/shin이다.

1
/home/shin

/bin은 ls, cp, mv, cat 같은 기본 명령어 실행 파일이 있는 곳이다. 사용자가 ls를 입력하면 셸은 실제로는 이런 실행 파일을 찾아 실행한다.

1
2
/bin/ls
/bin/cp

/usr는 많은 사용자용 프로그램과 라이브러리, 문서가 들어가는 큰 영역이다. 요즘 리눅스에서는 /usr/bin에 대부분의 명령어가 들어 있는 경우가 많다.

1
2
/usr/bin/python3
/usr/bin/git

/etc는 시스템 설정 파일이 있는 곳이다. 프로그램 실행 파일이 아니라, 프로그램이나 시스템이 어떤 방식으로 동작할지 정하는 설정 파일들이 들어간다.

1
2
3
/etc/hosts
/etc/passwd
/etc/ssh/sshd_config

/dev는 장치 파일이 있는 곳이다. 여기서 중요한 점은 리눅스가 하드디스크, 터미널, 랜덤 생성기 같은 장치도 파일처럼 다룬다는 것이다.

1
2
3
4
/dev/sda
/dev/tty
/dev/null
/dev/random

따라서 /dev/null은 /dev 디렉토리와 직접 관련이 있다. /dev/null은 실제 일반 파일이 아니라 특수 장치 파일이다.

/dev/null의 역할은 “버리는 곳”이다. 여기에 출력하면 내용이 저장되지 않고 사라진다.

1
echo "hello" > /dev/null

위 명령은 hello를 출력하지만, 그 출력이 화면이나 파일에 남지 않고 /dev/null로 버려진다.

실무에서는 보통 명령어의 출력을 숨기고 싶을 때 사용한다.

1
some-command > /dev/null

에러 메시지까지 숨기고 싶다면 표준 에러도 함께 보낸다.

1
some-command > /dev/null 2>&1

여기서 >는 표준 출력을 리다이렉션한다는 뜻이고, 2>&1은 표준 에러를 표준 출력과 같은 곳으로 보낸다는 뜻이다. 결과적으로 일반 출력과 에러 출력이 모두 /dev/null로 가서 사라진다.

/lib는 시스템과 프로그램 실행에 필요한 라이브러리가 들어간다. 라이브러리는 프로그램들이 공통으로 사용하는 기능 묶음이다.

1
2
3
/lib
/lib64
/usr/lib

정리하면 다음과 같다.

1
2
3
4
5
6
7
/home      사용자 개인 공간
/bin       기본 명령어
/usr       사용자용 프로그램과 라이브러리
/etc       설정 파일
/dev       장치 파일
/lib       실행에 필요한 라이브러리
/dev/null  출력을 버리는 특수 장치 파일

즉 /dev/null은 이름만 우연히 그런 것이 아니라, 장치 파일을 담는 /dev 디렉토리 아래에 있는 특수한 장치 파일이다.

Q&A: sudo -i, root 사용자, / 루트 디렉토리의 차이

질문

sudo -i를 입력하면 user name이 root로 바뀌는데, 이것은 무엇을 뜻하는가? / 경로의 root라는 뜻인가?

답변

sudo -i를 입력했을 때 사용자 이름이 root로 바뀌는 것은 root 사용자 계정으로 로그인 셸을 연 것을 뜻한다. 이것은 / 경로의 root 디렉토리와는 다른 개념이다.

먼저 두 가지를 분리해야 한다.

1
2
3
root 사용자  = 리눅스의 최고 관리자 계정
/            = 파일 시스템의 최상위 디렉토리
/root        = root 사용자의 홈 디렉토리

root 사용자는 리눅스 시스템에서 가장 강한 권한을 가진 관리자 계정이다. 파일 삭제, 패키지 설치, 시스템 설정 변경, 서비스 제어 같은 거의 모든 작업을 할 수 있다.

1
sudo -i

이 명령은 현재 사용자에게 sudo 권한이 있을 때, root 사용자의 로그인 셸을 시작한다. 그래서 프롬프트가 보통 다음처럼 바뀐다.

1
root@hostname:~#

여기서 root는 현재 사용자가 root 계정이라는 뜻이다. 마지막 기호도 $에서 #로 바뀌는 경우가 많다.

1
2
$  일반 사용자 셸
#  root 사용자 셸

하지만 이것이 / 디렉토리로 이동했다는 뜻은 아니다. sudo -i를 하면 보통 root 사용자의 홈 디렉토리인 /root로 이동한다.

1
pwd

결과는 보통 다음과 비슷하다.

1
/root

즉 다음 셋은 다르다.

1
2
3
root      사용자 이름
/root     root 사용자의 홈 디렉토리
/         파일 시스템의 최상위 디렉토리

/는 모든 파일과 디렉토리가 시작되는 최상위 경로다.

1
2
cd /
pwd

결과는 다음과 같다.

1
/

/root는 그 / 아래에 있는 디렉토리 중 하나이며, root 사용자의 개인 홈 디렉토리다.

1
2
cd /root
pwd

결과는 다음과 같다.

1
/root

일반 사용자의 홈 디렉토리가 /home/shin 같은 곳이라면, root 사용자의 홈 디렉토리는 보통 /root다.

1
2
3
shin 사용자의 홈   /home/shin
root 사용자의 홈   /root
파일 시스템 루트   /

sudo -i와 sudo 명령어도 구분해야 한다.

1
sudo apt update

이 명령은 apt update 하나만 root 권한으로 실행한다.

반면 다음 명령은 root 셸 자체를 연다.

1
sudo -i

이후 입력하는 명령들은 root 권한으로 실행된다.

1
whoami

결과는 다음과 같다.

1
root

root 셸에서 빠져나오려면 다음 명령을 입력한다.

1
exit

정리하면 다음과 같다.

1
2
3
4
5
sudo command  특정 명령 하나를 root 권한으로 실행
sudo -i       root 사용자의 로그인 셸로 전환
root          최고 관리자 사용자
/root         root 사용자의 홈 디렉토리
/             파일 시스템 최상위 디렉토리

따라서 sudo -i 후에 보이는 root는 / 경로를 뜻하는 것이 아니라, 현재 셸이 root 사용자 권한으로 실행 중이라는 뜻이다. /는 경로이고, root는 사용자 계정이며, /root는 root 사용자의 홈 디렉토리다.


Q&A: 사용자 및 그룹 관리

질문

리눅스에서 새로운 사용자를 추가하거나 관리하려면 어떻게 해야 할까?

답변

사용자 관리 파일

리눅스의 사용자 정보는 다음 파일들에 저장된다:

1
2
3
4
/etc/passwd      # 사용자 계정 정보 (암호화되지 않은)
/etc/shadow      # 사용자 암호 (암호화됨)
/etc/group       # 그룹 정보
/etc/gshadow     # 그룹 암호 (거의 사용 안 함)

/etc/passwd 형식

1
cat /etc/passwd
1
2
3
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:ubuntu:/home/ubuntu:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

각 필드:

1
사용자명:암호:UID:GID:설명:홈디렉토리:셸
  • UID: User ID (0 = root, 1-999 = 시스템 사용자, 1000+ = 일반 사용자)
  • GID: 기본 Group ID
  • 홈디렉토리: 로그인 후 시작 위치
  • 셸: 로그인 셸 (nologin이면 로그인 불가)

/etc/shadow 형식

1
2
# root만 읽을 수 있음
sudo cat /etc/shadow
1
2
root:$6$...(암호화):18000:0:99999:7:::
ubuntu:$6$...(암호화):18001:0:99999:7:::

useradd - 사용자 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 기본 사용자 추가
sudo useradd john

# 홈 디렉토리와 함께 추가 (-m)
sudo useradd -m john

# 특정 그룹에 속하는 사용자 추가 (-g)
sudo useradd -m -g developers john

# 여러 그룹에 속함 (-G)
sudo useradd -m -G developers,sudo john

# 셸 지정 (-s)
sudo useradd -m -s /bin/bash john

# 홈 디렉토리 경로 지정 (-d)
sudo useradd -m -d /custom/home/john john

# 한 번에 지정
sudo useradd -m -s /bin/bash -G sudo,developers -c "John Doe" john

passwd - 비밀번호 설정/변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 현재 사용자 비밀번호 변경
passwd

# 다른 사용자의 비밀번호 설정 (root만)
sudo passwd john

# 비밀번호 지우기
sudo passwd -d john

# 비밀번호 잠금
sudo passwd -l john

# 비밀번호 해제
sudo passwd -u john

usermod - 사용자 정보 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 그룹 변경
sudo usermod -g developers john

# 추가 그룹 지정 (-a: append)
sudo usermod -aG sudo john

# 홈 디렉토리 변경
sudo usermod -d /new/home/john john

# 셸 변경
sudo usermod -s /bin/zsh john

# 사용자명 변경
sudo usermod -l jane john  # john -> jane

# 계정 비활성화
sudo usermod -L john  # 로그인 불가
sudo usermod -U john  # 로그인 가능

userdel - 사용자 삭제

1
2
3
4
5
# 사용자만 삭제 (홈 디렉토리 유지)
sudo userdel john

# 사용자와 홈 디렉토리 함께 삭제 (-r)
sudo userdel -r john

그룹 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 그룹 생성
sudo groupadd developers

# 그룹에 사용자 추가
sudo usermod -aG developers john

# 그룹 확인
cat /etc/group | grep developers
# developers:x:1001:john,jane,bob

# 그룹 삭제
sudo groupdel developers

# 그룹명 변경
sudo groupmod -n backend developers

id - 사용자 정보 확인

1
2
3
4
5
6
7
# 현재 사용자
id
# uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),27(sudo)

# 특정 사용자
id john
# uid=1001(john) gid=1001(john) groups=1001(john),1002(developers)

groups - 속한 그룹 확인

1
2
3
4
5
6
7
# 현재 사용자
groups
# ubuntu adm sudo

# 특정 사용자
groups john
# john developers sudo

실제 사용 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 개발자 그룹 만들고 사용자 추가
sudo groupadd developers
sudo useradd -m -s /bin/bash -G developers alice
sudo useradd -m -s /bin/bash -G developers bob

# 2. 개발 프로젝트 디렉토리 권한 설정
sudo chown -R :developers /home/shared/project
sudo chmod -R 775 /home/shared/project
# 이제 developers 그룹 멤버들이 자유롭게 수정 가능

# 3. 웹 서버 사용자 추가
sudo useradd -m -s /usr/sbin/nologin www-app
sudo usermod -aG www-data www-app
# nologin 셸이므로 SSH 접속 불가능 (자동 스크립트만 실행)

# 4. 사용자 확인
grep "john\|jane" /etc/passwd
id john
groups john

sudo 권한 설정

1
2
3
4
5
6
7
8
9
# /etc/sudoers 파일 편집 (visudo 사용!)
sudo visudo

# 파일 내용
john ALL=(ALL) NOPASSWD: /usr/bin/systemctl
# john은 systemctl을 비밀번호 없이 실행 가능

bob ALL=(ALL) ALL
# bob은 모든 명령어를 sudo로 실행 가능 (비밀번호 필요)
This post is licensed under CC BY 4.0 by the author.