
boot: 부팅을 위한 커널이 존재하는 디렉토리[root@rocky1 ~]# ls /
a.txt boot dev home lib64 mnt proc run srv tmp var
bin b.txt etc lib media opt root sbin sys usr
[root@rocky1 ~]# ls /boot
config-4.18.0-553.el8_10.x86_64
efi
grub2
initramfs-0-rescue-b87d17b2fd92436aa94987c7c6b54f03.img
initramfs-4.18.0-553.el8_10.x86_64.img
initramfs-4.18.0-553.el8_10.x86_64kdump.img
loader
symvers-4.18.0-553.el8_10.x86_64.gz
System.map-4.18.0-553.el8_10.x86_64
vmlinuz-0-rescue-b87d17b2fd92436aa94987c7c6b54f03
vmlinuz-4.18.0-553.el8_10.x86_64
dev: 리눅스의 장치들을 관리하는 디렉토리[root@rocky1 ~]# ls /dev
autofs kmsg pts tty15 tty35 tty55 vcs1
block log random tty16 tty36 tty56 vcs2
bsg loop-control raw tty17 tty37 tty57 vcs3
cdrom lp0 rl tty18 tty38 tty58 vcs4
char lp1 rtc tty19 tty39 tty59 vcs5
console lp2 rtc0 tty2 tty4 tty6 vcs6
...
💡
mount & /dev/sr0은 뭐지?
[root@rocky1 ~]# mount | grep sr0
/dev/sr0 on /run/media/root/Rocky-8-10-x86_64-dvd type iso9660 (ro,nosuid,nodev,relatime,nojoliet,check=s,map=n,blocksize=2048,uid=0,gid=0,dmode=500,fmode=400,uhelper=udisks2)
mount: 리눅스의 장치는 물리 장치와 논리 장치가 있다. 이 두 장치를 연결해서 사용해야 하는데 이를 마운트(mount)라고 한다./dev/sr0: 물리 장치. 일반적으로 첫 번째 CD-ROM 또는 DVD 드라이브를 나타낸다./run/media/root/Rocky-8-10-x86_64-dvd : 논리 장치mount | grep sr0 : 시스템에 마운트된 파일 시스템 목록 중에서 sr0 라는 문자열을 포함하는 항목만 필터링하여 출력한다.umount 이다.etc: 서비스를 위한 구성 파일들이 존재하는 디렉토리[root@rocky1 ~]# ls /etc
accountsservice hosts profile
adjtime hp profile.d
aliases idmapd.conf protocols
alsa init.d pulse
alternatives initial-setup qemu-ga
...
[root@rocky1 ~]# cd /etc/ssh
[root@rocky1 ssh]# ls
moduli ssh_host_ecdsa_key ssh_host_rsa_key
ssh_config ssh_host_ecdsa_key.pub ssh_host_rsa_key.pub
ssh_config.d ssh_host_ed25519_key
sshd_config ssh_host_ed25519_key.pub
👀 /(슬래시)를 사용해서 경로를 찾으면 절대경로로 찾는 방식으로, 위에서부터 찾아내려감!
usr: 실행 파일들이 주로 존재하는 디렉토리[root@rocky1 ssh]# which ping
/usr/bin/ping
[root@rocky1 ssh]# which sshd
/usr/sbin/sshd
[root@rocky1 ssh]# which echo
/usr/bin/echo
[root@rocky1 ssh]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
👀 $PATH는 환경변수로써 각 사용자가 로그인을 하면 사용자별로 지정된 변수에 값을 부여하여 사용할 수 있도록 제공된다. 이때 PATH 환경 변수는 해당 경로에 있는 실행파일들은 전체 경로를 다 쓰지 않고 명령어만 쓰더라도 실제 경로에 있는 실행파일이 동작하도록 제공된다.
root: 슈퍼 유저의 홈 디렉토리home: 기본적으로 일반 사용자들의 홈 디렉토리 (변경 가능)var: 실시간으로 발생하는 데이터./var/lib/mysql 하위에 존재하게 된다.리눅스 시스템은 전체 시스템과 각각의 애플리케이션 별로 동작 환경을 지정할 수 있는 번호가 있다. 이를 run level 이라 부른다.
0 : poweroff → init 0 라고 하면 시스템이 종료된다.1 : 복구 모드 → single user 가 접속하여 패스워드를 복구하는 등의 긴급상황에서 다른 접속을 차단한 뒤 혼자서만 작업할 수 있는 모드3 : multi-user/CLI → systemctl set-default multi-user.target5 : multi-user/GUI → systemctl set-default graphical.target6 : reboot → init 6 라고 하면 시스템이 재부팅된다.리눅스는 부팅이 되면 런레벨을 확인하여 해당 모드로 부팅이 되고 시스템 환경 변수를 로그인한 사용자에게 부여한다.
로그인한 사용자는 ~/.bashrc 에 있는 내용을 현재의 환경에 적용시켜준다.
정상적으로 시스템이 부팅되고 사용자가 로그인을 했다면 리눅스 시스템은 리눅스 전체를 구동 시키기 위한 부모 프로세스를 실행 시킨다. → systemd
pstree: 프로세스 목록을 트리 형식으로 보여줌pstree -p: 프로세스 목록의 실행 순서를 숫자로 표현하여 트리 형식으로 보여줌systemd는 항상 1번(첫번째 순서)으로 실행됨# ps: 현재 실행중인 프로세스 목록
# -e: 모든 프로세스 출력
# -f: 풀 포맷으로 보여줌(UID, PID 등)
[root@rocky1 lab1]# ps -ef | grep firewalld
root 928 1 0 19:19 ? 00:00:01 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
root 8184 2948 0 20:29 pts/0 00:00:00 grep --color=auto firewalld
[root@rocky1 lab1]# kill -9 928 # -9 = SIGKILL: 프로세스 강제 종료
[root@rocky1 lab1]# systemctl stop firewalld
[root@rocky1 lab1]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
systemctl stop firewalld: 지금 당장 중지systemctl disable firewalld: 재부팅 이후에도 재활성화 되지 않는다. stop을 안하고 disable만 한다면 지금 당장 중지되지 않고 재부팅 이후에 중지되는 것이다.<이것이 리눅스다> p.193-197
ls: list, 목록 확인(a - 숨긴 파일/디렉토리, l - 상세정보)cd: 경로 이동(절대 경로 / , 상대 경로 . , ..) cd ~: 홈디렉토리cd -: 직전 디렉토리pw: 작업 경로 확인rm: 파일 삭제 +r: 디렉토리 삭제 가능하다.-f: 강제 삭제rm -rf ⭐: 최상위 디렉토리 밑에 있는 모든 파일과 디렉토리를 삭제하고, 마지막으로 자기 자신까지 삭제하는 명령어cp: 파일 복사-r: 디렉토리 복사touch: 빈파일 생성mv: 이동하기. 원본을 다른 경로로 이동 시킬 수 있다. 단, 동일 디렉토리 내에서의 이동은 ‘이름 변경’의 효과가 있다!!cat: 파일 내용 읽고 출력 > (부등호)와 함께 사용할 경우 결과를 별도의 파일로 저장하는 것도 가능하다.head, tail: 파일의 전체 내용을 출력하는 것이 아니라 상위 10줄, 또는 하위 10줄만 출력한다.-3: 위 또는 아래 3줄을 볼 수 있다. (-2, -5 … 모두 가능)more: cat은 전체 내용을 화면에 출력하고 프롬프트를 반환한다. more명령어는 긴 파일을 한 페이지씩 보여주는 명령어이다.less: more에 추가적으로 pageup, pagedown 키를 사용할 수 있다.p.167-
✅ gedit은 run level 5에서만 동작하므로 반드시 그래픽 환경에서 실행시켜야 한다.
: 파일을 직접 열고 편집을 하는 것이 아니라 프롬프트에서 명령을 통해 파일에 변경사항을 전달하는 형태 → sed
[root@rocky1 ~]# touch test.txt
[root@rocky1 ~]# gedit test.txt

[root@rocky1 ~]# sed -i 's/linux/hello/g' test.txt # 'linux' -> 'hello' 변경
[root@rocky1 ~]# cat test.txt
hello
Linux
windows
hello is ...
[root@rocky1 ~]# gedit test.txt

[root@rocky1 ~]# cat test.txt
hello
Linux
windows
hello is ...
nice to meet you, hello !!!!
hello로 시작하는 문자열에서 ‘hello’를 ‘hi’로 변경해보세요.
💡정규표현식 사용! (^)
[root@rocky1 ~]# sed -i 's/^hello/hi/g' test.txt # '^hello'는 'hello'로 시작하는 문자열을 검색함
[root@rocky1 ~]# cat test.txt
hi
Linux
windows
hi is ...
nice to meet you, hello !!!! # 'hello'로 시작하지 않기 때문에 적용 안됨!

: 파일의 내용을 직접 화면에 열고 수정, 삽입, 삭제 등을 할 수 있다. 줄 단위 삭제, 줄 단위 복사/붙여넣기 → emacs, vi(m)
[root@rocky1 ~]# echo "alias vi='vim'"
alias vi='vim'
[root@rocky1 ~]# echo "alias vi='vim'" >> ~/.bashrc
[root@rocky1 ~]# tail -1 ~/.bashrc
alias vi='vim'
[root@rocky1 ~]# source ~/.bashrc
; : 앞에 있는 명령어가 실패하더라도 뒤에 명령어 실행됨
SWAP(스왑): 시스템 메모리(RAM)의 확장 역할을 하는 디스크 공간을 말한다. 스왑 공간은 시스템 메모리가 부족할 때 데이터를 임시로 저장하여 메모리 부족 문제를 해결하는데 도움을 준다. (가상 메모리)
RAM: 휘발성 메모리 → Disk(file) 저장해줘야함
p.172
vi a.txt
해서 vi에 들어가서 입력할 때
i입력: 내가 있는 줄에서 입력o입력: 내가 있는 줄의 다음 줄에서 입력esc키, : 입력, wq | q | q!입력, enterwq: 저장 후 퇴장q: 그냥 퇴장q!: 저장하지 않고 강제 퇴장p.176-177
^ (캐럿): 행의 맨 앞으로 이동$ (달러): 행의 맨 뒤로 이동gg: 첫 행으로 이동G: 마지막 행으로 이동3G: 세번째 행으로 이동(nG)dd : 현재 행 삭제2dd: 현재 커서부터 숫자만큼의 행 삭제u: 삭제 복구(undo)ctrl + r: redoyy: 현재 행 복사p(소문자): 복사한 내용을 현재 행 이후에 붙여넣기P(대문자): 복사한 내용을 현재 행 이전에 붙여넣기/문자열 + enter: 해당 문자열을 찾음(현재 커서 이후로)n: 찾은 문자 중에서 다음 문자로 이동:%s/기존문자열/새문자열 : 기존문자열→새문자열로 변경
vi에서 행 번호 표시하기: etc + :set number
vi로 etc 밑에 있는 sudoers 파일에 가서 111행에 ‘user1 ALL=(ALL) NOPASSWD: ALL” 을 저장하고 빠져나가기
💡[root@rocky1 lab0227]# vi /etc/sudoers

:wq 입력 시

→ :wq! 입력하면 됨
SSH: 원격 접속을 위한 도구. GUI가 아닌 CLI 방식으로 접근한다.
ssh → 사용자, 그룹
ssh를 위한 인증
오늘 해볼 건 인증이다.
MobaXterm
[DSO12.DESKTOP-DIRH5RI] ⮞ whoami
DSO12
[DSO12.DESKTOP-DIRH5RI] ⮞ ssh -l root 211.183.3.11 # 로그인할 계정을 root로 설정하여 해당 ip에 ssh 접속
The authenticity of host '211.183.3.11 (211.183.3.11)' can't be established.
ED25519 key fingerprint is SHA256:eSeEYPQYafaNn/himfif4E8wy7xEvxsIslE2xEJWVFs.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '211.183.3.11' (ED25519) to the list of known hosts.
root@211.183.3.11's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 26 22:37:30 2025 from 211.183.3.1
[root@rocky1 ~]# ls -a # rocky1으로 접속됨
. .bash_profile .dbus ifcfg-ens160 Music .tcshrc .vimrc
.. .bashrc Desktop initial-setup-ks.cfg Pictures Templates .Xauthority
...
[root@rocky1 ~]# exit
logout
Connection to 211.183.3.11 closed.
[DSO12.DESKTOP-DIRH5RI] ⮞ ls -a
. .. .bash_history .ssh Desktop LauncherFolder MyDocuments
[DSO12.DESKTOP-DIRH5RI] ⮞ ls .ssh
known_hosts known_hosts.old
[DSO12.DESKTOP-DIRH5RI] ⮞ cat .ssh/known_hosts
211.183.3.11 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMo7C2tVUVBwwDlLrYxSl9YYBcC5+bSAM8M86dn1i57c
211.183.3.11 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDKtKu1T7A74TgLbUz+t3J0Qwlx9C7W/L2XlukkXjLcKFpneie0tI6SMV/fH/fcBPKb4ZoJt6ruTEHPma8x9uSRjsBFRZm0AtSBvByLlotebkCOBo9RhHuvKnONV4QFYLpGL3N8i5WhDolpihF/83HYCvRvVeqvPRmVyLkM2EqRhd5nQWuhcTF7W43/vIl1QtajwvHhc/XrNGSpocz0katlqeiCm9eWyZYat1t7g/MuBaJaWnrc8HFxa5jpi/c5by7hizn/foJ9NFrBqvtYe9M5NCvTK37lPk0w2Q3bUR4vjzLIKCwdYRhSpAXbSu+LGIxyvo1eUiJkpi+IqOfOsIQFetg1vV63yej3apqEFxCjeltq17saCTXRPGYk/A8DPEp1PIhz5JyNYXi2MEY55GprfZ+1Gs/n+GjvAs41gOp7iPe43YH6fN6nRZwcWDNc3YCKQdPgqMonBc96XXM2deGm5uqN5b8e8TnaSAnmoDFvF5VGJI34uVkzPSZ+Kfh0cE=
211.183.3.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO9nFx7oADIJ30soTZnUn0TvCx1PsQ/E828BcBC1biUENXCWLlLXkPGlOrrjppTl1mNED2WHYH1FUKHTvrRW2f
[DSO12.DESKTOP-DIRH5RI] ⮞ ssh -l root 211.183.3.11
root@211.183.3.11's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Feb 27 00:08:22 2025 from 211.183.3.1
[root@rocky1 ~]#

md5: 해시 제너레이터. 임의의 길이의 값을 입력받아서 128비트 길이의 해시값을 출력하는 알고리즘
hash: 원본 데이터를 의미하는 고정된 길이의 문자열을 발생시킨다. 이는 데이터의 무결성을 체크하기 위한 목적이다.
user가 만든 public key는 서버의 .ssh/authorization_keys에 저장

- `ssh-keygen -q -N "" -f mykey.pem` 명령어는 비밀번호 없이(`-N ""`), 출력 메시지를 최소화한 상태로(`-q`), `mykey.pem`이라는 이름의 SSH 개인 키 파일을 생성하고(`-f mykey.pem`), 그에 해당하는 공개 키 파일은 `mykey.pem.pub`로 생성하는 명령어이다.
p. 209 파일 유형, 파일 허가권

[root@rocky1 ~]# ls ~ -al # a: 숨김 파일을 포함한 모든 파일 표시, l: 상세 정보 출력
total 92
...
drwxr-xr-x. 2 root root 6 Feb 26 00:04 Public
-rw-r--r--. 1 root root 201 Feb 26 20:42 result.txt
-rw-------. 1 root root 12288 Feb 26 21:41 .swp
-rw-r--r--. 1 root root 129 Mar 14 2021 .tcshrc
...
# .ssh 디렉토리 생성
[root@rocky1 ~]# mkdir ~/.ssh
[root@rocky1 ~]# vi ~/.ssh/authorized_keys
[root@rocky1 ~]# ls ~ -al
total 92
...
drwxr-xr-x. 2 root root 6 Feb 26 00:04 Public
-rw-r--r--. 1 root root 201 Feb 26 20:42 result.txt
drwxr-xr-x. 2 root root 29 Feb 27 00:53 .ssh
-rw-------. 1 root root 12288 Feb 26 21:41 .swp
-rw-r--r--. 1 root root 129 Mar 14 2021 .tcshrc
...
[root@rocky1 ~]# chmod 700 .ssh # .ssh 디렉토리의 권한을 소유자만 읽고, 쓰고, 실행할 수 있도록 설정
[root@rocky1 ~]# ls .ssh -l
total 4
-rw-r--r--. 1 root root 103 Feb 27 00:53 authorized_keys
[root@rocky1 ~]# chmod 600 .ssh/authorized_keys # 소유자에게 읽기, 쓰기 권한 부여
chmod: 파일 또는 디렉토리의 권한 수정700: 소유자만 모든 권한을 가지며, 그룹과 다른 사용자는 권한이 없도록 설정600: 소유자만 파일을 읽고 쓸 수 있도록 하고, 그룹과 다른 사용자는 파일에 접근할 수 없도록 설정클라우드


ssh 접속 시 keypair 인증에 실패할 경우 password 인증이 되지 않도록 하고 싶다면?
ssh 서버 설정에 대한 파일 내용을 수정해 주어야 한다.
[root@rocky1 ~]# vi /etc/ssh/sshd_config

# 변경 내용 즉시 반영
[root@rocky1 ~]# systemctl restart sshd

이러한 번거로움을 덜기 위해 사용자는 .ssh/config 파일을 생성하고 이를 손쉽게 해결할 수 있다.
.ssh/config
Host ← 접속하고 싶은 서버의 이름
Hostname ← 접속하고 싶은 서버의 IP
User ← 원격지 서버에 접속하고자 할 때 어떠한 사용자로 로그인 할 것인가?
IdentityFile ← 위에서 지정한 “User’ 로 로그인할 때 어떠한 개인키를 사용할 것인가?
StrictHostKeyChecking ← 원격서버의 public 키가 없다고 하더라도 추가로 저장하지 않는다. 즉, 서버 인증 단계는 하지 않겠다!!!!
위의 내용을 참고하여
ssh rocky1 이라고 하면 원격 서버에 접속이 가능해야 합니다!!!
ssh rocky2 이라고 하면 원격 서버에 접속이 가능해야 합니다!!!
💡[DSO12.DESKTOP-DIRH5RI] ⮞ touch .ssh/config
[DSO12.DESKTOP-DIRH5RI] ⮞ vi .ssh/config

[DSO12.DESKTOP-DIRH5RI] ⮞ ssh rocky1
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Feb 27 01:04:36 2025 from 211.183.3.1
[root@rocky1 ~]# exit
logout
Connection to 211.183.3.11 closed.
[DSO12.DESKTOP-DIRH5RI] ⮞ ssh rocky2
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu Feb 27 01:28:07 2025 from 211.183.3.1
[root@rocky2 ~]# exit
logout
Connection to 211.183.3.12 closed.
ssh rocky1, ssh rocky2로 접속 가능! ✅[root@rocky1 ~]# cd /etc/sysconfig/network-scripts/
[root@rocky1 network-scripts]# ls
ifcfg-ens160
[root@rocky1 network-scripts]# cp ifcfg-ens160 ~/ifcfg-ens160.bak
[root@rocky1 network-scripts]# ls ~
a Downloads lab1 result.txt x.txt
anaconda-ks.cfg ifcfg-ens160 labl Templates
c ifcfg-ens160.bak Music test2
Desktop initial-setup-ks.cfg Pictures test.txt
Documents lab0227 Public Videos
[root@rocky1 network-scripts]# gedit ifcfg-ens160


- IP를 동적할당 해준다.
211.183.3.101로 변경한다.# ip 변경 내용 적용
[root@rocky1 network-scripts]# ifconfig ens160 down
[root@rocky1 network-scripts]# ifconfig ens160 up
# ip 확인
[root@rocky1 network-scripts]# ip a
아직 변경이 안되어서 다른 명령어 시도
[root@rocky1 network-scripts]# systemctl restart NetworkManager
[root@rocky1 network-scripts]# ifconfig ens160 down
[root@rocky1 network-scripts]# ifconfig ens160 up
[root@rocky1 network-scripts]#
[root@rocky1 network-scripts]# hostname -I
211.183.3.101 192.168.122.1
→ 성공 👍🏻
rocky2는 211.183.3.102로 변경하기 ✅
root 에서 할 일 :

user1 에서 해야할 일 (rocky1 에서 )
루트의 명령어를 실행할 필요가 있는 경우에는 명령어 앞에 sudo 를 추가해야 한다. 이 경우 일시적으로 root 의 권한을 이용할 수 있다.
결론 : rocky1 의 user1 에서 rocky2 의 user1 으로 접속할 수 있어야 한다!!!
💡root 에서 할 일 :

[root@rocky1 ~]# gedit /etc/hosts
[root@rocky1 ~]# ping rocky1 -c 3
PING rocky1 (211.183.3.101) 56(84) bytes of data.
64 bytes from rocky1 (211.183.3.101): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from rocky1 (211.183.3.101): icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from rocky1 (211.183.3.101): icmp_seq=3 ttl=64 time=0.128 ms
--- rocky1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2060ms
rtt min/avg/max/mdev = 0.090/0.105/0.128/0.016 ms
vi /etc/sudoers/로 vi에 들어가서 111행에 추가
user1 에서 해야할 일 (rocky1 에서 )
-필기 여기까지-