kmonad 설치와 세팅 for Linux
kmonad 설치와 세팅 for Linux
(이 문서는 Linux Ubuntu 22.04 기준으로 작성되었다.)
fc980c 키보드를 linux 에서 사용하기 위해 키매핑을 진행하고자한다.
사용 중인 다른 키보드들의 경우에는 자체 지원 소프트웨어에서 키매핑을 지원하거나, 알리에서 컨트롤러 보드를 구매 후 개조해 Via/Vial 펌웨어를 올려 손쉽게 키매핑이 가능하다.
- 그런데 ydkb 에서 판매하는 컨트롤러 보드 가격이 10만원 정도하기에.. 이번에는 소프트웨어 수준에서의 키매핑을 하기로 결정했다.
Mac 환경에서는 Karabiner 라는 소프트웨어를 사용하고, Linux 에서는 kmonad 를 주로 사용한다.
kmonad 는 자유도가 높고, 지원하는 기능들이 강력하다. 특정 키를 tap 했을때와 hold 했을때 다른 기능들을 assign 해줄 수도 있고, 직접 FN 키 처럼 커스텀 레이어를 세팅해줄 수도 있다.
내가 설정하고자 한 부분들은 다음과 같다.
-
CapsLock -> LCtrl 키로 변경
-
LCtrl -> CapsLock 으로 변경하되, 키보드 상 LCtrl 키 와 <- , -> 화살표 입력시 각각 Home, End 로 동작하게끔
- Mac 환경에서의 Cmd+<- CMD+-> 같은 역할
-
Ralt -> F15
- 한영전환을 F15 (Linux 상에서는 Launch6) 로 설정
-
Win <-> LAlt
- 맥북 키배열 -> Linux 배열 변경
Kmonad 설치하기
Ubuntu Linux 의 경우 아래 페이지에서 실행파일을 다운로드할 수 있다.
https://github.com/kmonad/kmonad/releases
"kmonad" 를 다운로드하고, 터미널에서 인식할 수 있도록 다운로드한 kmonad 를 /usr/local/bin 으로 복사해준다.
아래 명령어를 통해서 복사가 가능하다.
$ sudo mv ~/Downloads/kmonad /usr/local/bin/kmonad 그리고 터미널을 다시 실행하거나 쉘을 다시 켠다. (나는 리눅스에서 zsh 쉘을 사용한다.)
$ zshconfig 생성하기
이제 kmonad 에서 활성화하기 위한 config 파일을 만들어줘야한다.
규칙은 꽤 간단하다. 몇가지 블럭들만 기억하면 손쉽게 써먹을 수 있다.
- defcfg : 기본 환경 설정을 위한 블럭
- defsrc : 키매핑 source 키
- deflayer : Layer 블럭
- defalias : 별명들을 지정 가능 (복잡한 수식 사용시)
config 파일은 아무데나 만들어도 상관은 없다. 그렇지만 관례상 아래처럼 config 를 생성하는것을 추천한다.
$ touch ~/.config/kmonad/config.kbd
$ vim ~/.config/kmonad/config.kbd그리고 config.kbd 에서 내용을 작성해주면 된다. 나의 경우에는 다음과 같다.
(defcfg
input (device-file "/dev/input/by-id/usb-LEOPOLD_LEO_98Keyboard-event-kbd")
output (uinput-sink "kmonad fc980c")
fallthrough true
allow-cmd true
)
(defsrc
caps lmet lalt lctl ralt left right
)
(deflayer default
lctl lalt lmet @caps_mod f15 left right
)
(deflayer arrows_layer
_ _ _ _ _ home end
)
(defalias
caps_mod (tap-hold 200 caps (layer-toggle arrows_layer))
)- defcfg 블럭
- device-file 에는 시스템에서 인식된 키보드 ID 를 넣어주어야한다.
$ ls /dev/input/by-id명령어를 통해 ID 를 확인할 수 있다.
- output 에는 uinput 모듈을 이용해 가상 키보드를 만들 수 있도록하고, kmonad 가 사용할 keyboard ID 를 넣어주면 된다.
- fallthrough : config 에 정의되지 않은 키 입력 처리 (false 일 경우 정의된 키만 입력)
- device-file 에는 시스템에서 인식된 키보드 ID 를 넣어주어야한다.
- defsrc 블럭
- 매핑을 적용시킬 동작들을 적어준다.
- deflayer default 블럭
- defsrc 블럭에 작성한 키코드들에 매핑할 동작들을 정의한다. (순서 맞추어서 작성)
- deflayer arrows_layer 블럭
- 나는 capslock+left : Home / capslock+right : End 로 동작하도록 새로운 레이어를 생성해주었다.
- tap 했을때는 caps 로 동작하지만, hold 할 경우 arrows-layer 가 토글되도록 작성했다.
이제 config.kbd 를 저장하고 (vim 일 경우 ESC + :xq), 아래 명령어를 입력해 제대로 키매핑이 적용되는지 확인해보면 된다.
$ kmonad ~/.config/kmonad/config.kbdpermission denied 에러가 발생한다면, 현재 사용자 계정이 kmonad 를 이용해 시스템수준에서의 input 을 제어할 수 있게끔 권한을 부여해주어야한다.
권한 설정
아래 명령어를 입력해 현재 세션의 user 에게 input, uinput 그룹에 넣어준다.
$ sudo groupadd uinput
$ sudo usermod -aG input $USER
$ sudo usermod -aG uinput $USER그리고, input 장치들에 대해 권한을 부여하기 위해, 아래와 같이 uinput 의 권한 설정 규칙을 생성해준다.
- Linux 에서는 모든 device 들이 device file 로 존재하는데, 이는 static 파일이 아님으로 매 부팅시, 혹은 장치를 연결할때마다 root 소유로 device file 이 생성된다. (보안 때문에)
- 그래서, uinput 에 접근할 수 있도록 이를 uinput 그룹 소유로 변경하는 규칙을 생성해주는 것이다.
$ vim /etc/udev/rules.d/99-kmonad.rules
파일이 열리면 아래 내용을 기입한다.
KERNEL=="uinput", MODE="0660", GROUP="uinput",OPTIONS+="static_node=uinput"이제 규칙을 적용하기 위해 아래 명령어를 실행한다.
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger아래 명령어를 통해 uinput 모듈의 상태를 확인할 수 있다.
$ sudo modprobe uinputdaemon 등록
이제, 매번 kmonad 명령어를 통해서 활성화하기엔 번거로우니 linux 시스템상에 daemon 으로 등록하자.
$ sudo vim /etc/systemd/system/kmonad.service파일이 열리면 아래 내용을 기입한다.
[Unit]
Description=Kmonad Keymapping
# 네트워크가 준비된 후 실행하도록 (안정성)
After=network.target
[Service]
User=<유저이름>
ExecStart=/usr/local/bin/kmonad /home/<유저이름>/.config/kmonad/config.kbd
#서비스가 죽으면 항상 서비스를 재시작
Restart=always
#재시작 전 3초 대기
RestartSec=3
[Install]
#부팅시 자동 시작
WantedBy=default.target이제 서비스를 등록하고, 실행하자, 아래 명령어 실행 후에도 적용이 안되면 재부팅 시도
$ sudo systemctl daemon-reload
$ sudo systemctl enable kmonad.service
$ sudo systemctl start kmonad.service