아치리눅스 설치 과정 15 - tty 콘솔창 터미널 한글 입력 출력, 한글폰트
이전 글(아치리눅스 설치 과정 14 - github 사용 위한 git 설치, make 컴파일 환경)에 이어...
yaft 관련 글입니다. sudo yaft 일수도 있죠.
재부팅은 하셨습니까? 안했다면 reboot 입력해서 한 번 하고 오시죠.ㅎ
그리고, 시작 전에 안좋은 소리 좀 하겠습니다.
▲ 좋은 마음으로 튜토리얼 써서 배포했는데, 쉬발~ 1분 안에 페이지 이동을 몇 번이나 하는 거냐? 간보지 말고 끝까지 따라와라. 아치위키 보면서 시간 낭비해봤자 본인 손해임.
아치 계열 리눅스 설치시 체감되는 가장 큰 장점은
"많이 쓰는 명령어의 도움말은 한글화가 되어 있다."는 것입니다.
모르겠으면 도움말부터 찾아보는 습관이 들더군요.
그런데 아치리눅스 설치 이후 한글 로케일 설정했더니
콘솔창(TTY console)에서 한글이 ㅁ으로 뜨네요? 이러면 실사용 힘든데 ;;;
아치 리눅스 한글폰트 설치
GUI 설치 시점까지 한글폰트 설치 과정은 무조건 들어가야 되니, 이참에 한글 폰트 설치해 봤습니다.
이것으로 문제가 해결되면 좋겠습니다.
LANG=en_US.UTF8
pacman -Ss cjk
pacman -Ss "korean font"
급하게 1회성으로라도 언어를 영어로 바꾸고, 한글 폰트로 설치할만한 것이 있을지 찾아봤습니다.
구글 폰트가 무난해 보이더군요. noto-fonts-cjk. 중국어(c) 일본어(j) 한국어(k) 통합 폰트.
https://archlinux.org/packages/?sort=&q=cjk&maintainer=&flagged=
https://archlinux.org/packages/?sort=&q=korean+font&maintainer=&flagged=
웹페이지에서도 패키지 검색. 교차검증 결과 큰 차이를 못느꼈습니다.
pacman -S noto-fonts-cjk
구글 폰트를 설치했습니다. 정답은 없습니다. 취향껏...
pacman -S fontconfig
리눅스에서 폰트를 관리하려면 필요한 fontconfig 패키지도 설치.
참고 문서 :
https://wiki.archlinux.org/title/General_recommendations (11-1. Fonts)
https://wiki.archlinux.org/title/Font_configuration
fc-list :lang=ko
한글 폰트 있나? /usr/share/fonts/noto-cjk/ 경로로 들어갔음을 확인했습니다.
fc-cache -f -v
로그아웃/재부팅하면 폰트캐시에 설치했던 폰트들이 반영되는데,
재부팅 귀찮으니까 fc-cache 명령어로 폰트캐시 목록에 추가하는 식으로 진행했습니다.
이후 한글 출력 테스트.
해결이 안됐군요.ㅠㅠ
리눅스 콘솔창, 한글폰트 출력 문제의 원인
▼ 일반적으로 사용되는 폰트는 /usr/share/fonts/ 경로에 있는데, 설치한 noto-cjk 폰트의 개별 파일 크기는 26MB 정도 됩니다.
▲ 하지만 리눅스 콘솔창(tty)에서 사용되는 폰트는 /usr/share/kbd/consolefonts/ 경로에 있다고 하더군요. 개별 폰트 파일의 크기는 4KB 미만이었습니다. 비교가 안 될 정도로 작죠? psfu.gz 파일은 비트맵 폰트인 것 같습니다.
▲ 개발자 분들이 좋아하시는 Dina 영문 폰트가 67KB 정도던데 그보다 더 작은 용량이라니.ㄷㄷㄷ
▲ 심지어 일반적인 영문 폰트보다 글리프 숫자를 극단적으로 줄인 것 같습니다. 그래서 4KB 미만의 용량이 나온 듯한데, 이것을 한글 폰트가 따라가기엔 현실적으로 불가능에 가깝겠지요.
영어권 문자는 1바이트, 중국어/일본어/한국어 같은 아시아권 문자는 2바이트(2Byte) 그래서 어쩌고 하면서 썰을 푸는 글들도 아주 틀린 것은 아닌데, 유니코드 UTF8은 4Byte까지도 차지하는 상황에서 2바이트 얘기로 끼워맞추는 것은 다소 억지스럽고... 글리프 테이블에 해당 문자가 없어서 생기는 문제라고 보는 것이 맥락에 맞을 듯한데, 어찌됐든 리눅스 콘솔창은 1바이트 출력만 고집하고 있는 것 같습니다.
프레임버퍼 콘솔창?
▲ 리눅스 콘솔 창에서 한글 출력, 입력을 위한 눈물겨운 노력의 역사는 20년 가까이 이어진 것 같은데요, 위 문서에서 언급한 프로그램들만 적더라도 unicon, fbcon-hanio, fbterm(frame buffer terminal), jfbterm, zhcon, han2 등 굉장히 다양했습니다.
구현 방식은 크게 2가지로 분류되는데,
- 리눅스 커널 소스에 직접 패치를 하고 리눅스 커널 재컴파일하여 사용하는 방법
- 프레임버퍼 프로그램을 활용하여 프레임버퍼 콘솔창을 띄워 쓰는 방법
첫번째 구현 방식은 비교적 근본적인 해결책인 것 같은데, 일반인이 커널 컴파일까지 하기에는 부담스럽고 20년 가까이 된 기술이 리눅스 커널에 정식 반영되지 못했다는 것은... 서로간에 껄끄러운 뭔가가 있는 것 같죠? 요즘에는 잘 안쓰이는 것 같고...
두번째 구현 방식 : 프레임버퍼는 대략 이런 느낌인 것 같습니다. 콘솔창의 내용을 버퍼에 담아 뒀다가 프레임(애니메이션 프레임 생각하세요)으로 그려서 뿌려주는 기술? 그러니까 한글도 그려주고 사진도 그려주고 동영상도 그려주고... 하는 콘솔창과 GUI의 중간 어디쯤에 있는 기술인 것 같습니다.
프레임버퍼 콘솔 기능은 리눅스 커널에 기본적으로 들어 있어서 GRUB2 부트로더에서도 활성화시킬 수 있는데, 뭐가 부족한지 서드파티 frame buffer terminal 프로그램을 별도로 설치 사용하여 한글 입출력 문제를 해결하는 방식이 많이 활용되는 것 같습니다.
yaft (Yet Another Framebuffer Terminal) 설치, 한글출력 패치
Yet Another Framebuffer Terminal, 줄여서 yaft라는 프레임버퍼 터미널 프로그램이 있는 것 같습니다.
https://gall.dcinside.com/github/14140
https://gall.dcinside.com/github/10620
▲ 2020년에 yaft 패키지에 한글화 패치 적용하는 사례가 올라왔는데, 제 생각에는 fbterm / jfbterm보다 나을 것 같아서 yaft를 활용해볼 생각입니다. (선택 이유 : 패치 제작자 피셜, 버그 수정+정돈 완료.)
이전 글을 따라하여 git, make 컴파일 환경 구축을 했다는 것을 전제로 하고,
콘솔창에서 curl 이용하여 파일 다운로드할 때 드롭박스 활용합니다. 가입 후 따라오시길 바랍니다.
(드롭박스(Dropbox) 무료 용량 16GB까지 늘리는 첫단추 : 추천링크 가입)
https://gall.dcinside.com/github/10620
위 링크에서 QR코드같이 생긴 그림파일 다운로드 하세요. 한글출력 패치 파일입니다.
▲ 그림파일을 드롭박스에 업로드하고, 공유 링크 확보합니다.
pacman -S libhangul
의존 패키지 libhangul 설치합니다.
cd /usr/local/src/
/usr/local/src/는 서드파티 프로그램들의 소스를 넣는 곳입니다. 윈도우의 C:\Program Files 정도로 생각하시길. 참고로 /usr/src/ 는 리눅스 운영체제에 관련된 소스를 넣는 곳입니다. )
git clone https://github.com/uobikiemukot/yaft.git
yaft 디렉토리를 만들면서 yaft 소스를 다운받습니다.
cd yaft
curl -L https://드롭박스 공유링크 -O
ls -l 드롭박스링크 파일명
yaft 디렉토리로 들어간 다음 한글패치 파일을 다운받고, 한글패치 파일 용량이 일치하는지 확인하세요. 드롭박스는 curl 사용시 문제 없는데, 긴 주소 줄이려고 단축주소 사이트 잘못 경유하면 curl로 받은 파일이 온전치 않습니다.
pacman -S imagemagick
아래에 적는 convert 명령으로 한글패치를 추출하기 위해서는 imagemagick 패키지가 필요합니다. 없으면 command not found 등의 에러가 출력될 거예요.
export LANG=en_US.UTF-8
yaft 제작자가 입력을 권장합니다.
convert 이미지파일이름.png RGB:- | xz -d -c - > hangul.patch
스테가노그래피 기법으로 숨겨둔 한글패치 파일을 이미지 파일(png 확장자)에서 추출합니다.
※ 세벌식 사용자는 이 부분을 추가하셔야 됩니다.
- hangul.patch 파일 추출한 것을 에디터로 엽니다. (nano가 만만하고 좋습니다.)
▲ hangul_ic_new 항목을 찾습니다. 158째쭐 쯤에 있는데...
hangul_ic_new("2"); 에서 숫자 2가 두벌식이라는 뜻입니다.
위 스샷을 참고하여, 숫자 2를 3f(세벌식 최종) / 39(세벌식 390) 등 본인이 사용하는 것으로 바꾸고, 저장+빠져나옵니다.
※ 도움 받은 문서들
patch -p1 < hangul.patch
추출된 한글패치를 적용합니다.
make
yaft 소스를 설치파일로 빌드합니다. 참고로 빌드의 단계 중에 컴파일이 포함되어 있기 때문에, 컴파일은 빌드의 부분집합 개념이라고 생각하면 됩니다.
make install
yaft를 PC에 설치합니다.
cd ~
로그인한 리눅스 계정(root)의 홈디렉토리로 이동합니다.
끝!
(pwd 라는 명령어를 입력해보면 현재 위치가 어디인지 경로 확인을 할 수 있습니다.)
한글 출력 테스트 해보겠습니다.
yaft (루트계정이 아니라면 sudo yaft)
yaft 프레임버퍼 터미널을 실행하는 명령어입니다.
위 스샷에서 밑줄친 것은 root 계정으로 로그인했을 때 사용하면 되는 것들입니다.
su - 계정명
로컬 계정으로 전환합니다.
※ 이것은 선택사항입니다. 하지만 저는 권장합니다.
yaft를 root 계정 권한으로만 실행할 수 있는 것이 싫다면, 아래 스샷을 참고하여 로컬계정을 video 그룹에 추가합니다.
▲ sudo gpasswd -a 계정명 video
(또는 sudo gpasswd -a \$USER video )
괄호 속의 명령어는 로컬계정 로그인 상태에서 자동으로 계정명을 입력해주는 방식입니다.
계정에 video 그룹이 추가되었는지는 아래 명령으로 확인 가능합니다.
groups 계정명
(또는 groups \$USER)
※ 도움 받은 문서들
- https://www.clien.net/service/board/lecture/18623209
- https://wiki.archlinux.org/title/users_and_groups#Pre-systemd_groups => video 항목.
※ 마음에 안든다면? 되돌리는 방법 : 로컬계정 로그인 상태에서
sudo gpasswd -d \$USER video
groups \$USER
LANG=ko_KR.UTF8
한국어 출력으로 전환합니다. 영어로 바꾸고 싶으면 LANG=en_US.UTF8 이라고 입력하면 됩니다.
sudo pacman --help
도움말 출력 테스트. 한글로 나오는지 확인합니다. 위 스샷처럼 잘 나오는 것을 확인할 수 있을 것입니다.
exit
로컬 계정에서 루트 계정으로 빠져나옵니다.
exit
yaft 종료합니다.
프레임버퍼 콘솔창, 한글 입력 설정(한영키)
한글 출력만 되면 오히려 불편할 수 있습니다. 디렉토리명이 한글로 되어 있는데 한영키가 안먹히면 들어가기가 정말 힘들거든요.
아래에 적는 방법은 yaft 뿐만 아니라, fbterm(frame buffer terminal), jfbterm 등 한글출력 설정한 모든 프레임버퍼 터미널 패키지에 적용할 수 있을 것 같습니다. 이 방법 역시 디시인사이드 원문에 잘 정리되어 있습니다. 저는 줏어먹을 뿐.
https://gall.dcinside.com/github/10620
tty 콘솔창에서 루트로 로그인하세요.
showkey
tty 콘솔창에서만 먹히는 명령어입니다. 누르는 키보드 키의 keycode를 보여줍니다.
본인이 어떤 키로 한영전환할 것인지, 누르고 출력되는 키코드를 외워두세요.
저는 왼쪽 쉬프트 42, 스페이스바 57 이라고 나옵니다. Shift + Space로 한영전환 할거라 이것만 봤습니다. 윈도우10 Hyper V 가상머신에선 한영키 키코드가 출력 안되더라고요.ㅠㅠ
(인터넷 뒤져보니까 한영키 keycode 100 이라고 나온다는데, 개인마다 다를 수 있으니 직접 확보하세요.)
10초간 키 입력이 없으면 자동으로 빠져나옵니다.
cd /root
dumpkeys > kmap
nano kmap
현재 키보드의 키코드 전체를 /root/kmap 파일로 덤프합니다. 그리고 kmap 파일을 에디터로 엽니다.
string F60 = "\200"
스크롤을 내려서 string 모음이 끝나는 곳을 찾으세요. 그리고 추가합니다.
\200이 한영전환을 뜻하는 거고, string은 기능을 할당하는 명령인 것 같습니다.
눈에 보이는 F값을 피해서 string F 설정을 등록하는 것이 원리입니다.
위 스샷에서 string F20이 끝이었는데, F60이 안보이길래 굵은 텍스트처럼 추가한 것입니다.
아까 showkey에서 외워둔 keycode를 찾으세요.
만약 한영키 keycode가 100이라면 keycode 100 = AltGR 이라고 적혀 있던 것을
keycode 100 = F60
이런 식으로 적는 겁니다.
저는 Shift+Space로 한영전환 한다고 했고, 왼쪽 쉬프트 42, 스페이스바 57 이라고 했었죠? 그래서
shift keycode 57 = F60
이렇게 적었습니다.
저장하고 빠져나오세요.
한영 전환 테스트(한글 입력)
loadkeys kmap
loadkeys는 재부팅 전(현재 세션)까지만 키맵을 적용하는 명령입니다.
yaft
yaft 프레임버퍼 터미널을 실행하세요.
(폰트 제작자 김중태 원장님, 감사합니다!!)
설정했던 한영전환 키로 입출력 테스트해보고, 빠져나옵니다.
영구적으로 적용(부팅시 로딩되도록)
nano /etc/vconsole.conf
에디터로 /etc/vconsole.conf 파일을 여세요. 없으면 만들고 들어가세요.
(데비안 계열. 우분투...는 /etc/default/keyboard 라는 것 같습니다.)
KEYMAP=/root/kmap
커스텀 키맵의 경로를 정확하게 넣고 저장+빠져나오세요.
reboot
끝.
이제부터 콘솔창(tty)에서 한글을 보고 싶으면
yaft (로컬계정은 sudo yaft)
입력 후 사용하면 됩니다.
참고 문서 :
https://wiki.archlinux.org/title/Linux_console/Keyboard_configuration
https://man.archlinux.org/man/dumpkeys.1.en
https://man.archlinux.org/man/keymaps.5.en
https://man.archlinux.org/man/vconsole.conf.5
https://m.blog.naver.com/mycute7/220012310998
https://www.comsvc.kr/xe/comsvc_tip02/21394
https://forum.ubuntu-kr.org/viewtopic.php?t=17036
https://www.kernel.org/doc/html/v5.18/fb/fbcon.html
https://sanbo0404.tistory.com/m/entry/리눅스-그래픽-프레임-버퍼
https://wnw1005.tistory.com/600
(GUI와 한글폰트 전반에 대한 내용)