25/08/28 리눅스

344th·2025년 12월 11일

AWS AI

목록 보기
8/48

리눅스 부트 프로세스

init 프로세스 부팅 절차

  1. BIOS/UEFI

    • POST(Power On Self Test): 하드웨어 점검. 문제가 있다면 빨간 불 들어오고 경고음 울리면서 부팅 중단
    • 부트 디바이스를 찾아서 부트 로더에게 제어권을 넘김
  2. 부트 로더(Boot Loader)

    • 메모리에 적재
    • 설정 파일을 읽고 메모리에 적재 후 부팅 가능한 커널의 목록을 화면에 출력
    • 사용자 입력이 없을 시 자동으로 가장 위에 있는(최근의) 커널 항목이 실행됨
    • e 키를 누르면 설정 파일의 내용이 출력되고 설정 값을 변경하여 변경된 값으로 커널을 실행할 수 있음
    • 부팅하려는 커널 목록을 선택하면 커널 파일을 메모리에 적재시키고 시스템 제어권을 커널에게 넘김
    • 설정 파일 위치?
      • /boot/grub2/grub.cfg
      • /etc/default/grub
  3. 커널(Kernel)

    : 하드웨어와 소프트웨어 사이의 중계자

    • 시스템을 초기화하고 관리함
    • 첫 프로세스인 init 프로세스에게 제어권을 넘김
  4. init

    • PID 1번 할당
    • 필요한 모든 프로세스 실행
    • /etc/initab 파일에 등록된 정보를 토대로 런 레벨이 결정
    • 런 레벨: 어떤 상태로 부팅될지 결정
    • 이후 /etc/rc.d/rc.sysinit 파일을 실행하여 스왑이나 네트워크 설정을 초기화
    • 마지막으로 /etc/initab 파일에 지정된 런 레벨을 실행하고 사용자에게 로그인 화면을 출력
    **# 다 주석 처리되어 있음을 확인 가능
    $ sudo vi /etc/inittab**
    # inittab is no longer used.
    #
    # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
    #
    # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
    #
    # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
    #
    # multi-user.target: analogous to runlevel 3
    # graphical.target: analogous to runlevel 5
    #
    # To view current default target, run:
    # systemctl get-default
    #
    # 이제 여기 가서 설정해라
    **# To set a default target, run:
    # systemctl set-default TARGET.target
    
    #** 

default.target

: 시스템 전체의 직접 또는 간접적인 부모 프로세스

init 과 systemd 의 부팅 절차 차이

: 그림의 init 과 systemd 아래부터

systemd 타겟 유닛 (Target Unit)

systemd 타겟 유닛

# 시스템에 로드된 타겟 유닛들
**$ systemctl list-units -t target**
  UNIT                   LOAD   ACTIVE SUB    DESCRIPTION                  >
  basic.target           loaded active active Basic System
  cryptsetup.target      loaded active active Local Encrypted Volumes
  getty.target           loaded active active Login Prompts
  integritysetup.target  loaded active active Local Integrity Protected Vol>
  local-fs-pre.target    loaded active active Preparation for Local File Sy>
  local-fs.target        loaded active active Local File Systems
  multi-user.target      loaded active active Multi-User System
  network-online.target  loaded active active Network is Online
  network-pre.target     loaded active active Preparation for Network
  network.target         loaded active active Network
  nfs-client.target      loaded active active NFS client services
  nss-user-lookup.target loaded active active User and Group Name Lookups
  paths.target           loaded active active Path Units
  remote-fs-pre.target   loaded active active Preparation for Remote File S>
  remote-fs.target       loaded active active Remote File Systems
  rpc_pipefs.target      loaded active active rpc_pipefs.target
  rpcbind.target         loaded active active RPC Port Mapper
  slices.target          loaded active active Slice Units
  sockets.target         loaded active active Socket Units
  sshd-keygen.target     loaded active active sshd-keygen.target
  swap.target            loaded active active Swaps
  sysinit.target         loaded active active System Initialization
  timers.target          loaded active active Timer Units
  veritysetup.target     loaded active active Local Verity Protected Volumes

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
24 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
lines 1-31/31 (END)
# 현재 레벨 3 멀티유저 타겟을 사용 중?임을 알 수 있음?
$ who -r
         run-level 3  2025-08-28 00:13
         
**$ systemctl get-default**
multi-user.target

# 현재 타겟을 지우고 새로운 타겟으로 설정
**$ sudo systemctl set-default graphical.target**
Removed "/etc/systemd/system/default.target".
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.

# 현재 타겟이 바뀐 것을 확인 가능
# GUI 환경을 제공하는 타겟. 그러나 우리는 ssh 로 CLI 접속했으므로? GUI 뜨지않음
**$ systemctl get-default**
graphical.target

# 다시 멀티 유저 타겟으로 변경
**$ sudo systemctl set-default multi-user.target**
Removed "/etc/systemd/system/default.target".
Created **symlink** /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
**$ systemctl get-default**
multi-user.target

symlink ~: 심볼릭 링크로 디폴트 타겟이 멀티 유저 타겟을 가리키고 있음을 알 수 있음

사용자가 사용 가능한 타겟 유닛

emergency.target

: 가능한 최소한의 환경을 제공하는 긴급 쉘을 제공

  • read-only. 읽기 모드로 마운트됨.
    • 켜질 때 읽기 모드로 마운트된 것이지, 무조건 읽기만 가능한 것 x
    • 읽기-쓰기 모드로 리마운트하면 쓰기도 가능
  • root 사용자의 패스워드를 필요로 함
  • 네트워크도 실행되지 않음. 윈도우의 안전 모드와 유사(좀 더 심각)
  • 시스템에 심각한 문제가 있어서 다른 것으로 부팅이 안될 때 실행됨

rescue.target

: 단일 사용자 환경을 제공하는 복구 쉘

  • root 비밀번호 필요
  • 시스템 부팅 시 부팅을 완료할 수 없는 상황에서 사용
  • 네트워크 시스템 실행 x, 사용자 로그인 활성화 x
  • 읽기-쓰기 모드로 마운트
  • 복구할 때 좋은 환경

root 패스워드 복구

  1. 부트 로더 커널 항목에서 카운터 중단

    : 방향키 이동

  2. 부팅할 커널 목록에서 편집 모드로 진입

    : e 키

  3. linux 로 시작하는 줄

    • console=tty…console=ttyS….,115200n8 삭제
    • 제일 끝에 rd.break 입력
  4. Ctrl + X 를 눌러 시작

→ root 패스워드 복구 가능한 모드 emegency mode 진입

tty0

: 시스템의 기본 가상 콘솔 장치

: 일반적으로 모니터에 표시되는 화면

ttyS0

: 시리얼 포트를 통한 콘솔 연결을 의미

: 직렬 통신 포트(COM 포트)를 통해 시스템에 접근할 때 사용

KVM
: 터미널 장비

  • kvm 과 tty0 과 ttyS0 의 상관관계

    1. KVM (Kernel-based Virtual Machine)

    • KVM은 리눅스 커널 모듈로, 리눅스 위에서 하드웨어 가상화를 제공해 가상 머신(VM)을 구동할 수 있게 합니다.

    • QEMU와 함께 쓰이는 경우가 많으며, VM 안의 콘솔 출력(부팅 메시지, 로그인 프롬프트 등)을 호스트의 터미널/창에 매핑합니다.

    • VM 내부의 "가상 콘솔"은 보통 tty0이나 ttyS0에 매핑됩니다.


      2. tty0

    • tty0 = 현재 활성 가상 콘솔을 의미하는 특수 디바이스입니다.

    • tty0은 그 중 "현재 사용자가 보고 있는 콘솔"에 대한 alias 역할을 합니다. (즉, /dev/tty0에 쓰면 지금 사용자가 보고 있는 콘솔 화면에 출력됩니다.)


      3. ttyS0

    • ttyS0첫 번째 시리얼 포트(serial port) 를 의미합니다. (전통적으로 COM1)

    • 서버, 임베디드 시스템, 혹은 VM에서는 "시리얼 콘솔"로 많이 활용됩니다.

    • 커널 부팅 옵션에 console=ttyS0 같은 걸 주면, 모든 부팅 메시지와 로그인 프롬프트가 이 시리얼 포트로 출력됩니다.

    • VM 환경에서는 호스트가 이 포트를 파일이나 터미널로 연결해, virsh console 같은 명령으로 VM 내부에 접근할 수 있습니다.


      4. 상관관계

      정리하면:

    • KVM은 VM을 실행할 때 "콘솔을 어디로 보낼지"를 설정할 수 있습니다.

    • VM의 "가상 콘솔"은 보통 tty0 (그래픽/텍스트 기반 가상 콘솔)이나 ttyS0 (시리얼 콘솔)로 매핑됩니다.

    • 예를 들어:

      • console=tty0 → VM 내부의 출력이 가상 콘솔 화면(그래픽 창)에 보임.
      • console=ttyS0 → VM 내부의 출력이 시리얼 포트로 전달되고, 호스트에서 virsh console 같은 걸로 볼 수 있음.
    • 그래서 KVM에서 VM을 실행할 때,
      - GUI 창에서 화면을 보고 싶으면 tty0 기반,
      - 터미널에서 텍스트 기반 접근을 하고 싶으면 ttyS0 기반을 선택하는 방식이에요.


      ✅ 요약:

    • tty0은 현재 활성 가상 콘솔(주로 화면/키보드).

    • ttyS0은 첫 번째 시리얼 포트(텍스트 전송/원격 관리용).

    • KVM은 이 둘 중 어디를 콘솔로 쓸지 선택해서, VM의 부팅 메시지와 셸을 호스트에 연결해 줍니다.

현재 tty0 에서 GUI 를 보고 있지만, 실행되면 ttyS0 으로 넘기려고 시도

그러나 직렬 포트에 꽂혀있는 게 없으므로 자꾸 실패하다가 이후 과정이 생략되고 그냥 로그인 화면이 자꾸 뜨게 됨

→ root 패스워드 복구 가능한 모드로 진입

# 루트 파일 시스템 읽기쓰기(read-write)로 다시 마운트
**switch_root:/# mount -o remount,rw /sysroot**
**switch_root:/# chroot /sysroot**

# root 패스워드 지정개ㅐㅅ
****# 자동 레이블(label) 부여 파일 생성
# SELinux 를 사용하면 파일마다 레이블이 부여됨
# 하지만 chroot 명령을 사용하여 루트 디렉토리를 변경하게 되면
# 파일에 대한 레이블 정보가 전부 제거됨
# 따라서 파일에 대한 레이블을 재지정해야 하는데, 많은 파일을 사용자가 개별적으로 지정 불가능
# 이때 /.autorelabel 파일을 빈 파일로 생성하면 시스템이 부팅될 때 이 파일을 발견하고
# 파일에 대한 레이블을 자동으로 부여함
# 파일에 대한 레이블이 종료되면 해당 파일은 삭제되며 root 패스워드가 복구됨
**sh-5.1# passwd
sh-5.1# touch /.autorelabel**
# root 패스워드 변경 완료 후 빠져 나감
**sh-5.1# exit**
exit
**switch_root:/# exit**
logout
...

# 로그인 성공
user01 login: root
Password:
...
[root@user01 ~]#

소프트웨어 패키지

RPM(Redhat Package Manager)

rpm

: 저수준의 설치 도구

: 종속성으로 인해서 패키지 설치가 진행되지 않거나, 설치가 완료되어도 정상적으로 실행되지 않을 수 있음

-q 옵션

: 쿼리 옵션

: 패키지에게 쿼리를 전송할 때 사용

-q 쿼리 옵션과 함께 사용할 수 있는 옵션

# 설치된 패키지 전부 확인 
**$ rpm -q -a**
...
# 설치된 패키지 중에 ssh 관련 패키지 검색
**$ rpm -q -a | grep ssh**
libssh-config-0.10.4-13.el9.noarch
libssh-0.10.4-13.el9.x86_64
openssh-8.7p1-43.el9.x86_64
openssh-clients-8.7p1-43.el9.x86_64
openssh-server-8.7p1-43.el9.x86_64
**$ sudo yum install httpd -y**
Last metadata expiration check: 2:32:08 ago on Thu 28 Aug 2025 01:22:14 AM UTC.
Dependencies resolved.
...
**$ rpm -q -a | grep httpd**
httpd-tools-2.4.62-4.el9.x86_64
httpd-filesystem-2.4.62-4.el9.noarch
httpd-core-2.4.62-4.el9.x86_64
rocky-logos-httpd-90.16-1.el9.noarch
httpd-2.4.62-4.el9.x86_64

# 해당 파일이나 디렉토리가 포함된 패키지 확인
**$ rpm -q -f /usr/sbin/httpd**
httpd-core-2.4.62-4.el9.x86_64

# 관련 문서 파일 목록 확인
**$ rpm -q -d httpd**
/usr/share/man/man5/httpd.conf.5.gz
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/fcgistarter.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/htcacheclean.service.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/httpd.service.8.gz
/usr/share/man/man8/httpd.socket.8.gz
/usr/share/man/man8/httpd@.service.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz

# 파일 목록 확인
**$ rpm -q -l httpd**
/etc/httpd/conf.modules.d/00-brotli.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/usr/lib/.build-id
/usr/lib/.build-id/aa
/usr/lib/.build-id/aa/e7688c9bd8cbd9b14f3146d77f264aef0a022c
/usr/lib/.build-id/e2
/usr/lib/.build-id/e2/6b5348a09a9e62cd8c1647bfe541159f67d017
/usr/lib/systemd/system/htcacheclean.service
/usr/lib/systemd/system/httpd.service
...

# 자세한 정보 확인
**$ rpm -q -i httpd**
Name        : httpd
Version     : 2.4.62
Release     : 4.el9
Architecture: x86_64
Install Date: Thu 28 Aug 2025 03:54:30 AM UTC
Group       : Unspecified
Size        : 60681
License     : ASL 2.0
Signature   : RSA/SHA256, Mon 28 Apr 2025 07:47:37 PM UTC, Key ID 702d426d350d275d
Source RPM  : httpd-2.4.62-4.el9.src.rpm
Build Date  : Mon 28 Apr 2025 07:42:21 PM UTC
Build Host  : pb-5e4fff10-3e93-4424-980d-55df20763bed-b-x86-64
Packager    : Rocky Linux Build System (Peridot) <releng@rockylinux.org>
Vendor      : Rocky Enterprise Software Foundation
URL         : https://httpd.apache.org/
Summary     : Apache HTTP Server
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.

yum

: 고수준의 설치 도구.

: 의존성, 종속성 문제를 알아서 처리해줌

: 최신 패키지를 쉽게 찾아볼 수 있음

YUM 저장소

: 패키지들을 저장해놓은 하나의 서버

: YUM 은 저장소에 접근해서 원하는 패키지에 대한 정보를 받아오거나 패키지를 다운로드받아 설치

yum 명령을 사용해 YUM 저장소에 접근하려면 저장소의 정보를 저장하고 있는 설정 파일이 필요

# repo file: YUM 저장소에 연결할 수 있도록 설정한 파일
**$ ls -l /etc/yum.repos.d**
total 20
-rw-r--r--. 1 root root 6610 Nov  1  2024 rocky-addons.repo
-rw-r--r--. 1 root root 1165 Nov  1  2024 rocky-devel.repo
-rw-r--r--. 1 root root 2387 Nov  1  2024 rocky-extras.repo
-rw-r--r--. 1 root root 3417 Nov  1  2024 rocky.repo

# repo file 확인
**$ cat /etc/tum.repos.d/rocky.repo**
cat: /etc/tum.repos.d/rocky.repo: No such file or directory
[vagrant@user01 ~]$ cat /etc/yum.repos.d/rocky.repo
# rocky.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client.  You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.

**[baseos]**
name=Rocky Linux $releasever - BaseOS
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=BaseOS-$releasever$rltype
#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
countme=1
metadata_expire=6h
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9

...

**[appstream]**
name=Rocky Linux $releasever - AppStream
mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=AppStream-$releasever$rltype
#baseurl=http://dl.rockylinux.org/$contentdir/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
countme=1
metadata_expire=6h
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
...
**$ yum repolist**
repo id                       repo name
appstream                     Rocky Linux 9 - AppStream
baseos                        Rocky Linux 9 - BaseOS
extras                        Rocky Linux 9 - Extras
# 로컬 컴퓨터가 아니라 yum 저장소에서 정보를 가져옴
**$ yum info httpd**
Rocky Linux 9 - BaseOS                      235 kB/s | 2.5 MB     00:10
Rocky Linux 9 - AppStream                   811 kB/s | 9.5 MB     00:12
Rocky Linux 9 - Extras                      3.0 kB/s |  17 kB     00:05
Installed Packages
Name         : httpd
Version      : 2.4.62
Release      : 4.el9
Architecture : x86_64
Size         : 59 k
Source       : httpd-2.4.62-4.el9.src.rpm
Repository   : @System
From repo    : appstream
Summary      : Apache HTTP Server
URL          : https://httpd.apache.org/
License      : ASL 2.0
Description  : The Apache HTTP Server is a powerful, efficient, and
             : extensible web server.
# repo 파일이 없으면 어떻게 되는지 확인
# 안전한 곳에 우선 백엄
**$ sudo cp /etc/yum.repos.d/*.repo /tmp/
$ ls -l /tmp**
total 20
-rw-r--r--. 1 root root 6610 Aug 28 06:07 rocky-addons.repo
-rw-r--r--. 1 root root 1165 Aug 28 06:07 rocky-devel.repo
-rw-r--r--. 1 root root 2387 Aug 28 06:07 rocky-extras.repo
-rw-r--r--. 1 root root 3417 Aug 28 06:07 rocky.repo

# 레포 파일 제거
# 이제 저장소가 어디있는지 모름
**$ sudo rm /etc/yum.repos.d/*.repo
$ sudo ls -l /etc/yum.repos.d/**
total 0

# 캐싱되어있는 정보가 뜸
**$ sudo yum info httpd**
Installed Packages
Name         : httpd
Version      : 2.4.62
Release      : 4.el9
Architecture : x86_64
Size         : 59 k
Source       : httpd-2.4.62-4.el9.src.rpm
Repository   : @System
From repo    : appstream
Summary      : Apache HTTP Server
URL          : https://httpd.apache.org/
License      : ASL 2.0
Description  : The Apache HTTP Server is a powerful, efficient, and
             : extensible web server.

# 캐시 파일 확인          
**$ ls -la /var/cache/dnf/**
total 14716
drwxr-xr-x.  5 root root    4096 Aug 28 06:09 .
drwxr-xr-x. 14 root root     176 Aug 28 03:54 ..
drwxr-xr-x.  4 root root      56 Aug 28 03:54 appstream-25485261a76941d3
-rw-r--r--.  1 root root 6798614 Aug 28 01:22 appstream-filenames.solvx
-rw-r--r--.  1 root root 2880685 Aug 28 01:22 appstream.solv
-rw-r--r--.  1 root root 1609132 Aug 28 01:22 appstream-updateinfo.solvx
drwxr-xr-x.  3 root root      40 Aug 28 01:21 baseos-522ed8e2b2f761ff
-rw-r--r--.  1 root root  708444 Aug 28 01:21 baseos-filenames.solvx
-rw-r--r--.  1 root root 1845442 Aug 28 01:22 baseos.solv
-rw-r--r--.  1 root root  430325 Aug 28 01:21 baseos-updateinfo.solvx
-rw-r--r--.  1 root root       2 Aug 28 06:09 expired_repos.json
drwxr-xr-x.  3 root root      40 Aug 28 01:22 extras-90dfbd6ba528f77b
-rw-r--r--.  1 root root    3215 Aug 28 01:22 extras-filenames.solvx
-rw-r--r--.  1 root root   21336 Aug 28 01:22 extras.solv
-rw-r--r--.  1 root root       0 Aug 28 05:09 last_makecache
-rw-r--r--.  1 root root  745472 Aug 28 03:54 packages.db
-rw-r--r--.  1 root root       2 Aug 28 03:54 tempfiles.json

# 캐시 파일 삭제
**$ sudo yum clean all**
25 files removed
# repo file 을 찾을 수 없어 오류가 뜸
**$ sudo yum info httpd**
Error: No Matching packages to ~
# 저장소에 있는 apache 의 모든 정보
# 여러 다른 버전 확인 가능
**$ yum search apache**
Last metadata expiration check: 0:24:19 ago on Thu 28 Aug 2025 05:50:30 AM UTC.
====================== Name & Summary Matched: apache ======================
ant-apache-bcel.noarch : Optional apache bcel tasks for ant
ant-apache-bsf.noarch : Optional apache bsf tasks for ant
ant-apache-oro.noarch : Optional apache oro tasks for ant
ant-apache-regexp.noarch : Optional apache regexp tasks for ant
ant-apache-resolver.noarch : Optional apache resolver tasks for ant
ant-apache-xalan2.noarch : Optional apache xalan2 tasks for ant
apache-commons-logging.noarch : Apache Commons Logging
pcp-pmda-apache.x86_64 : Performance Co-Pilot (PCP) metrics for the Apache
                       : webserver
=========================== Name Matched: apache ===========================
...

# yum list 여러 옵션
**$ yum list**
all        extras     obsoletes  updates
available  installed  recent
# 설치된 패키지 목록 확인
**$ yum list installed | grep ssh**
libssh.x86_64                         0.10.4-13.el9                   @anaconda
libssh-config.noarch                  0.10.4-13.el9                   @anaconda
openssh.x86_64                        8.7p1-43.el9                    @anaconda
openssh-clients.x86_64                8.7p1-43.el9                    @anaconda
openssh-server.x86_64                 8.7p1-43.el9                    @anaconda

yum update vs. yum upgrade

yum update

: 패키지 업데이트

  • 오래된 패키지 그대로 남길수도 있음
  • 의존성 변경 시 신중하게 대처
  • 실무에서 더 많이 사용

yum upgrade

: 업데이트 + 더 깔끔하게 정리

  • 필요없는 오래된 패키지 제거
  • 의존성 변경 시 과감하게 대처 가능

dnf

yum vs. dnf

yum 공식 문서 첫 줄에 속도적인 차이만 있을 뿐 다른 차이는 없다고 써있음

인터넷 검색 혹은 ai 에게 물어보면 의존성 처리에서 차이가 있다고 하지만 과연 진짜 있는지 공식문서를 참고하는 것이 좋음

네트워크 관리

아주 중요!

**# ip a == ip address show
$ ip a**
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ed:ab:98 brd ff:ff:ff:ff:ff:ff
    **inet 10.0.2.15/24** brd 10.0.2.255 scope global **dynamic noprefixroute enp0s3**
       valid_lft 77194sec preferred_lft 77194sec
    inet6 fd17:625c:f037:2:a00:27ff:feed:ab98/64 scope global dynamic mngtmpaddr
       valid_lft 86342sec preferred_lft 14342sec
    inet6 fe80::a00:27ff:feed:ab98/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:40:fa:8f brd ff:ff:ff:ff:ff:ff
    **inet 192.168.56.11/24** brd 192.168.56.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe40:fa8f/64 scope link
       valid_lft forever preferred_lft forever

새로운 vagrant 가상 머신 생성(ip 주소 설정 x) 후

**$ ip a**
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ed:ab:98 brd ff:ff:ff:ff:ff:ff
    **inet 10.0.2.15/24** brd 10.0.2.255 scope global **dynamic noprefixroute** enp0s3
       valid_lft 86197sec preferred_lft 86197sec
    inet6 fd17:625c:f037:2:a00:27ff:feed:ab98/64 scope global dynamic mngtmpaddr
       valid_lft 86198sec preferred_lft 14198sec
    inet6 fe80::a00:27ff:feed:ab98/64 scope link
       valid_lft forever preferred_lft forever
$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=255 time=39.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=255 time=37.0 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=255 time=43.5 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=255 time=37.6 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=255 time=36.7 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=255 time=37.2 ms

hostonly network ip 주소는 없지만 외부와 통신은 됨

그러나 NAT network 가 있기에 ㅔㅑ가능(버츄얼 박스에서 처리)

그러나 호스트와 vm 사이에는 통신 불가

dynamic noprefixroute

: 동적 ip 할당. DHCP 서버로부터 할당 받아서 사용.

ifconfig

**$ ifconfig**
**enp0s3**: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        **inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255**
        inet6 fe80::a00:27ff:feed:ab98  prefixlen 64  scopeid 0x20<link>
        inet6 fd17:625c:f037:2:a00:27ff:feed:ab98  prefixlen 64  scopeid 0x0<global>
        ether 08:00:27:ed:ab:98  txqueuelen 1000  (Ethernet)
        # 수신한 패킷
        **RX packets 1098  bytes 125756 (122.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0**
        # 전송한 패킷
        **TX packets 892  bytes 135644 (132.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0**

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
**$ ifconfig**
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
				...
				# 아무것도 안했는데
				# 수신한 패킷, 전송한 패킷 수 증가했음을 확인 가능
        RX packets 1160  bytes 130258 (127.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 943  bytes 140642 (137.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
				...
# ifconfig 가 없다면
# sudo yum install net-tools
# -> ifconfig, route, netstatm, arp, hostname

현재 리눅스에서는 ip~ 의 명령을 사용하기를 권장

  • RX: 수신
  • TX: 전송
# 목적지까지 가는 라우터 경로를 출력
# 특정 패킷을 보내서 라우팅 경로를 보는 식이라
# 해당 패킷이 라우터의 게이트웨이를 빠져나가지 못하고 있음
**$ tracepath 8.8.8.8**
 1?: [LOCALHOST]                      pmtu 1500
 1:  _gateway                                              0.558ms
 1:  _gateway                                              0.461ms
 2:  no reply
 3:  no reply
 4:  no reply
 5:  no reply
 6:  no reply
 7:  no reply
 8:  no reply
 9:  no reply
10:  no reply
11:  no reply
12:  no reply
13:  no reply
14:  no reply
15:  no reply
16:  no reply
17:  no reply
18:  no reply
19:  no reply
20:  no reply
21:  no reply
22:  no reply
23:  no reply
24:  no reply
25:  no reply
26:  no reply
27:  no reply
28:  no reply
29:  no reply
30:  no reply
     Too many hops: pmtu 1500
     Resume: pmtu 1500
     
     
# 윈도우 터미널
PS C:\Users\DS 14> tracert 8.8.8.8

최대 **30홉** 이상의
dns.google [8.8.8.8]()로 가는 경로 추적:

  1     2 ms     2 ms     3 ms  192.168.0.1
  2     *        2 ms     *     118.218.200.1
  3     2 ms     2 ms     2 ms  100.73.21.97
  4     3 ms     4 ms     9 ms  10.44.249.10
  5     5 ms     3 ms     5 ms  10.222.18.132
  6     3 ms     4 ms     4 ms  10.222.9.89
  7     3 ms     3 ms     2 ms  10.222.25.241
  8    43 ms    37 ms    39 ms  209.85.149.104
  9    34 ms    35 ms    36 ms  209.85.245.105
 10    35 ms    34 ms    35 ms  108.170.227.93
 11    36 ms    36 ms    36 ms  dns.google [8.8.8.8]

추적을 완료했습니다.

traceroute

: 목적지까지 가기 위해 거치는 라우터의 정보 및 개수 출력

TTL(Time to Live)

  • 3계층(네트워크 계층)
  • 윈도우 = 128 (홉)
  • 리눅스 = 64 (홉)
  • 시간이 아니라 홉 수로 제한

: 거쳐가는 라우터의 개수

  • RIP 라우팅 프로토콜에서 사용하는 단위
    • RIP: 중소규모 망 : 거쳐가는 라우터의 개수를 세서 최소 개수의 라우터를 지나가도록 함 : 사용 metric = HOP count

tracert

# 윈도우 터미널
PS C:\Users\DS 14> tracert 8.8.8.8

최대 **30홉** 이상의
dns.google [8.8.8.8]()로 가는 경로 추적:

# TTL = 1 로 설정하여 첫번째 라우터에서 송신 패킷이 죽고
# 라우터 정보를 리턴받음(수신함)
  1     2 ms     2 ms     3 ms  192.168.0.1
# TTL = 2 로 설정하여 두번째 라우터에서 송신 패킷이 죽고
# 라우터 정보를 리턴받음(수신함)
  2     *        2 ms     *     118.218.200.1
# 반복
  3     2 ms     2 ms     2 ms  100.73.21.97
  4     3 ms     4 ms     9 ms  10.44.249.10
  5     5 ms     3 ms     5 ms  10.222.18.132
  6     3 ms     4 ms     4 ms  10.222.9.89
  7     3 ms     3 ms     2 ms  10.222.25.241
  8    43 ms    37 ms    39 ms  209.85.149.104
  9    34 ms    35 ms    36 ms  209.85.245.105
 10    35 ms    34 ms    35 ms  108.170.227.93
 11    36 ms    36 ms    36 ms  dns.google [8.8.8.8]

추적을 완료했습니다.
  • UDP 로 안쓰는 포트(서비스가 없는 포트)로 보냄
  • 목적지에 도착했을 때, 해당 UDP 포트에 서비스가 없으므로 대상 서버가 ICMP Port Unreachable 을 응답(오류 메세지)
  • 이 신호를 통해 "목적지에 도착했다"는 걸 인식할 수 있음
  • 중간 hop에서는 TTL이 0이 되므로 ICMP Time Exceeded가 오고, 이걸 hop별로 기록

네트워크 관리자(NetworkManager)

: 네트워크 설정을 동적으로 관리할 수 있게 해주는 데몬 서비스

  • 네트워크 별칭, IP주소, 정적 라우팅, DNS 정보, VPN 연결과 다수의 연결 매개 변수를 구성 가능

집, 카페, 학원 등만 다녀도 네트워크 환경이 계속 바뀌므로

동적으로 네트워크를 관리하는 것이 꼭 필요하고 중요함

→ 동적으로 네트워크 설정을 변경하는 것이 필요

# 네트워크 관리자(NetworkManager) 설치
**$ sudo yum -y install NetworkManager**
Last metadata expiration check: 0:34:17 ago on Thu 28 Aug 2025 06:56:31 AM UTC.
Package NetworkManager-1:1.48.10-8.el9_5.x86_64 is already installed.
Dependencies resolved.
============================================================================
 Package                  Arch       Version               Repository  Size
============================================================================
Upgrading:
 NetworkManager           x86_64     1:1.52.0-5.el9_6      baseos     2.3 M
 NetworkManager-libnm     x86_64     1:1.52.0-5.el9_6      baseos     1.9 M
 NetworkManager-team      x86_64     1:1.52.0-5.el9_6      baseos      28 k
 NetworkManager-tui       x86_64     1:1.52.0-5.el9_6      baseos     237 k

Transaction Summary
============================================================================
Upgrade  4 Packages

Total download size: 4.4 M
Downloading Packages:
(1/4): NetworkManager-tui-1.52.0-5.el9_6.x8  47 kB/s | 237 kB     00:05
(2/4): NetworkManager-1.52.0-5.el9_6.x86_64 468 kB/s | 2.3 MB     00:05
(3/4): NetworkManager-libnm-1.52.0-5.el9_6. 370 kB/s | 1.9 MB     00:05
(4/4): NetworkManager-team-1.52.0-5.el9_6.x 234 kB/s |  28 kB     00:00
----------------------------------------------------------------------------
Total                                       795 kB/s | 4.4 MB     00:05
Rocky Linux 9 - BaseOS                      1.6 MB/s | 1.7 kB     00:00
Importing GPG key 0x350D275D:
 Userid     : "Rocky Enterprise Software Foundation - Release key 2022 <releng@rockylinux.org>"
 Fingerprint: 21CB 256A E16F C54C 6E65 2949 702D 426D 350D 275D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                    1/1
  Upgrading        : NetworkManager-libnm-1:1.52.0-5.el9_6.x86_64       1/8
  Running scriptlet: NetworkManager-1:1.52.0-5.el9_6.x86_64             2/8
  Upgrading        : NetworkManager-1:1.52.0-5.el9_6.x86_64             2/8
  Running scriptlet: NetworkManager-1:1.52.0-5.el9_6.x86_64             2/8
  Upgrading        : NetworkManager-tui-1:1.52.0-5.el9_6.x86_64         3/8
  Upgrading        : NetworkManager-team-1:1.52.0-5.el9_6.x86_64        4/8
  Cleanup          : NetworkManager-tui-1:1.48.10-8.el9_5.x86_64        5/8
  Cleanup          : NetworkManager-team-1:1.48.10-8.el9_5.x86_64       6/8
  Running scriptlet: NetworkManager-1:1.48.10-8.el9_5.x86_64            7/8
  Cleanup          : NetworkManager-1:1.48.10-8.el9_5.x86_64            7/8
  Running scriptlet: NetworkManager-1:1.48.10-8.el9_5.x86_64            7/8
  Cleanup          : NetworkManager-libnm-1:1.48.10-8.el9_5.x86_64      8/8
  Running scriptlet: NetworkManager-libnm-1:1.48.10-8.el9_5.x86_64      8/8
  Verifying        : NetworkManager-libnm-1:1.52.0-5.el9_6.x86_64       1/8
  Verifying        : NetworkManager-libnm-1:1.48.10-8.el9_5.x86_64      2/8
  Verifying        : NetworkManager-1:1.52.0-5.el9_6.x86_64             3/8
  Verifying        : NetworkManager-1:1.48.10-8.el9_5.x86_64            4/8
  Verifying        : NetworkManager-tui-1:1.52.0-5.el9_6.x86_64         5/8
  Verifying        : NetworkManager-tui-1:1.48.10-8.el9_5.x86_64        6/8
  Verifying        : NetworkManager-team-1:1.52.0-5.el9_6.x86_64        7/8
  Verifying        : NetworkManager-team-1:1.48.10-8.el9_5.x86_64       8/8

Upgraded:
  NetworkManager-1:1.52.0-5.el9_6.x86_64
  NetworkManager-libnm-1:1.52.0-5.el9_6.x86_64
  NetworkManager-team-1:1.52.0-5.el9_6.x86_64
  NetworkManager-tui-1:1.52.0-5.el9_6.x86_64

Complete!
profile
새싹 개발자

0개의 댓글