메인 운영체제로써의 리눅스 사용기 (시즌 2)

원래 WSL을 통해 아치 리눅스를 사용 중이었는데 직접 설치하는 손맛이 그리워서(?) 다시 리눅스를 사용해보려 합니다.

이번에는 메인 운영체제로 사용할 예정이며, 저번에는 '적응기’였는데 이번에는 왜 '사용기’냐면 이제는 적응을 다 했다고 생각하기 때문입니다.

배포판은 아치 리눅스를 사용하며, 윈도우와 멀티 부팅을 구성합니다. (윈도우는 주로 게임용으로)

매월 나오는 아치 리눅스 공식 ISO가 아닌, 커스텀한 ISO를 이용합니다. 아치 리눅스 ISO 만들기 · GitHub

7개의 좋아요

파티션 작업

파티션 작업은 윈도우 PE에서 미리 해놨습니다. 따라서 리눅스에서는 단순히 파티션 타입을 변경하고 포맷만 하겠습니다.

파티션 타입을 변경하는 작업은 여기서 설명하지 않습니다.

이번에는 루트 파티션과 서브 파티션에 모두 F2FS를 사용하겠습니다. EFI 시스템 파티션은 미리 포맷해놨습니다.

mkfs.f2fs -l Linux -O extra_attr,inode_checksum,sb_checksum,encrypt,lost_found,verity,compression /dev/nvme0n1p3
mkfs.f2fs -l LinuxDev -O extra_attr,inode_checksum,sb_checksum,encrypt,lost_found,verity,compression /dev/sda2

그런 다음 멀티 부팅 구성을 위해 윈도우를 설치하겠습니다.

3개의 좋아요

윈도우를 설치하고 세팅까지 완료했습니다. 이제 아치 리눅스 설치 미디어로 부팅합니다.

이전 내용. 커스텀 ISO를 이용하면 와이파이에 수동으로 연결할 필요가 없습니다.

와이파이 연결

이제 와이파이에 연결하겠습니다. 물론 유선 네트워크 쓰시는 분들은 건너뛰어도 됩니다.

iwctl
station wlan0 scan
station wlan0 connect (SSID)
exit
1개의 좋아요

파티션 마운트

이제 파티션들을 마운트합니다. 참고로 저는 systemd-gpt-auto-generator를 사용할 것이기 때문에 fstab은 만들지 않습니다.

mount -o compress_chksum,compress_algorithm=zstd:6,noatime,atgc,gc_merge /dev/nvme0n1p3 /mnt
chattr -R +c /mnt
mount --mkdir /dev/nvme0n1p1 /mnt/boot

아치 리눅스 설치

이제 리눅스 설치를 진행합니다.

pacstrap -KP /mnt base base-devel cachyos-keyring linux-cachyos-bore-lto linux-cachyos-bore-lto-headers linux-firmware-amdgpu linux-firmware-intel intel-ucode f2fs-tools zlib-ng-compat networkmanager iwd iptables-nft firewalld openssh nano sudo git zsh less efibootmgr

CachyOS mirrorlist를 복사합니다.

cp /etc/pacman.d/cachyos* /mnt/etc/pacman.d/

설치한 리눅스로 들어갑니다.

arch-chroot /mnt
1개의 좋아요

나머지 설치 진행

multilib 저장소를 활성화 합니다.

nano /etc/pacman.conf
([multilib]와 그 아랫줄에 있는 주석 제거)
pacman -Syy

시간대를 설정합니다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
hwclock --systohc
date

locale을 설정합니다.

nano /etc/locale.gen
(en_US.UTF-8 UTF-8의 주석 처리 해제)
(ko_KR.UTF-8 UTF-8의 주석 처리 해제)
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

호스트 이름을 설정합니다.

echo naLinux > /etc/hostname

사용자를 만듭니다.

useradd -m -G wheel -s /bin/zsh na1307
passwd na1307

sudoer를 설정합니다.

EDITOR=nano visudo
%wheel ALL=(ALL:ALL) ALL

네트워크를 설정합니다.

systemctl enable NetworkManager
nano /etc/NetworkManager/conf.d/wifi_backend.conf
[device]
wifi.backend=iwd
systemctl enable firewalld

initramfs 대신 통합 커널 이미지(UKI)를 만들도록 설정합니다.

nano /etc/kernel/cmdline
rw rootflags=compress_chksum,compress_algorithm=zstd:6,noatime,atgc,gc_merge
nano /etc/mkinitcpio.d/linux-cachyos-bore-lto.preset
(default_image에 주석 처리)
(default_uki의 주석 처리 해제, 경로를 /boot로 시작하도록 변경)

통합 커널 이미지를 생성합니다.

mkdir /boot/EFI/Linux
mkinitcpio -P
rm -f /boot/initramfs-*.img
1개의 좋아요

메인보드 부팅 엔트리에 리눅스 추가

저는 부트로더를 사용하지 않고 UEFI에서 바로 UKI로 부팅하는 방식을 사용합니다. 이렇게 하면 멀티부팅 메뉴 없이 바로 리눅스로 부팅됩니다. 만약 윈도우로 부팅하고 싶다면? 메인보드의 바이오스 설정에서 부팅 항목을 선택하면 됩니다.

efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Arch Linux" --loader '\EFI\Linux\arch-linux-cachyos-bore-lto.efi' --unicode

재부팅

파티션을 언마운트하고 재부팅합니다.

exit
umount /mnt/boot
umount /mnt
reboot
1개의 좋아요

재부팅 후 작업

와이파이에 연결합니다.

nmcli device wifi connect (SSID) password password

시계 동기화를 활성화합니다.

sudo timedatectl set-ntp true
1개의 좋아요

파티션 마운트 및 램디스크 설정

필요한 파티션들을 마운트하도록 설정합니다. systemd automount 기능을 사용하겠습니다.

sudo mkdir /mnt/data
sudo nano /etc/systemd/system/mnt-data.mount
[Mount]
What=/dev/disk/by-uuid/(UUID)
Where=/mnt/data
Type=ntfs3
Options=ro
sudo nano /etc/systemd/system/mnt-data.automount
[Automount]
Where=/mnt/data
TimeoutIdleSec=600

[Install]
WantedBy=multi-user.target
sudo systemctl enable mnt-data.automount

일부 디렉토리에 tmpfs를 이용한 램디스크를 설정합니다.

sudo nano /etc/systemd/system/var-cache.mount
[Mount]
What=tmpfs
Where=/var/cache
Type=tmpfs
Options=rw,nosuid,nodev,size=4G

[Install]
WantedBy=multi-user.target
sudo systemctl enable var-cache.mount

/var/log/var/lib/systemd/coredump에 대해서도 똑같이 해줬습니다.

1개의 좋아요

zram 활성화

저는 스왑 대신 zram을 사용하겠습니다.

sudo pacman -S zram-generator
sudo nano /etc/systemd/zram-generator.conf
[zram0]
zram-size = 16384
compression-algorithm = zstd
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0

zram 사용할 때는 zswap을 끄는 것이 좋습니다.

sudo nano /etc/kernel/cmdline
rw zswap.enabled=0 rootflags=...
sudo mkinitcpio -P

그 다음 재부팅합니다.

1개의 좋아요

보안 부팅(Secure Boot) 설정

사실 저는 보안 부팅을 요구하는 게임을 하고 있지는 않지만 그래도 사용하려 합니다.

메인보드의 바이오스 설정에서 키들을 전부 지우고 보안 부팅 자체도 비활성화해 줍니다.

sbctl을 설치합니다.

sudo pacman -S sbctl
reboot

상태를 확인해줍시다.

sudo sbctl status

Secure Boot는 disabled, Setup mode는 enabled라고 떠야 합니다.

이제 키를 등록하고 UKI에 서명합니다.

sudo sbctl create-keys
sudo sbctl enroll-keys -m (MS의 키를 같이 등록함)
sudo sbctl status (여기서 installed라고 떠야 함)
sudo sbctl sign -s /boot/EFI/Linux/arch-linux-cachyos-bore-lto.efi

서명하는 과정은 이번 한 번만 하면 됩니다. 나중에 커널이 업데이트될 때는 pacman hook이 자동으로 서명해 줄 것입니다.

이제 재부팅하고 바이오스 설정에서 보안 부팅을 활성화합니다. sudo sbctl status에서 Secure Boot가 enabled라고 뜨면 성공입니다.

위 과정에서 MS의 키를 같이 등록했으므로 윈도우로의 부팅도 잘 될 것입니다. 리눅스는 윈도우와는 다르게 기본적으로 부팅 시 서명되지 않은 모듈(DKMS)의 로딩을 허용하기 때문에 모듈을 사용하는 경우에도 문제가 없습니다.

1개의 좋아요

bluehill 저장소 추가

bluehill 저장소를 추가합니다. 이 저장소에는 여러 가지 미리 빌드된 AUR 패키지들이 있습니다. 참고로 제가 쓰는 AUR 패키지들은 여기에 있습니다.

sudo nano /etc/pacman.conf
[bluehill]
Server = https://storage.googleapis.com/bluehillaur/
sudo pacman -Syy

PGP 키를 가져옵니다.

sudo pacman-key -r AB69CFD0BE72421F --keyserver keys.openpgp.org
sudo pacman-key -f AB69CFD0BE72421F # 지문이 11EC DFAA EFB2 7D0C 1FE0 이어야 함
sudo pacman-key --lsign-key AB69CFD0BE72421F

한글 폰트 설치

나눔글꼴과 D2Coding 폰트를 설치합니다. 먼저 bluehill 저장소를 추가하셔야 합니다.

sudo pacman -S ttf-nanum-meta ttf-d2coding

한국어로 언어 바꾸기

sudo nano /etc/locale.conf
(en_US를 ko_KR로 변경)

재부팅하면 한글이… 반겨주지 않습니다. 콘솔 환경에서는 한글을 출력할 수 없기 때문입니다.

데스크톱 환경 및 PipeWire 설치

한글 폰트를 설치했다고 해서 콘솔에 한글이 나오는 건 아닙니다. 데스크톱 환경을 설치해줘야만 합니다.

xfce는 Wayland가 실험적 지원이고, GNOME은 제 마음에 들지 않았습니다. 그래서 KDE를 사용하려 합니다. 아래 명령은 Plasma 데스크톱 환경과 몇몇 앱들을 설치합니다.

sudo pacman -S plasma-desktop breeze-gtk kde-gtk-config plasma-nm plasma-pa plasma-browser-integration plasma-firewall dolphin konsole spectacle ark kalk koko haruna okular kfind kget ksystemlog plasma-systemmonitor kscreen kinfocenter plasma-disks kdf kgpg kwalletmanager kwallet-pam ksshaskpass kdialog

jack 뭐시기가 나오는데 이때는 pipewire-jack을 선택합니다.

디스플레이 매니저도 설치해야 합니다. 보통 KDE에는 SDDM을 많이 씁니다.

sudo pacman -S sddm sddm-kcm
sudo systemctl enable sddm

설치를 완료했으면 재부팅합니다.

1개의 좋아요

한글 입력기 설치

Gemini가 KDE와 Wayland 환경에서는 Fcitx5가 좋답니다. 설치합시다.

sudo pacman -S fcitx5 fcitx5-hangul fcitx5-qt fcitx5-gtk fcitx5-configtool

그런 다음 이 링크에서 나온 대로 해 줍니다. 여기서 설명하기에는 좀 복잡하군요.

오른쪽 Alt 키를 한영키로 인식시키기 위해서 아래와 같이 해 줍니다. 그냥 Alt 키를 전환 키로 쓰면 안되냐고 물을 수도 있는데, 그렇게 하면 Alt키로도 기능하고 한영키로도 기능하더군요.

sudo nano /etc/udev/hwdb.d/90-custom-keyboard.hwdb
evdev:input:b*v*p*e*
 KEYBOARD_KEY_700e6=hangeul
 KEYBOARD_KEY_700e4=hanja
sudo systemd-hwdb update
sudo udevadm trigger
1개의 좋아요

소프트웨어 설치

여러가지 소프트웨어들을 설치합니다.

Microsoft Edge

sudo pacman -S microsoft-edge-stable-bin

Visual Studio Code

sudo pacman -S visual-studio-code-bin

Oh My Zsh

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
nano ~/.zshrc
ZSH_THEME="sunaku"

블루투스 스택

sudo pacman -S bluez bluedevil
sudo systemctl enable bluetooth

그리고 재부팅합니다.

Galaxy Buds Client

sudo pacman -S galaxybudsclient-bin

닷넷

닷넷을 시스템 영역에 설치하는 대신 dotup 버전 관리 도구를 이용합시다.

sudo pacman -S dotup-bin

Fast Node Manager

sudo pacman -S fnm-bin

JetBrains Toolbox

sudo pacman -S jetbrains-toolbox

KDE Connect

윈도우에 휴대폰과 연결이 있다면 KDE에는 KDE Connect가 있습니다. 기능도 휴대폰과 연결보다 강력합니다.

sudo pacman -S kdeconnect sshfs

그 다음에는 firewalld 방화벽 규칙을 구성합니다. kdeconnect 서비스에 체크하면 됩니다.

이제 안드로이드 기기에 KDE Connect를 설치하고 설정을 진행합니다.

2개의 좋아요

OpenSSH 및 ksshaskpass 설정

SSH 키를 KWallet에 저장해서 ssh-add만으로 키를 불러올 수 있게 합니다.

먼저 OpenSSH를 systemd 서비스로 추가합니다.

mkdir -p ~/.config/systemd/user/
nano ~/.config/systemd/user/ssh-agent.service
[Unit]
Description=SSH key agent

[Service]
Type=simple
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now ssh-agent
nano ~/.zshrc
export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"

다음으로 ksshaskpass를 설정합니다.

mkdir -p ~/.config/environment.d
~/.config/environment.d/ssh_askpass.conf
SSH_ASKPASS=/usr/bin/ksshaskpass
SSH_ASKPASS_REQUIRE=prefer

이제 ssh-add 명령어를 실행하고 암호 기억에 체크한 후 암호를 입력하면 다음부터는 암호를 입력할 필요가 없습니다.

1개의 좋아요

DNS 설정

DNSSEC, DNS over HTTPS를 설정합니다. 먼저 필요한 패키지를 설치합니다.

sudo pacman -S dnscrypt-proxy unbound

dnscrypt-proxy를 구성합니다.

sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
server_names = ['cloudflare']
listen_addresses = ['127.0.0.1:5300']
cache = false

Unbound를 구성합니다.

sudo nano /etc/unbound/unbound.conf
server:
	do-not-query-localhost: no
forward-zone:
	name: "."
	forward-addr: 127.0.0.1@5300

NetworkManager를 구성합니다.

sudo nano /etc/NetworkManager/conf.d/dns.conf
[main]
dns=none
sudo systemctl restart NetworkManager

DNS를 구성합니다.

sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf
nameserver 127.0.0.1
options edns0 trust-ad

서비스를 활성화합니다.

sudo systemctl enable --now dnscrypt-proxy unbound
sudo systemctl restart NetworkManager
1개의 좋아요

윈도우로 재부팅하는 스크립트 생성

저는 기본적으로 리눅스로 부팅하도록 설정했기 때문에 윈도우로 재부팅하려면 bcdedit이나 efibootmgr 명령을 써야 하는 불편함이 있습니다. 따라서 쉽게 재부팅할 수 있도록 리눅스 셸 스크립트와 윈도우 파워셸 스크립트를 만들었습니다.

리눅스 셸 스크립트

#!/usr/bin/bash

TARGET_NAME="Windows Boot Manager"
BOOT_ID=$(efibootmgr | grep -i "$TARGET_NAME" | head -n1 | awk '{print substr($1, 5, 4)}')

if [ -z "$BOOT_ID" ]; then
    return 1
fi

(echo "(user password)" | sudo -S efibootmgr -n "$BOOT_ID") && reboot

윈도우 파워셸 스크립트

# 관리자 권한 확인
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
    exit
}

# 1. 펌웨어 목록에서 "Windows Boot Manager"가 포함된 항목 찾기
$targetLabel = "Windows Boot Manager"
$bootEntry = bcdedit /enum firmware | Select-String -Pattern $targetLabel -Context 5,0

if ($bootEntry) {
    # 2. 식별자(identifier) 라인 파싱 ({GUID} 추출)
    # Context를 이용해 "Windows Boot Manager" 줄의 위쪽에서 identifier를 찾음
    $guidLine = $bootEntry.Context.PreContext | Select-String "identifier"
    $guid = $guidLine.ToString().Split(" ")[-1].Trim()

    # 3. 부팅 순서 변경 및 재부팅
    bcdedit /set "{fwbootmgr}" bootsequence $guid /addfirst
    shutdown /r /t 0
} else {
    Write-Host "Error: '$targetLabel' entry not found in BCD." -ForegroundColor Red
    Pause
}
1개의 좋아요

QEMU 설치

리눅스에서는 VMware보다는 KVM이 좋다고 들어서 QEMU를 설치하려 합니다.

sudo pacman -S qemu-desktop virt-manager dnsmasq swtpm
sudo usermod -aG libvirt $USER
sudo systemctl enable libvirtd

그리고 재부팅합니다. 가상 장비 관리자라는 앱이 설치되어 있을 것입니다.

1개의 좋아요

게이밍 세팅하기

사실 이번에는 리눅스에서 게임은 안 하려고 했습니다만, 그래도 호기심이 도져서 ㅠㅠㅠㅠ

Polychromatic

sudo pacman -S polychromatic
sudo gpasswd -a $USER openrazer
systemctl --user enable openrazer-daemon

그리고 재부팅합니다.

스팀

sudo pacman -S steam steam-native-runtime proton-cachyos

하드웨어에 맞는 적절한 드라이버를 선택합니다. 저는 vulkan-radeon을 선택했습니다.

디스코드

sudo pacman -S discord

xpadneo

엑스박스 시리즈 X 컨트롤러를 사용하기 위해서 xpadneo를 설치합니다.

sudo pacman -S xpadneo-dkms

그리고 재부팅합니다.

GameMode

sudo pacman -S gamemode lib32-gamemode
sudo gpasswd -a $USER gamemode

그리고 재부팅합니다.

Gamescope

sudo pacman -S gamescope

이제 위의 GameMode와 결합해서 스팀에서 아래와 같이 사용할 수 있습니다.

gamemoderun gamescope -W 1920 -H 1080 -r 240 -f --adaptive-sync -- %command%

ProtonUp-Qt

sudo pacman -S protonup-qt

여기서 GE Proton 같은 것들을 설치할 수 있습니다.

Prism Launcher

sudo pacman -S prismlauncher
3개의 좋아요