Linux HotSwap 사용하기
컴퓨터 하드웨어가 발달하면서 기존 서버시스템의 기능을 데스크탑에서도 사용할 수 있게 되었다. 그중에 하나가 Hot Swap 이다. 스토리지(Storage) 를 컴퓨터를 끄지 않고도 교체할 수 있는게 Hot Swap 기능이다.
BIOS 설정
Hot Swap 을 이용하기 위해서는 BIOS 에 기능을 활성화 해줘야 한다. 제조사마다 BIOS 설정 메뉴가 다르지만 내가 사용하는 메인보드의 경우에는 다음과 같이 설정이 가능하다.
Hot Plug 라고 이름이 다르지만 이것이 Hot Swap 이다. 만을 BlOS 에서 이 메뉴가 없다면 메인보드에서 Hot Swap 기능을 제공하지 않는 것이다.
Linux 에서 사용하기
대부분의 최근의 Linux 커널에서는 Hot Swap 를 지원 한다. 별다른 설정없이 리눅스 배포판이라면 모두 사용이 가능하도록 되어 있다. 먼저 작동하고 있는 Disk 하나를 예를들어 Hot Swap 을 사용해보자.
먼저 다음과 같이 Disk 의 파워를 꺼야 한다. 이는 Disk 꺼내기 위한 것으로 전원을 끄지 않고 갑자기 꺼내버리면 Disk 가 파손될 우려가 있기 때문에 파워를 꺼야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 5.5T 0 disk sdb 8:16 0 5.5T 0 disk └─sdb1 8:17 0 5.5T 0 part sdc 8:32 0 7.3T 0 disk sdd 8:48 0 5.5T 0 disk nvme0n1 259:0 0 232.9G 0 disk ├─nvme0n1p1 259:1 0 256M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot ├─nvme0n1p3 259:3 0 211.6G 0 part / └─nvme0n1p4 259:4 0 20G 0 part [SWAP] ]# echo 1 > /sys/block/sdc/device/delete # Disk 끄기 ]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 5.5T 0 disk sdb 8:16 0 5.5T 0 disk └─sdb1 8:17 0 5.5T 0 part sdd 8:48 0 5.5T 0 disk nvme0n1 259:0 0 232.9G 0 disk ├─nvme0n1p1 259:1 0 256M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot ├─nvme0n1p3 259:3 0 211.6G 0 part / └─nvme0n1p4 259:4 0 20G 0 part [SWAP] |
sdc 디스크에 대해서 파워를 끄도록 한 명령어다. 커널 파라메터 설정으로 파워를 끄게 된다. 그렇게되면 lsblk 명령어로 디스크가 안보이게 된다. 그리고 커널 메시지에 다음과 같이 표시 된다.
1 2 3 |
[ 1048.952001] sd 8:0:0:0: [sdc] Synchronizing SCSI cache [ 1048.952727] sd 8:0:0:0: [sdc] Stopping disk [ 1049.752955] ata9.00: disabled |
이제 하드디스크를 꺼내고 새로운 하드 디스크를 장착하면 된다. 새로운 하드 디스크를 장착하게 되면 최근의 리눅스 커널에서 자동으로 새로운 하드 디스크를 알아 차린다. 이 내용은 커널 메시지로 다음과 같이 나온다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ 1147.078762] ata9: SATA link down (SStatus 0 SControl 300) [ 1173.377021] ata9: softreset failed (device not ready) [ 1175.292989] ata9: SATA link up 6.0 Gbps (SStatus 133 SControl 300) [ 1175.307448] ata9.00: ATA-10: WDC WD80EAZZ-00BKLB0, 80.00A80, max UDMA/133 [ 1175.307943] ata9.00: 15628053168 sectors, multi 16: LBA48 NCQ (depth 32), AA [ 1175.308721] ata9.00: configured for UDMA/133 [ 1175.308862] scsi 8:0:0:0: Direct-Access ATA WDC WD80EAZZ-00B 0A80 PQ: 0 ANSI: 5 [ 1175.309078] sd 8:0:0:0: Attached scsi generic sg2 type 0 [ 1175.309176] sd 8:0:0:0: [sdc] 15628053168 512-byte logical blocks: (8.00 TB/7.28 TiB) [ 1175.309214] sd 8:0:0:0: [sdc] 4096-byte physical blocks [ 1175.309248] sd 8:0:0:0: [sdc] Write Protect is off [ 1175.309277] sd 8:0:0:0: [sdc] Mode Sense: 00 3a 00 00 [ 1175.309298] sd 8:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 1175.330483] sd 8:0:0:0: [sdc] Attached SCSI disk |
lsblk 로 보면 새로운 디스크가 인식된게 보이게 된다.
만약 이렇게 자동으로 디스크가 인식되지 않는다면 SCSI 디스크 ReScan 기능을 이용해야 한다. Hot Swap 은 SCSI 의 host 번호를 이용해 작동됨으로 SCSI host 번호를 알아야 한다. 하지만 리눅스에서는 /dev/sdc 형식인데 SCSI host 번호와는 다른데, 다음과 같이 알아내야 한다.
1 2 3 4 5 |
]# ls -l /sys/block/ | grep sd lrwxrwxrwx 1 root root 0 Sep 29 00:12 sda -> ../devices/pci0000:00/0000:00:01.3/0000:02:00.1/ata5/host4/target4:0:0/4:0:0:0/block/sda lrwxrwxrwx 1 root root 0 Sep 29 2023 sdb -> ../devices/pci0000:00/0000:00:01.3/0000:02:00.1/ata6/host5/target5:0:0/5:0:0:0/block/sdb lrwxrwxrwx 1 root root 0 Sep 29 00:16 sdc -> ../devices/pci0000:00/0000:00:01.3/0000:02:00.2/0000:03:06.0/0000:08:00.0/ata9/host8/target8:0:0/8:0:0:0/block/sdc lrwxrwxrwx 1 root root 0 Sep 29 00:12 sdd -> ../devices/pci0000:00/0000:00:01.3/0000:02:00.2/0000:03:06.0/0000:08:00.0/ata10/host9/target9:0:0/9:0:0:0/block/sdd |
위 결과에서 중간에 host4, host5 가 바로 SCSI host 번호 이다. 이렇게 확인된 SCSI host 번호를 이용해서 ReScan 하도록 다음과 같이 할 수 있다.
1 |
echo "- - -" > /sys/class/scsi_host/host8/scan |
이렇게 수동으로 ReScan 를 하게 되며 하드 디스크를 인식하게 된다.
- Camera: SM-F711N
- Focal length: 4.25mm
- ISO: 640
- Shutter speed: 1/30s
리눅스 부팅 복구하기
VMPlayer 에서 RHEL 8.8 을 설치하고 사용하다가 KVM 으로 이미지를 바꿔서 옮겼다. 그리고 부팅을 했는데, 부팅이 되지 않았다. Graphic 모드를 끄고 부팅 메시지를 봤는데 다음과 같이 멈췄서 부팅이 되지 않는 것이였다.
부팅이 되도록 해야하는데, 어떻게 진행했는지 기록해 본다.
다른 KVM VM 에 디스크로 붙이기
부팅이 멈춘 RHEL8.8 VM 이미지를 다른 VM 의 디스크로 붙인다. virsh 명령어를 이용해서 디스크를 추가 할 수 있다. 먼저, KVM VM 을 시작 시켜놔야 한다. 구동되고 있는 VM 에 디스크를 라이브로 붙일 수 있다.
1 2 |
]# virsh attach-disk OL85 /mnt7/RHEL8.2.img vdb --cache none Disk attached successfully |
OL85 VM 에서 디스크가 추가 되었는지를 다음과 같이 확인한다.
1 2 3 4 5 6 7 8 9 |
]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 50G 0 disk ├─vda1 252:1 0 38.7G 0 part / └─vda2 252:2 0 11.4G 0 part vdb 252:16 0 20G 0 disk ├─vdb1 252:17 0 18G 0 part └─vdb2 252:18 0 2G 0 part |
vdb 로 디스크가 붙인 것을 확인할 수 있다. 이제 뭔가를 할 수 있게 됐다.
부팅 복구 하기
이제부터는 일반적인 부팅 문제와 비슷하다. 보통 Grub2가 복구가 안되었거나 뭔가 문제가 있을때에 이런 방법을 자주 사용한다. 그러다보니 여러가지 방법들이 존재하는데, 가장 손 쉬운 방법은 설치ISO 이미지로 Rescure 모드로 부팅을 하는 것이다.
RHEL 8 이기 때문에 Rocky Linux 8 설치 이미지를 다운로드 받는다.
1 2 3 4 |
]# curl -LJO https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.8-x86_64-minimal.iso % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2334M 100 2334M 0 0 4732k 0 0:08:24 0:08:24 --:--:-- 7066k |
이걸 이제 복구를 위한 RHEL8 VM 에 DVD 이미지로 붙여준다. 그러면 다음과 같이 부팅이 된다.
위 화면처럼 나오는데 여기서 Troubleshooting 메뉴를 선택한다.
위 화면처럼 Rescue a Rocky Linux system 메뉴를 선택한다.
이렇게 1번을 선택하면 쉘(Shell)이 떨어진다. 화면에 안내처럼 chroot 명령어를 이용해서 시스템 작업을 할 수 있다.
부팅 복구 작업
쉘만 있으면 이제 부팅 복구 작업을 할 수 있다.
1 2 3 4 5 |
sh-4.4# chroot /mnt/sysroot bash-4.4# cd /boot bash-4.4# dracut -f initramfs-5.14.0-162.6.1.el9_1.x86_64.img 5.14.0-162.6.1.el9_1.x86_64 bash-4.4# exit bash-4.4# exit |
위와같이 부팅램이미지를 재 생성해줬다. Grub2 의 문제는 아니였기 때문에 부팅이미지를 재 생성으로 문제가 해결 되었다.
RHEL 9 “dracut-initqueue [xxx]: Warning: /dev/disk/by-uuid/UUID does not exist” 부팅 실패
RHEL 9 부팅 실패는 다양하지만 “/dev/disk/by-uuid/UUID” 를 찾지못해서 실패하는 경우가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[ 126.950886] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 127.469831] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 127.982848] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 128.499820] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts ... [ 187.220024] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 187.738820] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 188.257817] dracut-initqueue[448]: Warning: dracut-initqueue timeout - starting timeout scripts [ 188.259827] dracut-initqueue[448]: Warning: Could not boot. [ 188.260799] dracut-initqueue[448]: Warning: /dev/disk/by-uuid/7415appltest-8eff-478e-8c0c-24321f669e0d does not exist Starting Setup Virtual Console... [32m OK [0m] Started Setup Virtual Console. Warning: /dev/disk/by-uuid/7415appltest-8eff-478e-8c0c-24321f669e0d does not exist Generating "/run/initramfs/rdsosreport.txt" Entering emergency mode. Exit the shell to continue. Type "journalctl" to view system logs. You might want to save "/run/initramfs/rdsosreport.txt" to |
문제해결 – 부팅 커널 옵션으로 장치를 직접 입력 -> 해결 안됨
인터넷 자료를 보니, 커널 옵션으로 장치 이름을 직접 입력하면 된다는 내용이 있어 해봤지만 되지 않았다. 부팅 커널은 부팅할때에 Grub 에서 편집하는 것을 말하는 것인데, 다음과 같이 편집을 한다.
1 2 |
- /boot/vmlinuz-5.14.0-284.18.1.el9_2.x86_64 root=UUID=4b6efd0a-e0ce-4d88-8efe-560f492316fa ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=9e00f20a-eb7f-4160-904a-7e5b003c72ed rhgb quiet + /boot/vmlinuz-5.14.0-284.18.1.el9_2.x86_64 root=/dev/vda1 ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=9e00f20a-eb7f-4160-904a-7e5b003c72ed rhgb quiet" |
grub 메뉴에서 위와같이 UUID 를 빼고 디바이스 장치를 직접 입력했지만 되지 않았다.
Grub2 재설정 -> 해결안됨
Grub2 에 UUID 값이 갱신되지 않아서 벌어지는 일이여서 이것을 갱신해줄 필요가 있다. 그래서 다음과 같이 Grub2 메뉴를 갱신해 줬다.
1 |
]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg |
이렇게 한 후에 부팅을 진행했지만, 역시 해결되지 않았다.
dracut 명령어로 부팅 이미지 재 생성 -> 성공
/boot 디렉토리에 있는 커널 부팅 이미지를 재생성 해줬다. /boot 는 커널이미지와 커널부팅이미지가 존재한다. 이것을 재생성 해줬다.
1 |
]$ sudo dracut -f /boot/initramfs-5.14.0-162.6.1.el9_1.x86_64.img 5.14.0-162.6.1.el9_1.x86_64 |
이렇게 한 후에 부팅이 정상적으로 되었다.
Rocky Linux 9 에 Open vSwitch 세팅하기
Rocky Linux 9 는 RHEL 9 (RedHat Enterprise Linux 9) 의 크론 버전이다. RHEL9는 상용인 반면에 Rokcy Linux 는 무료다.
RHEL9나 Rokcy Linux 9 로 넘어오면서 변화한 것중에 하나가 ifcfg-eth0 파일이다. 이 파일은 /etc/sysconfig/network-scripts 디렉토리에 존재했었고 eth0 네트워크 장치에 대한 네트워크 설정 정보가 저장되었었다. 부팅을하면서 Network-Manager 데몬이 이 파일을 읽어 실행했었다. 하지만 RHEL9과 Rokcy Linux 에서는 이 파일을 더 이상 사용하지 않고 nmcli 명령어를 통해서 세팅을 하도록 변경 되었다.
이러한 변화는 Open vSwitch 세팅에서도 영향을 준다. 우분투와 다르게 RHEL9, Rocky Linux 9 에서는 nmcli 명령어를 통해서 Open vSwitch 를 설정하게 된다.
주의
절대로 원격에서 작업을 해서는 안된다. 외부와 연결하는 네트워크 작업이기 때문에 원격에서 작업을 했을 경우 다시 접속이 안될 수 있다.
Open vSwitch 설치
Rocky Linux 9 에서 Open vSwitch 설치는 패키지로 제공한다. 다음과 같이 설치가 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
]# dnf install centos-release-nfv-openvswitch ]# dnf search openvswitch Last metadata expiration check: 0:34:49 ago on Sun Jul 16 15:48:15 2023. ====================== Name Matched: openvswitch ================= centos-release-nfv-openvswitch.noarch : Common release file to establish shared metadata for CentOS NFV SIG network-scripts-openvswitch2.16.x86_64 : Open vSwitch legacy network service support openvswitch-selinux-extra-policy.noarch : Open vSwitch Extra SELinux Policy openvswitch2.16.x86_64 : Open vSwitch openvswitch2.16-devel.x86_64 : Open vSwitch OpenFlow development package (library, headers) openvswitch2.16-ipsec.x86_64 : Open vSwitch IPsec tunneling support openvswitch2.16-test.noarch : Open vSwitch testing utilities openvswitch2.17.x86_64 : Open vSwitch openvswitch2.17-devel.x86_64 : Open vSwitch OpenFlow development package (library, headers) openvswitch2.17-ipsec.x86_64 : Open vSwitch IPsec tunneling support openvswitch2.17-test.noarch : Open vSwitch testing utilities openvswitch3.1.x86_64 : Open vSwitch openvswitch3.1-devel.x86_64 : Open vSwitch OpenFlow development package (library, headers) openvswitch3.1-ipsec.x86_64 : Open vSwitch IPsec tunneling support openvswitch3.1-test.noarch : Open vSwitch testing utilities pcp-pmda-openvswitch.x86_64 : Performance Co-Pilot (PCP) metrics for Open vSwitch python3-openvswitch2.16.x86_64 : Open vSwitch python3 bindings python3-openvswitch2.17.x86_64 : Open vSwitch python3 bindings python3-openvswitch3.1.x86_64 : Open vSwitch python3 bindings ]# dnf install openvswitch3.1.x86_64 |
Open vSwitch 를 NetworkManager 가 다룰수 있도록 다음과 같이 패키지를 설치해 준다.
1 2 |
]# dnf install NetworkManager-ovs.x86_64 ]# systemctl restart NetworkManager |
NetworkManger 를 위한 Open vSwitch 플러그인 이다.
nmcli
이제 네트워크 작업은 직접 파일을 조작하는 대신에 nmcli 명령어를 이용하는 방법을 사용해야 한다.
1 2 3 4 |
]# nmcli con show NAME UUID TYPE DEVICE enp4s0 7cb453c9-ab80-3afa-a034-01af77db564e ethernet enp4s0 lo ecfd900f-2a3c-4343-8966-8d998e0220fa loopback lo |
현재 연결 정보를 보여준다.
이제 nmcli 를 이용해서 Open vSwitch 설정을 다음과 같이 해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
nmcli con add type ovs-bridge conn.interface ovsbr0 con-name ovsbr0 nmcli con add type ovs-port conn.interface ovsbr0 master ovsbr0 con-name ovs-port-ovsbr0 nmcli con add type ovs-interface slave-type ovs-port conn.interface ovsbr0 master ovs-port-ovsbr0 con-name ovs-if-ovsbr0 nmcli con add type ovs-port conn.interface ovs-port-enp4s0 master ovsbr0 con-name ovs-port-enp4s0 nmcli con add type ethernet conn.interface enp4s0 master ovs-port-enp4s0 con-name ovs-if-enp4s0 nmcli con modify ovs-if-ovsbr0 ipv4.addresses '192.168.96.6/20' ipv4.gateway '192.168.96.1' ipv4.method manual nmcli con modify ovs-if-ovsbr0 ipv4.dns '8.8.8.8' +ipv4.dns '8.8.4.4' nmcli con down enp4s0 nmcli con up ovs-if-enp4s0 nmcli con up ovs-if-ovsbr0 nmcli con delete enp4s0 |
설정을 다하고 난 후에 재부팅을 한번 해준다.
그리고 nmcli 명령어를 사용해 상태을 확인 한다.
1 2 3 4 5 6 7 8 |
]# nmcli c show NAME UUID TYPE DEVICE ovs-if-ovsbr0 2646aef8-be31-4b27-9f1e-1f0ac4bd2285 ovs-interface ovsbr0 lo a351f90d-42be-48f2-98de-2e933d810390 loopback lo ovs-if-enp4s0 e2a7d6e0-fd41-418a-85ff-1b586d02920e ethernet enp4s0 ovs-port-enp4s0 1fb4e20a-07e1-4cdc-a966-84d797587bd5 ovs-port ovs-port-enp4s0 ovs-port-ovsbr0 4e5ba6cb-384b-46c6-8ce8-8d9c89b353eb ovs-port ovsbr0 ovsbr0 5beb100e-4e2f-4ff0-987c-6e9663958244 ovs-bridge ovsbr0 |
Open vSwitch 설정 확인
ovs-vsctl 명령어를 통해서 설정이 반영이 되었는지 확인해야 한다.
1 2 3 4 5 6 7 8 9 10 |
]# ovs-vsctl show 79930dbc-442d-43f6-9d17-7aed0e663aec Bridge ovsbr0 Port ovsbr0 Interface ovsbr0 type: internal Port ovs-port-enp4s0 Interface enp4s0 type: system ovs_version: "3.1.2" |
ip a 확인
ip a 명령어를 통해서 확인해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
]# 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: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master ovs-system state UP group default qlen 1000 link/ether 9c:6b:00:02:6e:42 brd ff:ff:ff:ff:ff:ff 4: ovs-system: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether b6:7a:10:0a:0c:62 brd ff:ff:ff:ff:ff:ff 5: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether 9c:6b:00:02:6e:42 brd ff:ff:ff:ff:ff:ff inet 192.168.96.6/20 brd 192.168.111.255 scope global noprefixroute ovsbr0 valid_lft forever preferred_lft forever inet6 fe80::47b0:302c:15bb:ad30/64 scope link noprefixroute valid_lft forever preferred_lft forever |
RHEL9, Rocky Linux 9 에서 어떻게 Open vSwitch 를 설정하는지 알아 봤다.
WOL 설정
Wake On Lan 은 Ethernet 선과 연결된 상태에서 컴퓨터에 전원을 켜지는 기능을 말한다. 이 기능을 사용하기 위해서는 먼저 메인보드에서 지원을 해줘야 한다. 한가지 더 주의해야 하는 것은 메인보드마다 설정 방법이 다 다르다.
이 작업을 했던 컴퓨터는 ASRock B550M Pro4 였는데, BIOS 설정에 Boot 메뉴에 Power On Lan 설정이 있어서 Enable 을 해줬지만 되지 않았다. Advanced 설정에서 ACPI 메뉴가 존재하는데 여기서 PCIE 를 이용한 Power On Lan 설정이 존재하는데 이것을 Enable 을 해줘야 한다.(정확한 메뉴는 기억이 나지 않는다. 메뉴얼을 찾아보면 쉽게 찾을 수 있다.)
이렇게 했는데도 WOL 기능이 되지 않는다면 이것은 리눅스의 설정을 해줘야 함을 의미 한다. 앞서 Open vSwitch 설정을 해준 관계로 외부 접속을 위한 디바이스의 연결 이름이 일반적으로 다르다.
1 2 3 4 5 6 7 |
NAME UUID TYPE DEVICE ovs-if-ovsbr0 2646aef8-be31-4b27-9f1e-1f0ac4bd2285 ovs-interface ovsbr0 lo cec8e9fb-b69c-4ba3-a0ab-bf6382170b4d loopback lo ovs-if-enp4s0 e2a7d6e0-fd41-418a-85ff-1b586d02920e ethernet enp4s0 ovs-port-enp4s0 1fb4e20a-07e1-4cdc-a966-84d797587bd5 ovs-port ovs-port-enp4s0 ovs-port-ovsbr0 4e5ba6cb-384b-46c6-8ce8-8d9c89b353eb ovs-port ovsbr0 ovsbr0 5beb100e-4e2f-4ff0-987c-6e9663958244 ovs-bridge ovsbr0 |
보통은 enp4s0 의 인터페이스 이름이 존재해야 하지만 그건 없다. Open vSwitch 설정 마지막에서 enp4s0 인터페이스 설정을 지웠기 때문인데, 이렇게 되면 어디다 해줘야 하는지가 헷깔리게 된다.
이럴때는 외부와 연결되는 물리적 장치 이름을 찾고, 그것과 연결된 인터페이스 이름을 찾으면 된다. 위 예제에서 외부와 연결된 장치는 enp4s0 이며 이 장치의 인터페이스 이름은 ovs-if-enp4s0 이다. 이 인터페이스에서 WOL 설정을 해주면 된다.
먼저 nmcli 명령어를 이용해서 상태를 살펴본다.
1 2 3 |
]# nmcli conn show "ovs-if-enp4s0" | grep wake-on-lan 802-3-ethernet.wake-on-lan: default 802-3-ethernet.wake-on-lan-password: -- |
802-3-ethernet.wake-on-lan 의 값이 default 이다. 이것을 magic 으로 세팅해주면 된다. 다음과 같이 한다.
1 2 3 4 |
]# nmcli conn modify "ovs-if-enp4s0" 802-3-ethernet.wake-on-lan magic ]# nmcli conn show "ovs-if-enp4s0" | grep wake-on-lan 802-3-ethernet.wake-on-lan: magic 802-3-ethernet.wake-on-lan-password: -- |
이렇게 한 다음에 가능하면 두번 재부팅하라고 하지만.. 글쎄… 한번만 해줘도 잘됐었다. 여러번 테스트를 해봤는데 문제없이 잘되었다.
한가지 덧붙이자면 WOL 기능을 사용하기 위해서는 절대로 전원 플러그를 뽑아서는 안된다. 멀티탭에 각 구에 전원이 On/Off 스위치가 있을 경우에 전원을 차단해서도 안된다. 전원 플러그를 뽑았다가 다시 꼽아도 안된다. 반드시 전원 플러그를 꼽고 한번은 리눅스로 부팅을 해주고 난 후에 리눅스를 Shutdown 해주고 그리고 전원 플러그는 그대로 연결이 되어 있어야 한다.
WOL 기능은 공유기에 내장되어 있는 경우가 많다. 공유기를 이용하면 원격에서도 컴퓨터를 켤수 있고 공유기의 포워드 기능을 이용하면 켜진 컴퓨터로 외부에서 접속이 가능하다. 프로젝트 할때마다 자주 써먹는 유용한 방법이다.
KVM Image 용량 증설하기
KVM 가상화를 운영하고 있는데, 운영중인 VM 하나가 용량이 부족해지는 상황이 발생했다. KVM 가상화 VM 의 용량은 결국 이미지 파일 한개임으로 이 이미지 파일의 용량을 늘려주면 VM 의 용량이 사실상 늘어나는 것으로 생각했다.
하지만 현시점(2023) 에서 검색을 해보니 다양한 방법들이 존재했다. 그 중에는 VM 이미지를 로컬에 마운트해서 늘려주는 방법도 존재했지만 너무나 복잡해 보였다. 좀 더 쉬운 방법이 없을까 해서 검색한 결과 가장 쉬워보이는 것을 발견했고 이 방법으로 손쉽게 VM 용량을 늘리는데 성공했다.
VM 상태
용량을 늘리려는 VM 의 상태는 다음과 같다.
1 2 3 4 5 6 7 8 |
# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 393M 8.0M 385M 3% /run /dev/vda1 48G 44G 794M 99% / tmpfs 2.0G 52K 2.0G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /run/qemu tmpfs 393M 0 393M 0% /run/user/1000 |
/dev/vda1 으로 파티션 하나로 보이지만 사실 SWAP 파티션도 존재한다. 이 SWAP 파티션의 /dev/vda2 디바이스이며 약 2G 용량을 차지한다.
VM 이미지 경로
VM 을 운영하는 Host 서버에서 VM 의 이미지가 어디에 있는지를 다음과 같이 살펴볼 수 있다.
1 2 3 4 5 |
]# virsh domblklist --domain Ubuntu20.04 대상 소스 ---------------------------------- vda /opt/kvm/ubuntu20.04.img sda - |
VM 이미지 정보
VM 이미지의 정보를 아는 것은 매우 중요하다. VM 이미지의 타입이 존재하는데 raw, qemu 타입이다. 어떤 타입인지에 따라서 VM 이미지 용량을 늘리는 방법이 달라진다.
1 2 3 4 5 |
]# qemu-img info /opt/kvm/ubuntu20.04.img image: /opt/kvm/ubuntu20.04.img file format: raw virtual size: 50 GiB (53687091200 bytes) disk size: 50 GiB |
또, 가상 크기와 디스크 크기 정보 표시되는데 간혹 이 크기가 서로 다를 수가 있다.
기존 이미지 백업
혹시 모를 불상사를 방지하기 위해서 기존 이미지를 백업해 두자.
1 2 |
cp -av /opt/kvm/ubuntu20.04.img /mnt7/ '/opt/kvm/ubuntu20.04.img' -> '/mnt7/ubuntu20.04.img' |
패키지 설치
VM 이미지를 늘리기 위한 작업을 위해서 필요한 패키지를 설치 해준다. 설치는 환경이 RedHat 기반이기 때문에 dnf 명령어로 설치를 하였다. 설치하는 패키지 이름은 배포판마다 다를 수 있다.
1 |
]# dnf install guestfs-tools |
이 패키지를 설치하게 되면 virt-resize 명령어를 사용할 수 있다.
VM 이미지 디스크 정보
앞에서 VM 이미지 정보를 표시했다면 이제는 이미지 안에 디스크 정보를 봐야 한다. 각각 설치한 방법이 다르고 파티션 정보도 다르기 표시 되기 때문에 이를 잘 파악해야 한다.
VM 이미지 내의 디스크 정보는 다음과 같이 알 수 있다.
1 2 3 |
]# virt-df Gitlab Filesystem 1K-blocks Used Available Use% Gitlab:/dev/sda1 49379416 46001304 837364 94% |
단일 파티션 /dev/sda1 만 보이지만 virt-df 명령어의 한계로 보인다. 왜냐하면 SWP 파티션도 존재하기 때문인데, 이 SWAP 파티션은 표시되지 않았다.
virt-filesystems 명령어를 통해서 이를 정확하게 알 수 있다.
1 2 3 4 5 6 7 |
]# virt-filesystems --long -h --all -a /opt/kvm/ubuntu20.04.img Name Type VFS Label MBR Size Parent /dev/sda1 filesystem ext4 - - 47G - /dev/sda2 filesystem swap - - 1.8G - /dev/sda1 partition - - 83 48G /dev/sda /dev/sda2 partition - - 82 1.8G /dev/sda /dev/sda device - - - 50G - |
위 정보를 보면 전체 50G 에 /dev/sda1 과 /dev/sda2 로 나뉘어 있다. /dev/sda2 는 swap 파티션으로 virt-df 일때는 나오지 않았다.
용량 증설을 위한 이미지 생성
다음과 같이 백업한 이미지를 가지고 작업을 진행한다.
1 2 |
]# truncate -r /mnt7/ubuntu20.04.img /mnt7/ubuntu20.04-new.img ]# truncate -s +10G /mn7/ubuntu20.04-new.img |
이 작업은 매우 중요하다. truncate 명령어를 이용하는 것인데, -r 옵션으로 용량 증설을 위한 이미지를 만들었다. 그리고 그 이미지에 용량 증설을 설정한다. 여기서는 10G 용량을 늘린다
루트(/) 피티션 /dev/sda1 크기 변경
VM 이미지 내의 파티션 정보는 /dev/sda1 으로 보인다. 여기서 주의해야 할 것은 VM 이 가동된 후에 이미지 정보의 디바이스 이름은 /dev/vda1 으로 다르다. virt-df 혹은 virt-filesystems 나온 내용을 기반으로 디바스 이름을 정해야 한다.
용량 증설은 루트 파티션만 하면 됨으로 /dev/sda1 의 크기를 변경할 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
]# virt-resize --expand /dev/sda1 /mnt7/ubuntu20.04.img /mnt7/ubuntu20.04-new.img [ 0.0] Examining /mnt7/ubuntu20.04.img ********** Summary of changes: virt-resize: /dev/sda1: This partition will be resized from 48.1G to 58.1G. The filesystem ext4 on /dev/sda1 will be expanded using the ‘resize2fs’ method. virt-resize: /dev/sda2: This partition will be left alone. ********** [ 1.5] Setting up initial partition table on /mnt7/ubuntu20.04-new.img [ 2.4] Copying /dev/sda1 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 907.7] Copying /dev/sda2 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 941.1] Expanding /dev/sda1 using the ‘resize2fs’ method virt-resize: Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly. |
변경 요약을 보면 /dev/sda1 의 용량이 증설될 것인데, 이 파티션의 파일시스템이 ext4 임으로 resize2fs 방법을 이용해서 크기가 확장될 것임을 알려주고 있다.
진행 상태를 보면 Copying /dev/sda1 으로 나오고 실행 명령어에서 변경전 이미지와 truncate 명령어로 새롭게 생성한 이미지를 인자로 줬는데, 아마도 변경전 이미지를 truncate 명령어로 새롭게 생성한 이미지에 순차적인 복사를 하는 것으로 보인다.
이미지 용량에 따라서 작업 시간는 차이를 보일 것이다.
새로운 이미지로 VM 시작한 후 파티션 확인
/mnt7/ubuntu20.04-new.img 이미지로 VM 을 부팅한다. 그리고 난 후 다음과 같이 파티션 용량이 늘었는지 체크한다.
1 2 3 4 5 6 |
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sr0 11:0 1 1024M 0 rom vda 252:0 0 60G 0 disk ├─vda1 252:1 0 58.1G 0 part / └─vda2 252:2 0 1.8G 0 part [SWAP] |
용량이 10G 늘었다.
파일시스템 용량을 봐 본다.
1 2 3 4 5 6 7 8 |
# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 393M 6.8M 386M 2% /run /dev/vda1 57G 44G 11G 82% / tmpfs 2.0G 52K 2.0G 1% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /run/qemu tmpfs 393M 0 393M 0% /run/user/1000 |
앞에서 변경 요약을 보면 파일시스템이 뭔지를 파악하고 거기에 맞게 파티션 Resize 작업도 해주는 것으로 보인다. ext4 의 경우 resize2fs, XFS 의 경우에는 xfs_growfs 을 사용하는데 이런 작업은 파티션의 크기를 변경하는 것으로 VM 이미지 용량 증설과 함께 해준다.
따라서 별도의 파티션 용량 증설작업은 필요하지 않다.
Mint Linux 21.1 설정
오랫동안 민트 리눅스(Mint Linux) 를 데스크탑 운영체제로 사용해왔다. 정확하게는 데스크탑 PC 를 새로 맞춤과 동시에 설치해서 써왔는데, 이번에 데스크탑 PC 를 교체하게 되면서 민트 리눅스를 재설치해야하는 상황이 되어 그 동안 써왔던 민트 리눅스 설정을 기록으로 남긴다.
XFCE 데스크탑
민트 리눅스 데스크탑은 세가지가 존재하는데, 그중에서 XFCE 데스크탑을 사용했다. 이 XFCE 를 만진지도 거의 20년이 넘었다. 솔라리스의 CDE 를 닮아서 쓰기 시작해서 지금까지 쓰고 있다. XFCE 는 가벼우면서도 복잡하지 않는 데스크탑이다. 그러다보니 별로 설정할게 존재하지 않는다. 데스크탑이라는 것이 어짜피 설치하고 나면 쓰는 것만 쓰게 되어 있어서 뭔가 많은 것을 만져야하고 존재하는 것 부터가 거추장스러운 것이다. 단순하면서도 필요한 것만 있는 XFCE 를 그래서 20년 넘게 사용했다.
설치 후 화면
설치 후에 처음 화면은 다음과 같다.
그냥 윈도우처럼 보인다. 이 겉모양은 XFCE 의 본래 모습이 아니다.
XFCE 는 솔라리스의 CDE 를 모티브로 만들어졌다. 그래서 초창기때부터 솔라리스 CDE 의 겉모양을 본떠서 데스크탑을 꾸미기 시작했다. 이 글을 쓰는 목적도 대충이나마 솔라리스CDE 겉모양을 꾸미는 과정을 기록으로 남기기 위서다.
패널 기본 설정
화면 아래 길게 늘어진 바가 패널(Pannel) 이다. 이 패널을 약간 손질해서 기본적인 CDE 모양으로 만들어보자. 패널에 마우스 오른쪽 버튼을 클릭하고 ‘패널 -> 패널 기본 설정’ 으로 들어간다.
첫번째로 해야하는 것은 패널을 추가는 것이다. 설정 창에 맨 위 ‘패널1’ 글자 옆에 + 버튼을 클릭하면 ‘패널2’ 라고 바뀌고 화면 어딘가에 패널 바가 생성된다. 한 화면에 패널을 두개 사용할 것인데, 하나는 화면 위에 올려두고 시작메뉴와 태스크바로 사용하 다른 하나는 솔라리스CDE 처럼 일종의 런처로 사용할 것이다.
‘패널1’ 을 설정창에서 선택하고 ‘표시탭->일반’ 에서 ‘패널 고정’ 체크를 해제해 준다. 그러면 패널 양쪽에 마우스를 올리고 잡을 수 있는 상태가 표시된다. 마우스로 잡은 다음에 화면 위쪽으로 옮겨준다. 다 옮겨 줬으면 ‘패널 고정’ 체크를 해 패널1을 고정 시켜준다.
‘패널 기본 설정’ 창에서 ‘패널2’를 선택하면 화면 어딘가에 패널이 보인다. 이 패널2도 ‘표시탭->일반’ 에서 ‘패널 고정’ 체크를 해제해준다. ‘패널1’ 과는 달리 아무것도 없다보니 패널 가로길이가 작다. 솔라리스CDE 의 런쳐처럼 사용할 것이기에 화면 중앙에 놓는다. 그리고 ‘표시탭->일반’ 에서 길이(%) 를 44 로 조정하고 열 높이(S) 를 59 로 변경한다.
대충 런쳐로 쓰일 패널이 만들어졌다. 이 패널2에 쓸만한 항목들을 추가해준다.
대략 왼쪽부터 ‘프로그램 메뉴’, ‘위치’, ‘파이어폭스’,’Xfce터미널’,’작업공간전환기’,’눈동자’,’스크린샷’,’로그아웃’,’휴지통’,’날짜와시간’ 이다.
여기서 중요한 것은 ‘파이어폭’,’Xfce터미널’,’로그아웃’ 은 항목추가에서 ‘실행기’ 추가를 하고 난 다음 ‘실행기’ 설정에서 애플리케이션을 선택해준 것이다. 모든 것이 패널 항목으로만 넣을 수는 없다. 패널 항목 수보다 패널이 길이가 길다면 ‘패널 기본 설정’에서 패널의 가로 길이를 조정해 주면 된다.
모양새
모양새는 ‘설정->모양새’ 에서 찾을 수 있는데, 데스크탑에 기본 페인팅을 바꿀 수 있게 해준다. 과거 솔라리스CDE 와 비슷한 느낌의 페인팅은 회색 바탕에 핑크 창틀이였다. 인터넷에서 XFCE 에 CDE 테마를 검색해서 찾아본 결과 Soaris-9-2.0 이 잘 동작했다.
모양새 많은 페인팅들은 테마(Theme) 라고 하는데, /usr/share/themes 디렉토리에 테마 이름의 디렉토리로 존재한다. 첨부된 파일을 다운받아 압축해제하면 사용할 수 있다.
과거 솔라리스CDE 의 모양새 그대로다. 만일 이 모양새가 맘에 들지 않는다면, 그것이 리눅스와 좀 다른 맛(?) 을 느끼 싶다면 적어도 과거 솔라리스CDE 의 전체 테마와 잘 어울릴만한 것을 찾는다면 기본으로 제공되는 모양새중에 ‘Mint-Y-Legacy-Dark-Pink’ 를 추천해 본다.
기본으로 제공해 주는 모양새 테마가 많기 때문에 원하는 취향에 맞춰 선택해주면 된다.
창 관리자
창 관리자는 창 틀의 모양과 최소,최대,없애기 버튼의 위치등을 변경할 수 있도록 해준다. 창 관리자 역시 테마 리스트들이 있고 원하는 창 모양의 테마를 선택하면 적용 된다. 인터넷을 통해 cdetheme-solaris 를 얻게 되었고 이를 통해서 과거 솔라리스CDE 창틀 모양을 얻을 수 있었다.
cdetheme-solaris 를 맨 처음 적용하면 최소,최대,없애기 버튼의 배치가 위와같지 않다. 그럴땐, 창 관리자에 ‘단추 배치’ 부분에 나온대로 단추를 배치 시켜주면 된다. 필요없는 단추는 숨김으로 옮겨놓으면 된다.
아이콘 테마
아이콘 역시 바꿀 수 있다. 이 아이콘 테마들은 모양새에 있다. 모양새에서 ‘아이콘’ 탭을 클릭하면 다양한 아이콘 테마들을 선택할 수 있다. 물론 인터넷을 통해서 다운로드 받을 수 있다.
자주 사용하는 테마는 GNUStep, McMuse-pink-dark 다.
마무리
XFCE 는 경량 데스크탑으로 불리운다. GTK 기반으로 제작되었기 때문에 GTK 테마라면 호환이되어 사용할 수 있다. 하지만 xfce-looks 에서도 구할 수 있다. 벌써 20년이나 지났지만 CDE 테마를 고집하는건 그 특유의 레트릭한 모양의 데스크탑 그래픽을 잊을 수 없었기 때문이다.
VIM lightline 플러그인
vim 을 사용할때에 필요한 것이 상태바(Status Bar) 다. 보통은 airline 을 많이 쓰는데, 여러가지 의존성이 필요해서 사용하기에 쉽지가 않다.
lightline 은 의존성이 복잡하지 않고 간단하게 사용할 수 있다. 다음과 같이 .vimrc 에 설정을해주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
syntax on set nocompatible set hls set scs set visualbell set softtabstop=4 set tabstop=4 set shiftwidth=4 set scs set ai set si set ignorecase set showmatch filetype off set t_Co=256 set fileencodings=utf-8 set termencoding=utf-8 set encoding=utf-8 set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' "Plugin 'vim-airline/vim-airline' "Plugin 'vim-airline/vim-airline-themes' Plugin 'itchyny/lightline.vim' Plugin 'stephpy/vim-yaml' "Plugin 'pearofducks/ansible-vim' Plugin 'chr4/nginx.vim' call vundle#end() filetype plugin indent on " required! " for vim-airline "let g:airline#extensions#tabline#left_sep = ' ' "let g:airline#extensions#tabline#left_alt_sep = '|' "let g:airline_theme='molokai' let g:lightline = { \ 'colorscheme': 'solarized', \ 'active': { \ 'left': [ [ 'mode', 'paste' ], \ [ 'gitbranch', 'readonly', 'filename', 'modified' ] ] \ }, \ 'component_function': { \ 'gitbranch': 'FugitiveHead' \ }, \ } set laststatus=2 " turn on bottom bar |
t_Co=256 설정과 아래 두가지 부분의 설정이 핵심으로 보면 된다.
systemd unit 편집기 바꾸기
systemd 는 이제 리눅스 시스템의 뼈대가 되는 기본운영 방법이 되었다. 기존에는 System V Init 이였지만 RHEL 7, Ubuntu 16.04부터 기본 시스템운영 프로그램이 되었다.
systemd 는 ‘ctl’ 로 끝나는 명령어들의 집합으로 제어가 가능하다. systemctl, journalctl, timedatectl, hostnamectl, loginctl 이 대표적이다. systemctl 의 경우에는 systemd unit 파일들에 대한 제어와 설정이 가능하다. systemd unit 파일은 기존의 Systemv V init Script 를 대체하는 것으로 일종의 시스템 데몬 프로그램들이라고 보면 된다. 시스템이 시작될때에 자동으로 시작되게 한다거나 종료하게 한다거나 하는것들을 가능하게 한다.
unit 파일은 텍스트 파일이기 때문에 언제든지 파일을 열어서 편한대로 편집이 가능한데, systemctl 명령어는 이런 unit 파일에 대한 편집기능을 제공 한다. unit 파일이 있는 곳으로 가서 텍스트 편집기를 열 필요가 없이 systemctl edit –full 명령어를 이용하면 가능하다.
문제는 systemctl edit — full 명령어를 입력했을 때에 실행되는 에디터가 nano 로 열리는 경우가 많은데, 이것을 바꿀 수 있다.
다음의 내용은 다음의 링크 내용을 정리한 것이다.
SYSTEMD_EDITOR 환경변수 설정
제일 쉬운 방법은 SYSTEMD_EDITOR 환경변수 설정이다. 대부분 Bash 를 사용하기 때문에 이것을 다음과 같이 쉘 환경변수로 설정 해준다.
1 |
export SYSTEMD_EDITOR=vim |
매번 로그인 할때마다 입력하기 귀찮으면 ~/.bashrc 파일에 추가해주면 로그인할때마다 자동 적용된다.
만일 일반계정으로 로그인을 하고 sudo systemctl edit –full 명령어를 이용한다면 /etc/sudoers 파일에 다음을 추가해 줘야 한다.
1 2 |
sudo visudo Defaults env_keep += "SYSTEMD_EDITOR" |
sudo 를 실행하는 계정에 있는 환경 변수인 SYSTEMD_EDITOR 를 유지하라는 뜻이다.
update-alternatives 로 기본 에디터 변경
update-alternatives 는 alternative 가 가능한 여러 명령어들을 바꿔 주는 기능을 한다. 이것은 매우 유용한데, 예를들어 Python3 관련 버전이 여려개일 경우에 python3 에 기본 버전을 시스템적으로 지정해 줄 수 있다. update-alternatives –list 명령어를 입력하면 현재 등록된 대체가능한 명령어들이 보인다.
리눅스에서 편집기는 editor 라는 명령어로 되어 있고, 정확하게는 심볼릭 링크다, 이것을 update-alternatives 명령어로 바꿔주면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 |
update-alternatives --config editor 대체 항목 editor에 대해 (/usr/bin/editor 제공) 4개 선택이 있습니다. 선택 경로 우선순� 상태 ------------------------------------------------------------ * 0 /bin/nano 40 자동 모드 1 /bin/ed -100 수동 모드 2 /bin/nano 40 수동 모드 3 /usr/bin/vim.basic 30 수동 모드 4 /usr/bin/vim.tiny 15 수동 모드 현재 선택[*]을 유지하려면 <엔터>를 누르고, 아니면 선택 번호를 입력하시오: |
위에 내용을 보면 기본 에디터로 nano 가 설정되었다고 나온다. 이것을 바꿔주면 시스템적으로 기본 에디터가 변경되게 된다.
EDITOR 환경변수 지정
실행할때에마다 EDITOR 환경변수를 다음과 같이 지정해주면 된다.
1 |
sudo EDITOR=vim systemctl edit <foo> |
DNF 사용하기
CentOS 8 로 넘어오면서 기본 패키지 매니지먼트로 dnf 가 되었다. 여전히 yum 을 지원하지만 앞으로는 dnf 로 쭉 간다고 하니 이참에 배워보자고 생각하지만….
겁나 빡치는게, 이제 그만 바꿨으면 한다. 뭔 yum 정도로도 충분히 잘 쓰고 있고 괜찮다고 싶다. 무슨 겁나 가볍네, 더 빠르네 어케 좋네… 응 yum 도 그렇게 느리고 그렇게 무겁지도 않아! 도대체 뭘 할때마다 갈아 엎고 이걸 새로 배우라고 하니.. 뭐 어쩌것나.. 그렇게 하겠다는데, 닥치고 배워야지!
dnf
햐.. 쓰기도 귀찮다… “DNF is the next upcoming major version of YUM, a package manager for RPM-based Linux distributions” 이렇게 맨 페이지에 설명이 나온다.
사용법
사용법은 아주 간단하다. yum 의 기본 사용법은 대동소이하다고 하겠다.
1 2 3 4 5 6 7 8 9 10 |
]# dnf check-update ]# dnf update ]# dnf install kernel ]# dnf remove kernel ]# dnf info kernel ]# dnf clean all ]# dnf history ]# dnf repolist ]# dnf repoinfo |
이정도만 알아도 패키지를 다루는데는 문제가 없을 것이다.
CentOS에서 SNMP 설치 및 설정하기
SNMP(Simple Network Management Protocol) 은 원래 네트워크 장비를 관리하기 위한 통신 규약입니다. 그런데, 이제는 네트워크 장비뿐만아니라 컴퓨터, 전자장비까지 확장해서 사용하고 있습니다. 리눅스 시스템에서도 SNMP를 사용할 수 있습니다.
이를 이용하면 SNMP 를 이용해서 중앙집중식으로 각각의 장비들의 자원, 자원사용량등을 장비에 거의 모든 것을 알 수 있고 가지고 올 수 있습니다. 저의 경우에는 Cacti 라는 시스템 자원 모니터링 시스템에서 원격 시스템의 자원 사용량을 가지고 오기 위해서 각 서버마다 SNMP를 사용합니다.
준비
이 문서는 다음과 같은 환경에서 작성되었습니다.
- CentOS 7
- X86_64
SNMP는 서버/클라언트 구조를 가지고 있습니다. 중앙 집중식으로 한 곳에서 정보를 모을 경우에는 중앙 서버를 제외하고 SNMP 데몬만 설치해주면 됩니다.
설치
설치는 Yum 을 이용해 다음과 같이 해주면 됩니다.
1 |
yum install net-snmp [ net-snmp-utils ] |
위에 뒷부분 ‘net-snmp-utils’ 는 SNMP 데몬하고는 아무런 관련이 없기 때문에 설치를 않해되 되지만 SNMP 데몬의 제대로 동작하는지를 테스트하기 위해서는 설치해주는 것이 좋습니다. ‘net-snmp-utils’ 는 말 그대로 SNMP를 다루기위한 여러가지 명령어들이 들어 있습니다.
설정
CentOS7 의 특징은 데몬이 실행될때에 옵션을 제공해 줄 수 있는데, 이를 위해서 ‘/etc/sysconfig’ 디렉토리에 데몬이름으로 파일을 가지게 됩니다. 그러면 데몬 실행 프로그램에서 이를 import 해서 사용하곤 하는데 SNMP 데몬도 이와 같습니다.
먼저 데몬 실행 옵션을 다음과 같이 설정 해줍니다.
1 |
OPTIONS="-LS1-5d -Lf /dev/null -p /var/run/snmpd.pid" |
위 옵션들은 다음과 같습니다.
- -Ls 는 로그 메시지 stderr, stdout 으로 내보내고 로그레벨을 정한다. 기본은 -Lsd 로 d 는 LOG_DEBUG 을 말한다. 로그의 수준은 0 ~ 7 까지 존재하는데 다음과 같다.
123456780 or ! for LOG_EMERG,1 or a for LOG_ALERT,2 or c for LOG_CRIT,3 or e for LOG_ERR,4 or w for LOG_WARNING,5 or n for LOG_NOTICE,6 or i for LOG_INFO, and7 or d for LOG_DEBUG.
이는 -LSwd 나 -LS4d 식으로 숫자와 알파벳으로 지정할 수 있다. -LSed / -LS3d 같은 예제이다. 또, -LS1-5d 처럼 로그레벨 수준을 어디서 어디까지로 정할 수도 있다. 위 예제에서는 데몬 메시지를 syslog 로 보내는데 로그 레벨 1~5까지를 보내라는 뜻이다. - -Lf 는 지정한 파일로 로그 메시지를 보낸다. 위 예제에서는 /dev/null 임으로 로그 메시지를 삭제하는 효과를 보인다.
- -p 는 pid 파일을 지정해 준다.
다음으로 SNMP 자체 설정을 합니다. 아래의 예제는 시스템 자원을 읽기 전용으로만 설정하는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# sec.name source community com2sec readonly 192.168.96.0/20 Nrc65amr com2sec readonly 127.0.0.1 Nrc65amr # groupName securityModel securityName group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly view all included .1 80 # group context sec.model sec.level prefix read write notif access MyROGroup "" any noauth exact all none none syslocation Unknown (edit /etc/snmp/snmpd.conf) syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf) |
SNMP 설정은 ‘sec.name’ 별로 설정을 할 수 있습니다. sec.name 을 여러게 정의하면 group도 여러개 설정할 수 있고 이렇게 되면 access 도 여러개 설정할 수 있습니다. 주목할 것은 access 에서 뒷부분에 read, write, notif 가 보이는데, 위 예제가 시스템 자원을 읽기만 할 것이기 때문에 read 부분만 all 로 하고 나머지를 none 으로 한 것입니다.
마지막으로 systemd 에 snmpd 를 활성화 해주고 시작해 줍니다.
1 2 |
systemctl enable snmpd systemctl start snmpd |
로깅 변경
위 설정대로 하면 snmpd 로그가 /var/log/messages 에 저장이 됩니다. 하지만 /var/log/messages 는 커널 메시지도 저장되고 하는 중요한 것이여서 별도 파일에 저장하는 것이 좋습니다.
이를 위해서 snmpd 를 위한 별도의 로그 파일 설정을 해주는데, 먼저 /etc/sysconfig/snmpd 설정을 다음과같이 바꿔 줍니다.
1 |
OPTIONS="-Ls6 -Lf /dev/null -p /var/run/snmpd.pid" |
rsyslog 데몬에서 다음과 같이 설정해 줍니다.
1 2 |
*.info;mail.none;authpriv.none;cron.none;local6.none /var/log/messages local6.* /var/log/snmpd.log |
위에 예제에서 첫번째라인은 로그레벨 6 에 대해서는 /var/log/message 에서 제외하고 로그레벨6은 /var/log/snmpd.log 에 저장하도록 지정한 것입니다.
이렇게 해주고 데몬을 재시작 해줍니다.
1 2 |
systemctl restart snmpd systemctl restart rsyslog |
로그 로테이션도 설정해 줍니다.
1 2 3 4 5 6 7 8 9 10 |
--- /etc/logrotate.d/syslog.orig 2015-12-29 22:10:00.089000000 +0900 +++ /etc/logrotate.d/syslog 2015-12-29 22:10:44.926000000 +0900 @@ -3,6 +3,7 @@ /var/log/messages /var/log/secure /var/log/spooler +/var/log/snmpd.log { missingok sharedscripts |
만일 일일이 출력하고 싶지 않다면 /etc/snmp/snmpd.conf 파일에 다음과 같이 설정해 줍니다.
1 |
dontLogTCPWrappersConnects yes |
Firewalld 설정
CentOS 7 에서는 iptables 에서 firewalld 로 변경되었습니다. snmpd 를 위해 firewalld 를 설정해 줘야 합니다.
먼저 snmp 관련해서 방화벽 열기위한 정보를 xml 파일로 작성해 줍니다.
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>SNMP</short> <description>SNMP protocol</description> <port protocol="udp" port="161"/> </service> |
그리고 다음과 같이 public zone 에 등록해줍니다.
1 2 3 |
firewall-cmd --reload firewall-cmd --zone=public --add-service snmp --permanent firewall-cmd --reload |