• OOM Killer는 희생시킬 프로세스를 고르기 위해서 각 프로세스에 점수를 매기는 과정을 진행

  • OOM Killer는 메모리가 부족해졌을 때 프로세스 중 oom_score가 가장 높은 점수를 받은 순서대로 프로세스를 죽임

  • oom_score 점수는 기본적으로 프로세스에게 할당된 메모리의 양으로 점수가 메겨짐 → 해당 프로세스로부터 fork()된 자식 프로세스들의 메모리도 추가됨

  • 오래 돌고 있는 프로세스의 경우 oom_score 점수를 낮춰주고, 프로세스 순위가 낮은 프로세스는 oom_score 점수를 높여서 사용할 필요가 있음

  • 중요하게 취급되어지는 프로세스들(superuser에 의해서 실행되거나, 하드웨어와 직접적인 관련이 있는)은 값을 크게 낮춰줘서 OOM Killer를 통해서 kill되지 않도록 해야함

  • 각 서비스의 oom_score를 확인하는 방식 (PID → 프로세스 ID)

    # 기본 형식
    $ cat /proc/<pid>/oom_score
    oom_socre 출력
    
    # 19862 프로세스의 oom_score 확인
    $ cat /proc/19862/oom_score
    12

※ nice

  • 프로세스의 우선 순위를 낮춰주는 점수를 의미

oom_score_adj, oom_score, oom_adj 커널 파라미터

1. oom_score_adj

  • 앱이 포그라운드(foreground)에 있는지, 백그라운드(background)에 있는지로 결정
  • 정확한 값은 앱이 백그라운드 서비스를 가지고 있는지, 얼마나 오랫동안 포그라운드에 빠져 있는지에 따라 달라짐
  • oom_score_adj 는 -1000 ~ 1000 의 값을 가지며, 낮은 값 일수록 우선순위에서 밀려남
  • 프로세스가 OOM Killer 에 의해 죽지 않길 원한다면 oom_score 를 조정하는게 아니라 oom_score_adj 값을 변경해야함

2. oom_score

  • 기본적으로 프로세스에게 할당된 메모리의 양으로 점수가 메겨짐

3. oom_adj

  • -17 ~ 15 의 값을 가지며, 낮은 값 일수록 우선순위에서 밀려남
  • -17이면 OOM을 완전히 비활성화시킴
    /proc/<pid>/oom_adj
    /proc/<pid>/oom_score
    /proc/<pid>/oom_score_adj


OOM Killer의 대상에서 벗어나기

  • OOM Killer를 끄는 것은 불가능
  • 서비스의 안정성을 위해서 꺼지면 안 될 프로세스도 존재 → 특정한 작업을 하고 있던 worker 프로세스
  • OOM Killer를 직접적으로 끌 수는 없지만, OOM Killer의 scoring를 통해 OOM Killer가 멈추는 대상은 벗어날수 있음
  • /proc//oom_adj 값을 -17로 설정 → -17 값은 OOM_DISABLE의 상수 값
    $ echo -17 > /proc/<pid>/oom_adj
  • /proc/oom_scoring_adj 값을 -1000으로 설정
  • -1000 값으로 지정하는 것은 OOM Scoring을 비활성화한다기보다는 충분히 낮은 값을 주어서 OOM Killer에 벗어남
    $ echo -1000 > /proc/<pid>/oom_adj

관련해서 리눅스에서 실행(kill) 하는 순서

  1. alloc_pages
  2. out_of_memory
  3. select_bad_process
  4. oom_evaluate_task
  5. oom_badness

OOM Scoring과 관련된 함수들

1. select_bad_process

  • bad 프로세스를 선택

  • select_bad_process 함수 내용

    static void select_bad_process(struct oom_control *oc)
    {
      if (is_memcg_oom(oc))
          mem_cgroup_scan_tasks(oc->memcg, oom_evaluate_task, oc);
      else {
          struct task_struct *p;
    
            // RCU: Read-Copy Update
          rcu_read_lock();
    
          for_each_process(p)
              if (oom_evaluate_task(p, oc))
                  break;
          rcu_read_unlock();
      }
      oc->chosen_points = oc->chosen_points * 1000 / oc->totalpages;
    }

2. oom_evaluate_task

  • oom 선정된 프로세스가 OOM Killer를 통해 멈춰되 되는지 검증

  • oom_evaluate_task 함수 내용

    static int oom_evaluate_task(struct task_struct *task, void *arg)
    {
      struct oom_control *oc = arg;
      unsigned long points;
    
      if (oom_unkillable_task(task, NULL, oc->nodemask))
          goto next;
      /*
       * This task already has access to memory reserves and is being killed.
       * Don't allow any other task to have access to the reserves unless
       * the task has MMF_OOM_SKIP because chances that it would release
       * any memory is quite low.
       */
      if (!is_sysrq_oom(oc) && tsk_is_oom_victim(task)) {
          if (test_bit(MMF_OOM_SKIP, &task->signal->oom_mm->flags))
              goto next;
          goto abort;
      }
    
      /*
       * If task is allocating a lot of memory and has been marked to be
       * killed first if it triggers an oom, then select it.
       */
      if (oom_task_origin(task)) {
          points = ULONG_MAX;
          goto select;
      }
    
      points = oom_badness(task, NULL, oc->nodemask, oc->totalpages);
      if (!points || points < oc->chosen_points)
          goto next;
    
      /* Prefer thread group leaders for display purposes */
      if (points == oc->chosen_points && thread_group_leader(oc->chosen))
          goto next;
    select:
      if (oc->chosen)
          put_task_struct(oc->chosen);
      get_task_struct(task);
      oc->chosen = task;
      oc->chosen_points = points;
    next:
      return 0;
    abort:
      if (oc->chosen)
          put_task_struct(oc->chosen);
      oc->chosen = (void *)-1UL;
      return 1;
    }

3. oom_badness

  • kill 했을 때 가장 높은 메모리를 확보할 수 있는 task 인 경우, 높은 점수를 return 한다는 개념

  • oom_badness() 함수가 리턴해주는 점수가 가장 높은 task가 bad_process로 선정 되어 죽게 됨

  • oom_score_adj 라는 값을 oom_badness 에서 LONG_MIN 을 리턴하기 위해 사용 → LONG_MIN 을 리턴한다는 개념은 낮은 점수를 줘서 kill 하지 못하게 하겠다는 의미

  • RSS (프로세스가 사용하고 있는 물리 메모리) + 프로세스의 스왑 메모리 + (프로세스의 pagetable / page_size) 의 값이 프로세스 (task)의 점수 (point) 가 됨

  • 해당 코드만 보면 프로세스가 점유하고 있는 메모리가 클 경우 score가 높아진다고 이해 가능

  • oom_badness 함수 내용

    /**
     * oom_badness - heuristic function to determine which candidate task to kill
     * @p: task struct of which task we should calculate
     * @totalpages: total present RAM allowed for page allocation
     *
     * The heuristic for determining which task to kill is made to be as simple and
     * predictable as possible.  The goal is to return the highest value for the
     * task consuming the most memory to avoid subsequent oom failures.
     */
    long oom_badness(struct task_struct *p, unsigned long totalpages)
    {
        long points;
        long adj;
    
        if (oom_unkillable_task(p))
            return LONG_MIN;
    
        p = find_lock_task_mm(p);
        if (!p)
            return LONG_MIN;
    
        /*
         * Do not even consider tasks which are explicitly marked oom
         * unkillable or have been already oom reaped or the are in
         * the middle of vfork
         */
        adj = (long)p->signal->oom_score_adj;
        if (adj == OOM_SCORE_ADJ_MIN ||
                test_bit(MMF_OOM_SKIP, &p->mm->flags) ||
                in_vfork(p)) {
            task_unlock(p);
            return LONG_MIN;
        }
    
        /*
         * The baseline for the badness score is the proportion of RAM that each
         * task's rss, pagetable and swap space use.
         */
        points = get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS) +
            mm_pgtables_bytes(p->mm) / PAGE_SIZE;
        task_unlock(p);
    
        /* Normalize to oom_score_adj units */
        adj *= totalpages / 1000;
        points += adj;
    
        return points;
    }

4. get_mm_rss 함수

  • get_mm_rss() 함수를 사용하여 여유 메모리(free memory)가 얼마나 되는지 추정
    static inline unsigned long get_mm_rss(struct mm_struct *mm)
    {
        return get_mm_counter(mm, MM_FILEPAGES) +
            get_mm_counter(mm, MM_ANONPAGES) +
            get_mm_counter(mm, MM_SHMEMPAGES);
    }

5. get_mm_counter 함수

  • get_mm_counter 함수를 통해 swap 메모리(swap memory)가 얼마나 되는지 추정

    static inline unsigned long get_mm_counter(struct mm_struct *mm, int member)
    {
        long val = atomic_long_read(&mm->rss_stat.count[member]);
    
        #ifdef SPLIT_RSS_COUNTING
        /*
         * counter is updated in asynchronous manner and may go to minus.
         * But it's never be expected number for users.
         */
        if (val < 0)
            val = 0;
        #endif
        return (unsigned long)val;
    }

  • 링 버퍼(Ring Buffer)는 원형 큐로 약간의 개량해서 사용
  • 링 버퍼는 가변적인 데이터를 처리
  • 기본적으로 네트워크의 처리 단위 : 1/1000 초
  • 기본적으로 CPU의 처리 단위 : 1/1000000 초 이하
  • 네트워크와 CPU는 처리 속도가 수 백에서 수 만 배 차이 발생
  • 네트워크의 통신에서 패킷의 크기가 고정되어 있으면 프로그램이 쉽지만 필요 없는 데이터까지 입/출력에 포함되어 있어서 네트워크의 성능을 떨어짐
  • 가변적인 크기를 가진 패킷을 사용하는데 가변 크기를 가진 패킷을 저장하기 위해 링 버퍼(Ring Buffer)라는 자료구조를 사용
  • 링 버퍼(Ring Buffer)는 분해된 패킷을 합치거나 완성되지 않은 자투리 패킷을 완전한 패킷으로 만들 수 있는데 편리
  • 링 버퍼(Ring Buffer)는 Byte 단위로 저장할 공간만 있으면 동작함.
  • FIFO 기반의 일반적인 선형 큐의 메모리가 꽉 차게되면 Overflow가 발생 하지만 링 버퍼(Ring Buffer)는 head와 tail이 붙어 있는 형태의 큐를 구성으로 dropped 되어 유실되는 packet을 방지 가능

Network Ring Buffer Size 설정

  • Ring Buffer는 네트워크 카드의 버퍼 공간
  • 스위치에서 서버로 전달된 패킷의 전달 과정
    1. 네트워크 카드 내 Ring Buffer 에 보관 (NIC 카드 → Ring Buffer)
    2. 커널의 Socket RCV Buffer로 이동 (Ring Buffer → Socket RCV Buffer)
    3. User Application의 read 함수를 통해 전달 (Socket RCV Buffer → Application의 read()가 값 읽음)
  • Kernel의 Socket RCV Buffer가 여유가 있더라도 Ring Buffer Size가 작다면 중간 병목(bottleneck)이 발생 → Ring Buffer는 가능하다면 Maximum 값으로 설정해주는 것이 권장
  • 리눅스에서는 패킷 송수신시 1계층 물리적 케이블을 통하여 NIC로 packet이 수신 되면 가장 먼저 Ring Buffer 라는 영역에 보관한 뒤에 처리

  • Linux 상에서 NIC의 Ring Buffer(Current, Maximum) 값은 ethtool -g 명령어를 통해 확인 가능
    1. eth1 maximum으로 처리 가능한 ring buffer size는 4096임
    2. eth1 Current으로 처리 가능한 ring buffer size는 512으로 설정
    3. 리눅스 상에서packet 의 drop 과 error 를 줄이기 위해서 maximum 과 Current 동일하게 설정하는 것이 좋음
      # interface의 경우 최대 값이 4,096이지만 현재 설정 값은 512
      $ ethtool -g em1
      Ring parameters for em1:
      Pre-set maximums:
      RX:             4096
      RX Mini:        0
      RX Jumbo:       0
      TX:             4096
      Current hardware settings:
      RX:             512
      RX Mini:        0
      RX Jumbo:       0
      TX:             512

  • ethtool -G 명령어에 해당 파라미터를 maximum 값과 동일하게 설정 한뒤 설정 값을 변경

    # ethtool -G 명령어를 통해 ring buffer를 최대 값으로 설정
    $ ethtool -G em1 rx 4096
    $ ethtool -G em1 tx 4096
    
    # 변경된 ring buffer 내용 확인
    $ ethtool -g em1
    Ring parameters for em1:
    Pre-set maximums:
    RX:             4096
    RX Mini:        0
    RX Jumbo:       0
    TX:             4096
    Current hardware settings:
    RX:             4096
    RX Mini:        0
    RX Jumbo:       0
    TX:             4096



Network Ring Buffer Size 확대 영구적으로 등록

  • 대부분의 Linux 설정과 같이 명령어는 현재 메모리 상의 값을 변경하기 때문에 재부팅 시에는 이전 값으로 원복됨
  • 영구적으로 변경하기 위해서는 Network script 내 해당 Interface에 관련 설정 값을 추가해주는 것이 필요
  • 아래와 같이 스크립트 파일 내 ETHTOOL_OPTS 옵션을 추가한 후 해당 설정 값을 입력 → rx/tx의 최대 값을 확인 후 작성 필요
    $ cat /etc/sysconfig/network-scripts/ifcfg-em1
    TYPE=Ethernet
    BOOTPROTO=static
    DEFROUTE=yes
    NAME=em1
    DEVICE=em1
    ONBOOT=yes
    IPADDR=1.255.156.21
    NETMASK=255.255.255.224
    GATEWAY=1.255.156.1
    ETHTOOL_OPTS="-G ${DEVICE} rx 4096 ; -G {$DEVICE} tx 4096"
  • 재부팅시에 Network Ring Buffer Size 확대 명령어 실행 → rc-local.service 사용
    $ vi /etc/rc.local
    # 아래의 값이 등록
    ethtool -G eth1 rx 4096
    ethtool -G eth1 tx 4096


※ 참고 사항 → rc-local.service를 실행하는 방법

# rc-local.service를 실행할 수 있는 환경 적용
$ echo -e "\n[Install]\nWantedBy=multi-user.target" >> /usr/lib/systemd/system/rc-local.service
$ chmod u+x /etc/rc.d/rc.local

 # rc-local.service 실행
/bin/systemctl daemon-reload
/bin/systemctl restart rc-local.service
/bin/systemctl enable rc-local.service

$ echo -e "rc-local.service가 rebooting에도 실행되는 지 확인"
/bin/systemctl list-unit-files | grep rc.local



※ 패킷 전송 및 수신 에 관련된 버퍼 참고 사항


  • 패킷과 밀접한 관련이 있는 것이 네트워크 이더넷 카드
  • 네트워크 디바이스 드라이버와 하드웨어 셋팅을 보거나 설정할 수 있는 ethtool 명령어를 잘 알아야함
  • 이더넷 정보를 확인할 때 대표적인 도구가 ifconfig 명령어 → ifconfig 명령어를 통해 링크상태, IP 주소, 맥 주소, 통신 상태 현황 등을 확인 가능
  • ethtool 명령어는 ifconfig 명령어 보다 더 자세하고 섬세하게 이더넷을 설정하고 확인 가능

1. ethtool 명령어 기본 사용 방법

ethtool [옵션] [ethX] [파라미터]



2. ethtool 명령어 기본 정보 → 링크 모드와 속도, Duplex 상태 출력

  • 일목요연하게 이더넷 인터페이스에 대한 정보 확인 가능
    $ ethtool eth0
    Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full
                           100baseT/Half 100baseT/Full
                           1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes:  10baseT/Half 10baseT/Full
                           100baseT/Half 100baseT/Full
                           1000baseT/Full
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: umbg
    Wake-on: d
    Current message level: 0x00000007 (7)
            drv probe link
    Link detected: yes


3. ethtool 명령어에 -s 옵션 사용 → -s 옵션은 속도, Duplex 등의 값을 변경 가능

  • ethtool 명령어에 -s 옵션 사용할 때 설정 참고 자료
    ethtool -s ethX speed N [duplex half|full] [port tp|aui|bnc|mii]
                [autoneg on|off] [advertise N] [phyad N] [xcvr internal|external]
                [wol p|u|m|b|a|g|s|d...]  [sopass xx:yy:zz:aa:bb:cc] [msglvl N |
                msglvl type on|off ...]

  • Auto-negotiation, Speed 및 Duplex를 조정하기 위해서 Auto-negotiation 기능을 Off하고 Speed를 100, Duplex를 half로 설정

    $ ethtool -s eth0 autoneg off speed 100 duplex half
    
    # 설정 변경 반영 확인
    $ ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes:   10baseT/Half 10baseT/Full
                           100baseT/Half 100baseT/Full
                           1000baseT/Half 1000baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes:  Not reported
    Advertised pause frame use: No
    Advertised auto-negotiation: No
    Speed: 100Mb/s
    Duplex: Half
    Port: MII
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: off
    Supports Wake-on: pumbg
    Wake-on: g
    Current message level: 0x00000033 (51)
            drv probe ifdown ifup
    Link detected: yes

  • ※ 참고
    • 참고로 e1000 드라이버를 사용하고 있는데, 설정이 제대로 반영되지 않는 문제 발생 → NIC 드라이버의 특성 (드라이버의 패치가 필요)
    • 다른 컴퓨터에서 사용하고 있는 r8169 드라이버에서는 변경이 잘 이줘짐
    • ethtool 명령어가 안되면 아래의 modprobe 명령어 사용
    • 사용하는 네트워크 인터페이스에 따라 차이가 있을 수 있다는 점을 참고 필요



4. ethtool 명령어 X, modprobe 명령어로 e1000 드라이버 옵션을 설정 가능 → ethtool 명령어 적용 X

  • modprobe 명령어로 e1000 드라이버에 대한 옵션을 아래와 같은 형태로 설정
    modprobe e1000 [<option>=<VAL1>,<VAL2>,...]

  • Duplex 를 0 으로 설정한 예
    $ modprobe e1000 Duplex=0  (0=auto-negotiate, 1=half, 2=full)


5. ethtool 명령어에 -i 옵션 사용 → 드라이버에 대한 정보 확인

  • e1000 드라이버를 사용하고 있고, eeprom 접근이 가능한지 여부 확인
    $ ethtool -i eth0
    driver: e1000
    version: 7.3.21-k8-NAPI
    firmware-version: N/A
    bus-info: 0000:00:03.0
    supports-statistics: yes
    supports-test: yes
    supports-eeprom-access: yes
    supports-register-dump: yes


6. ethtool 명령어에 -S 옵션 사용 → 인터페이스 통계 정보 확인

  • rx,tx 의 패킷 전송 개수, 바이트 정보, 브로드캐스팅 정보들 확인 가능
  • 대문자 S 를 사용했다는 점을 주의 필요
  • 소문자 s 는 설정 할때 사용
    $ ethtool -S eth0
    NIC statistics:
       rx_packets: 10
       tx_packets: 29
       rx_bytes: 2145
       tx_bytes: 4100
       rx_broadcast: 0
       tx_broadcast: 3
       rx_multicast: 0
       tx_multicast: 18
       rx_errors: 0
       tx_errors: 0
       tx_dropped: 0


7. ethtool 명령어에 -a 옵션 사용 → Pause 파라미터에 대한 정보를 출력

  • Auto Negotiation 정보를 좀 더 상세히 출력
    $ ethtool -a eth0
    Pause parameters for eth0:
    Autonegotiate: on
    RX:  on
    TX:  off


8. ethtool 명령어에 -p 옵션 사용 → 특정 포트에 LED를 깜빡

  • 어뎁터가 4개의 포트를 가지고 있다고 가정하고, eth3번이 어떤 포트인지 알고 싶을때 LED 를 깜빡 거리게 하여 알려줌
    $ ethtool -p eth3


9. ethtool 명령어에 -k 옵션 사용 → 디바이스의 Offload 정보 출력

  • Offload는 이더넷 카드에서 TOE 기능을 지원하게 되면 사용할 수 있는 기능
  • TOE
    • NIC(Network Interface Cards)에서 사용되는 기술
    • 보통 운영체제 상에서 처리되는 TCP/IP 스택을 네트워크 컨트롤러로 내려서 처리
    • 네트워크 처리가 크게 필요한 기가비트나 10G 기가비트같은 고속네트워크에서 유용하게 사용
      $ ethtool -k eth0
      Offload parameters for eth0:
      rx-checksumming: on
      tx-checksumming: on
      scatter-gather: on
      tcp-segmentation-offload: on
      udp-fragmentation-offload: off
      generic-segmentation-offload: on
      generic-receive-offload: on
      large-receive-offload: off
      rx-vlan-offload: on
      tx-vlan-offload: on
      ntuple-filters: off
      receive-hashing: off


10. ethtool 명령어 이외에 lshw명려어를 이용해 network 관련한 정보를 확인 가능

  • lshw(Hardware Lister)는 메모리, 펌웨어 버전, 메인보드, CPU, 네트워크, 디스크 등의 정보를 알려주는 명령어
  • -C 옵션은 lshw에서 제공하는 하드웨어 정보 중 원하는 것만 출력
    $ lshw -C network
    *-network              
         description: Ethernet interface
         product: 82540EM Gigabit Ethernet Controller
         vendor: Intel Corporation
         physical id: 3
         bus info: pci@0000:00:03.0
         logical name: eth0
         version: 02
         serial: 08:00[deleted]:d0
         size: 1Gbit/s
         capacity: 1Gbit/s
         width: 32 bits
         clock: 66MHz
         capabilities: pm pcix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
         configuration: autonegotiation=on broadcast=yes driver=e1000 driverversion=7.3.21-k8-NAPI duplex=full firmware=N/A ip=10.0.2.15 latency=64 link=yes mingnt=255 multicast=yes port=twisted pair speed=1Gbit/s
         resources: irq:10 memory:f0000000-f001ffff ioport:d010(size=8)

CentOS ISO 파일

1. CentOS6 ISO 파일 → EOL 초과로 서비스 지원 만료

centos6.9 버전 : http://repos-va.psychz.net/centos/6.9/isos/x86\_64/
centos6.10 버전 : http://repos-va.psychz.net/centos/6.10/isos/x86\_64/

2. CentOS7 ISO 파일

CentOS7.4 버전 : http://repos-va.psychz.net/centos/7.4.1708/isos/x86_64/
CentOS7.5 버전 : http://repos-va.psychz.net/centos/7.5.1804/isos/x86\_64/
CentOS7.6 버전 : http://repos-va.psychz.net/centos/7.6.1810/isos/x86\_64/
CentOS7.7 버전 : http://repos-va.psychz.net/centos/7.7.1908/isos/x86\_64/
CentOS7.8 버전 : http://repos-va.psychz.net/centos/7.8.2003/isos/x86\_64/
CentOS7.9 버전 : http://repos-va.psychz.net/centos/7.9.2009/isos/x86\_64/

3. CentOS8 ISO 파일 → EOL 초과로 서비스 지원 만료

CentOS8.1 버전 : http://repos-va.psychz.net/centos/8.0.1905/isos/x86_64/
CentOS8.2 버전 : http://repos-va.psychz.net/centos/8.2.2004/isos/x86_64/
CentOS8.3 버전 : http://repos-va.psychz.net/centos/8.3.2011/isos/x86_64/
CentOS8.4 버전 : http://repos-va.psychz.net/centos/8.4.2105/isos/x86_64/


CentOS 버전의 EOL

1. CentOS6 EOL

  • 출시 → 2011년 7월 10일
  • EOL → 2020년 11월 30일 (9년)

2. CentOS7 EOL

  • 출시 → 2014년 7월 7일
  • EOL → 2024년 7월 7일 (10년)

3. CentOS8 EOL

  • 출시 → 2019년 9월 25일
  • EOL → 2021년 12월 31일 (2년 3개월)
  • 레드햇이 CentOS8 지원을 중단
  • 레드햇이 Fedora → CentOS Stream → RedHat Enterprise으로 레드햇 리눅스 리스 주기 변경
  • UEFI는 통합 확장 펌웨어 인터페이스(Unified Extensible Firmware Interface)의 줄임말
  • UEFI는 BIOS를 대체하기 위해 등장한 시스템으로 보안 부팅(Secure Booting)이 가능하며, BIOS에 비해서 더욱 큰 디스크 용량을 지원하고, 더욱 고급스러운 GUI를 제공함
  • 최근에 출시되는 컴퓨터 메인보드에는 기본적으로 UEFI가 탑재되어 출시
  • UEFI는 사용자 입장에서도 손쉽게 하드웨어를 조작할 수 있도록 해줌


기본 ISO 파일 다운

kickstart ISO 파일을 만들기 위한 기초 작업

  • kickstart 파일은 설치된 RHEL/CentOS의 /root 디렉토리에 있는 anaconda-ks.cfg란 파일을 이용하는 것이 가장 효율

  • OS를 설치할 때 설정한 시간대, 패키지, 네트워크, 디스크 파티션 등등의 내용이 모두 들어 있음

  • CDROM을 사용하여 킥스타트 설치를 실행 → 디스크의 최상위 디렉토리에 배치되어야 함

    $ pwd
    /root/kickstart_iso_file
    
    # os파일과 mount할 디렉토리 생성
    $ mkdir uefi_ios
    
    # 현재 /root/kickstart_iso_file 디렉토리 아래의 내용 확인
    $ ls
    uefi_iso  CentOS-7-x86_64-Minimal-2009.iso
    
    # centos7 iso 파일을 수정하기 위해 uefi_iso 디렉토리에 mount
    $ mount -o loop CentOS-7-x86_64-Minimal-2009.iso ueif_iso/
    mount: /dev/loop0 is write-protected, mounting read-only
    
    # loop 디바이스로 mount한 내용 확인
    $ df -h | grep loop
    /dev/loop0      973M  973M     0 100% /root/kickstart_iso_file/uefi_iso
    
    # mount한 기본 Centos7 내용 확인
    $ ls uefi_iso/
    CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
    EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL
    
    # 커스터마이징할 iso 이미지를 만들기 위한 디렉토리 생성 후 기본 Centos7 내용 복사
    $ mkdir kickstart_uefi_iso
    $ cp -a uefi_iso/. kickstart_uefi_iso/
    
    # kickstart ueif ISO 파일을 만들기 위한 기본 디렉토리 생성
    # cp 명령어 실행 후 반드시 확인 필요 → kickstart_uefi_iso 디렉토리 안에에 .discinfo, .treeinfo 파일이 정상적으로 복사 확인 必
    # 두 개의 파일이 없으면 CD-ROM 이미지가 없다는 메세지가 발생하면서 문제 생김
    $ ls -al kickstart_uefi_iso/
    total 116
    drwxr-xr-x 8 root root  4096 Nov  3  2020 .
    drwxr-xr-x 4 root root  4096 Nov  2 01:30 ..
    -rw-r--r-- 1 root root    14 Oct 30  2020 CentOS_BuildTag
    -rw-r--r-- 1 root root    29 Oct 27  2020 .discinfo
    drwxr-xr-x 3 root root  4096 Oct 27  2020 EFI
    -rw-rw-r-- 1 root root   227 Aug 30  2017 EULA
    -rw-rw-r-- 1 root root 18009 Dec 10  2015 GPL
    drwxr-xr-x 3 root root  4096 Oct 27  2020 images
    drwxr-xr-x 2 root root  4096 Nov  3  2020 isolinux
    drwxr-xr-x 2 root root  4096 Oct 27  2020 LiveOS
    drwxr-xr-x 2 root root 36864 Nov  3  2020 Packages
    drwxr-xr-x 2 root root  4096 Nov  3  2020 repodata
    -rw-rw-r-- 1 root root  1690 Dec 10  2015 RPM-GPG-KEY-CentOS-7
    -rw-rw-r-- 1 root root  1690 Dec 10  2015 RPM-GPG-KEY-CentOS-Testing-7
    -r--r--r-- 1 root root  2883 Nov  3  2020 TRANS.TBL
    -rw-r--r-- 1 root root   354 Oct 27  2020 .treeinfo
    
    # 리눅스에서 iso 파일을 만드는 패키지 설치
    $ yum install -y genisoimage

※ 루프 디바이스(loop device)

  • 파일을 실제 물리적으로 존재하는 블록 디바이스 처럼 접근 가능하도록 한 가상 장치


UEFI 버전 kickstart ISO 파일 생성

1. kickstart를 실행할 uefi_ks.cfg 파일 생성

  • uefi_ks.cfg는 OS 설치하면 생성되는 anaconda-ks.cfg 파일 내용을 변경해서 생성하면 됨

  • uefi_ks.cfg 파일의 위치는 kickstart_uefi_iso 디렉토리 바로 아래에 위치(kickstart_uefi_iso 디렉토리 최상단)

  • 비밀번호는 linux7890으로 임의 지정 → ISO 파일 만들면 초기 설정에서는 변경이 불가능(OS 재설치 후 변경하면 됨)

  • uefi의 경우 → fstype는 efi로 fstype으로 설정

    $ pwd
    /root/kickstart_iso_file
    
    $ vi kickstart_uefi_iso/uefi_ks.cfg
    #version=DEVEL
    # System authorization information
    auth --enableshadow --passalgo=sha512
    # CDROM
    install
    cdrom
    # Use graphical install
    graphical
    # Run the Setup Agent on first boot
    firstboot --enable
    ignoredisk --only-use=sda
    # Keyboard layouts
    keyboard --vckeymap=us --xlayouts='us'
    # System language
    lang en_US.UTF-8
    
    # Network information
    network  --hostname=localhost.localdomain
    
    # Root password
    rootpw --iscrypted $6$WuNr09tS$BqTZlg86ZAyWAxQ//HiH1LY1gPoHleiHuhLPrlvxy8pKAWv5J5xRKlP6BCVos/MvroIIbcQ7OQktD0I1y167E.
    # System services
    services --disabled="chronyd"
    # System timezone
    timezone Asia/Seoul --isUtc --nontp
    # System bootloader configuration
    bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
    # Partition clearing information
    clearpart --all --initlabel --drives=sda
    # Disk partitioning information
    part /boot/efi --fstype="efi" --ondisk=sda --size=500
    part swap --fstype="swap" --ondisk=sda --size=32768
    part / --fstype="ext4" --ondisk=sda --grow
    
    %packages
    @^minimal
    @core
    kexec-tools
    
    %end
    
    %addon com_redhat_kdump --enable --reserve-mb='auto'
    
    %end
    
    %anaconda
    pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
    pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
    %end
    
    #  kickstart_uefi_iso 디렉토리 아래에 kickstart를 실행할 uefi_ks.cfg가 있음을 확인(iso 파일을 만들 디렉토리 최상단에 존재해야함)
    $ ls kickstart_uefi_iso/
    CentOS_BuildTag  EFI  EULA  GPL  images  isolinux  LiveOS  Packages  repodata  RPM-GPG-KEY-CentOS-7  RPM-GPG-KEY-CentOS-Testing-7  TRANS.TBL  uefi_ks.cfg

2. 생성한 uefi_ks.cfg 파일 검증

  • ks.cfg 파일을 검증 → 미리 검증함으로써 iso 파일 만들기 전에 시간 낭비를 비할 수 있음

  • 검증을 했는데 아무 값도 출력되지 않으면 ks.cfg 파일이 정상이라는 의미 → 에러 발생시 수정 옵션 확인 필요

    $ pwd
    /root/kickstart_iso_file
    
    # anaconda_ks.cfg 파일의 문법적 오류 확인 -> 위에서 만들었기에 해당 내용은 통과.... 만약 설치 안했을 경우 설치 필요
    $ yum install -y pykickstart
    
    # 검증 -> 출력 결과가 없어야 OK
    $ ksvalidator kickstart_uefi_iso/uefi_ks.cfg

3. OS 설치 할 때 기본 설정 BOOT MODE가 UEFI인 경우 uefi_ks.cfg 파일 설정을 적용 → grub.cfg 파일 변경

  • kickstart_uefi_iso//EFI/BOOT/grub.cfg 파일 내용 변경 혹은 추가 필요

  • ks=cdrom:/uefi_ks.cfg의 kickstart 파일을 읽음

  • grub.cfg는 UEFI가 OS 설치할 때 실행되는 화면

    $ pwd
    /root/kickstart_iso_file
    
    $ vi kickstart_uefi_iso/EFI/BOOT/grub.cfg
    set default="1"
    [..중략...]
    ### BEGIN /etc/grub.d/10_linux ###
    menuentry 'Install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
      linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
      initrdefi /images/pxeboot/initrd.img
    }
    menuentry 'Kickstart UEFI INSTALLATION by CDROM' --class fedora --class gnu-linux --class gnu --class os {
          linuxefi /images/pxeboot/vmlinuz ks=hd:cdrom:/uefi_ks.cfg
          initrdefi /images/pxeboot/initrd.img
    }
    menuentry 'Test this media & install CentOS 7' --class fedora --class gnu-linux --class gnu --class os {
          linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
          initrdefi /images/pxeboot/initrd.img
    }
    submenu 'Troubleshooting -->' {
          menuentry 'Install CentOS 7 in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os {
                  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet
                  initrdefi /images/pxeboot/initrd.img
          }
          menuentry 'Rescue a CentOS system' --class fedora --class gnu-linux --class gnu --class os {
                  linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet
                  initrdefi /images/pxeboot/initrd.img
          }
    }

4. ustom iso 이미지 만들기

  • kickstart_uefi_iso/ 디렉토리를 Centos7-Kickstart-Uefi-Install.iso 이름의 iso파일로 생성

  • 완료되면 Centos7-Kickstart-Uefi-Install.iso를 다운 받아서 사용하면 됨

    $ pwd
    /root/kickstart_iso_file
    
    $ mkisofs -r -T -J -V "Centos 7 Custom CD" -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -e images/efiboot.img   -boot-load-size 4 -boot-info-table -o ./Centos7-Kickstart-Uefi-Install.iso kickstart_uefi_iso/
    [..중략...]
    Total translation table size: 124656
    Total rockridge attributes bytes: 55185
    Total directory bytes: 92160
    Path table size(bytes): 140
    Max brk space used a1000
    528246 extents written (1031 MB)
    
    $ ls
    bios_iso  Centos7-Kickstart-Uefi-Install.iso  kickstart_bios_iso  kickstart_uefi_iso

  • 리눅스(linux) 서버에 무한정으로 로그인 시도를 할 경우, 언젠가는 보안이 풀릴 위험이 있음
  • 외부에서 무한정으로 로그인 시도할 경우, 최대시도 횟수 설정이 있다면 외부 위협을 어느 정도 벗어날 수 있음
  • 보안 설정에 필요한 pam_tally2 모듈
    1. pam_tally2 모듈은 접속 시도가 계속 틀릴 경우 횟수에 제한을 설정하여 일정 시간 동안 계정 잠금 상태로 설정
    2. pam_tally2 모듈은 대부분의 Linux 배포판에 이미 설치되어 있으며, PAM 패키지에 의해 제어


리눅스 최대 로그인 횟수 설정하기, pam_tally2.so 모듈 사용

  • 리눅스 일반 사용자 계정의 로그인 시도 액세스 설정을 구성하려면 /etc/pam.d/password-auth 파일에 설정 추가

  • /etc/pam.d/password-auth 파일을 열고 아래 설정 추가

    auth       required    pam_tally2.so   deny=5   unlock_time=1800   no_magic_root   reset
    account  required    pam_tally2.so   no_magic_root

  • /etc/pam.d/password-auth 파일의 추가 설정 설명

    1. deny=5 → 5회 시도 후 접근을 거부하고 사용자를 잠급
    2. unlock_time=1800 → 계정은 30분동안 잠김. (수동 잠금을 해제할 때까지 영구적으로 잠그려면 unlock_time를 제거)
    3. no_magic_root → root는 패스워드 잠금 설정하지 않음
    4. reset → 접속 시도 성공 시 실패한 횟수 초기화


리눅스 일반 계정 반복 실패 후 로그인 시도 횟수 확인

  • 새로운 계정을 만들어 로그인 실패시 위 설정한 /etc/pam.d/password-auth 파일 내용이 정상 동작하는지 테스트 확인

  • 새로운 test 계정 생성 후 비밀번호 반복해서 실패

  • test 계정이 더 이상 접속 실패 상태를 확인하기

    # test 계정 생성
    $ adduser test
    
    # 6회 비밀번호 실패 후 test 계정 접속 실패 상태 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test                6



리눅스 일반 계정 접속 횟수 초기화

  • test 계정이 반복 실패하여서 잠긴 경우 일시적으로 접속 불가

  • 필요에 따라 접속을 허용해야하는 경우 -r 옵션을 사용하여 리셋해줌

  • pam_tally2 명령어의 -r 옵션은 잠금 실패 리셋을 의미 → 초기화 후 로그인 실패 횟수가 0으로 변경 확인

    $ pam_tally2 -u test -r
    
    # 계정 초기화 확인
    $ pam_tally2 -u test
    Login           Failures Latest failure     From
    test               0

  • grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력 → 들어오는 입력에 대해 주어진 패턴을 포함하는 줄들을 출력
  • grep 명령어는 tail이나 ls, find 등 다양한 명령어와 조합하여 응용 가능


AND 조건 사용법

  • 패턴들이 모두 포함된 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep을 여러번 사용

  • Pipe( | )를 이용해 여러번 사용
    $ iptables -L | grep -i 'DROP' | grep -i 'tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP과 tcp dpt:snapenetio이 모두 포함된 줄을 출력 → 순서에 상관 없이 두 패턴이 동시에 포함된 줄들을 출력
  • .*을 사용하여 AND 사용
    # .*을 사용하여 AND를 표시
    $ iptables -L | grep -iE 'DROP.*tcp dpt:snapenetio'
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio


OR 조건 사용법

  • 패턴들 중 하나라도 포함하고 있는 줄들을 출력

1. grep 명령어에 AND를 사용하는 첫번째 방법 → grep에 -e 옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
    $ iptables -L | grep -e 'DROP' | grep -e 'tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000

2. grep 명령어에 AND를 사용하는 두번째 방법 → grep에 -E옵션을 사용

  • DROP 또는 tcp dpt:snapenetio 중 하나라도 포함된 줄을 출력 → 순서에 상관 없이 두 패턴 중 하나만 있어도 출력
  • Pipe( | )를 이용해 여러번 사용
    # 파이프라인( | )을 이용하여 OR 사용
    $ iptables -L | grep -E 'DROP|tcp dpt:snapenetio'
    ACCEPT     tcp  --  8.8.8.8                anywhere             tcp dpt:snapenetio
    ACCEPT     tcp  --  1.1.1.1                anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000


NOT 조건 사용법 → grep 명령어에 -v 옵션을 사용

  • ACCEPT가 들어있는 줄은 모두 제거

  • 특정 패턴이 포함되지 않은 줄들을 출력

    $ iptables -L | grep -vi ACCEPT
    target     prot opt source               destination
    KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    DROP       tcp  --  anywhere             anywhere             tcp dpt:snapenetio
    DROP       tcp  --  anywhere             anywhere             tcp dpt:rxmon
    DROP       tcp  --  anywhere             anywhere             tcp dpt:fmtp
    DROP       tcp  --  anywhere             anywhere             tcp dpt:radan-http
    DROP       tcp  --  anywhere             anywhere             tcp dpt:jetdirect
    DROP       tcp  --  anywhere             anywhere             tcp dpt:websm
    
    target     prot opt source               destination
    KUBE-FORWARD  all  --  anywhere             anywhere             /* kubernetes forwarding rules */
    DOCKER-ISOLATION  all  --  anywhere             anywhere
    DOCKER     all  --  anywhere             anywhere
    
    target     prot opt source               destination
    KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
    KUBE-FIREWALL  all  --  anywhere             anywhere
    
    Chain DOCKER (1 references)
    target     prot opt source               destination
    
    Chain DOCKER-ISOLATION (1 references)
    target     prot opt source               destination
    RETURN     all  --  anywhere             anywhere
    
    Chain KUBE-EXTERNAL-SERVICES (1 references)
    target     prot opt source               destination
    
    Chain KUBE-FIREWALL (2 references)
    target     prot opt source               destination
    DROP       all  --  anywhere             anywhere             /* kubernetes firewall for dropping marked packets */ mark match 0x8000/0x8000
    
    Chain KUBE-FORWARD (1 references)
    target     prot opt source               destination
    
    Chain KUBE-SERVICES (1 references)
    target     prot opt source               destination

참고 URL : https://twpower.github.io/173-grep-and-or-not

  • 디스크와 같이 물리적인 장치를 특정 디렉토리에 연결시켜 주는 것
  • Plug and Play 기능을 수동으로 실행해 주는 것
  • 로컬 장치(하드디스크, USB, CD, DVD) 뿐만 아니라 원격지(NFS, 삼바)까지 포함해서 시스템에 마운트 가능

1. mount 명령어 사용법

  • 경로
    /usr/bin/mount
  • 옵션 사용법
    $ mount [옵션] [장치명]


2. mount 옵션

mount 옵션 설명
-a 옵션 - /etc/fstab에 있는 모든 파일 시스템을 마운트 → 리눅스가 booting할 때 mount -a가 실행
-v 옵션 - 자세한 출력 모드
-f 옵션 - mount 테스트 → 시스템을 호출하지 않고 마운트할 수 있는지 점검
- v 옵션과 함께 사용하면 진행 사항을 자세하게 알 수 있음
-n 옵션 - /etc/mtab 파일에 쓰기 작업을 하지 않고 마운트 → /etc가 읽기 전용 파일시스템인 경우 사용
-r 옵션 - 읽기만 가능하게 마운트 → mount -o ro 디렉토리와 동일한 효과
-w 옵션 - 읽기/쓰기 모드로 마운트 → mount -o rw 디렉토리와 동일한 효과
-t 옵션 - 마운트할 파일시스템 유형을 명시적으로 지정
-o 옵션 - 플래그 뒤에 콤마로 분리한 옵션을 적어줌
-B 옵션 - 기존에 마운트되어 있는 파일 시스템을 다른 위치에 한번 더 마운트
-M 옵션 - 마운트되어 있는 파일 시스템의 마운트 지점을 다른 위치로 이동


3. mount 플래그 옵션

mount 플래그 옵션
설명
defaults - rw, suid, dev, exec, auto, nouser, async 속성을 모두 가짐
auto - 부팅시 자동 마운트
noauto - 부팅시 자동마운트 X
dev - 파일시스템 상의 문자, 블럭 특수 장치를 해석
nodev - 파일시스템 상의 문자, 블럭 특수 장치를 해석 X
exec - 바이너리 실행파일이 실행되는 것을 허용
noexec - 바이너리 실행파일이 실행되는 것을 허용 X
- /tmp 디렉토리와 같이 신뢰할 수 없는 사용자도 접근할 수 있는 경우에 보안 향상
suid - setuid, setgid 의 사용을 허용
nosuid - setuid, setgid의 사용을 거부
ro - 읽기 전용 (read-only)
rw - 읽기/쓰기 (read/write) 가능
async - 파일시스템에 대한 I/O 비동기화
sync - 파일시스템에 대한 I/O 동기화
user - 일반 계정 사용자들도 마운트 할 수 있게 허용
nouser - 일반 계정 사용자가 마운트할 수 없음 → root만 mount 가능
noatime - 파일 접근시간을 업데이트 X- 메일 스풀이나 로그와 같이 I/O가 많은 파일시스템에 유용
remount - 이미 마운트된 파일시스템을 다시 마운트
loop - 다운받은 리눅스 설치 CD 또는 라이브 CD를 마운트하는 경우 가상 파일시스템을 마운트
- 가상 파일시스템을 루프백 마운트이라고 하는 방법 사용
- iso 파일 혹은 img 파일을 사용하는 경우 o loop 사용


4. mount 예제

  • mount된 파일 시스템 목록 출력
    $ mount
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    devtmpfs on /dev type devtmpfs (rw,nosuid,size=65614092k,nr_inodes=16403523,mode=755)
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    tmpfs on /dev/shm type tmpfs (rw,size=66060288k)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
    [... 아래 내용 생략]

  • 특정 파일시스템 유형을 가진 목록 출력 → t 옵션 사용
    $ mount -t ext4
    /dev/sda2 on / type ext4 (rw,relatime,stripe=64,data=ordered)
    /dev/sda1 on /boot type ext4 (rw,relatime,stripe=256,data=ordered)
    /dev/sdb1 on /cache1 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdc1 on /cache2 type ext4 (rw,noatime,stripe=64,data=writeback)
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)

  • /dev/sdd1 디바이스를 /cache1으로 mount → 자세한 정보 출력을 위해 v 옵션 사용
    $ mount -v /dev/sdd1 /cache3/
    mount: /dev/sdd1 mounted on /cache3.

  • 이미 마운트된 파일시스템을 다시 마운트 → o 옵션에 remount 사용
    $ mount -o remount /data

  • 마운트되어 있는 파일시스템을 다른 위치에 한번 더 마운트 → B 옵션을 사용하면 다른 위치를 마운트

    # 새로운 디렉토리 생성
    $ mkdir /cache10/
    $ mount -v -B /cache3/ /cache10/
    mount: /cache3 bound on /cache10.
    
    $ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdd1       1.5T   77M  1.4T   1% /cache3
    
    # /dev/sdd1 장체에 2개의 디렉토리가 mount
    $ mount | grep /cache3
    /dev/sdd1 on /cache3 type ext4 (rw,relatime,stripe=64,data=ordered)
    $ mount | grep /cache10
    /dev/sdd1 on /cache10 type ext4 (rw,relatime,stripe=64,data=ordered)

  • CD 이미지파일(iso9660)과 USB 디스크 부트 이미지 파일을 시스템에 마운트

    # CD 이미지 파일(iso9660)을 시스템에 마운트
    $ mount -v -t iso9660 -o loop /root/image.iso /mnt/repo
    mount: going to use the loop device /dev/loop0
    /root/image.iso on /mnt/repo type ext3 (rw, loop=/dev/loop0)
    
    # USB 디스크 부트 이미지 파일을 시스템에 마운트
    $ mount -v -o loop /root/boot.img /mnt/repo
    mount: going to use the loop device /dev/loop0
    mount: you didn't specify a filesystem type for /dev/loop0
         I will try type vfat
    /root/boot.img on /mnt/repo type vfat (rw,loop=/dev/loop0)

참고 자료 : https://velog.io/@zoo81001/Linux-Mount-%EB%A7%88%EC%9A%B4%ED%8A%B8
참고 자료 : https://jhnyang.tistory.com/12

+ Recent posts