SUBNET : 현재 서브넷 설정 (예: 255.255.255.0)에 따라 Node 발견(Discover) 및 연결 (Default)
LOCALHOST : 현재 머신 내에서만 Node 발견(Discover) 및 연결
OFF : 다른 노드와 연결하지 않음, 단독 실행
SYSTEM_DEFAULT : 초기값 사용 (SUBNET)
$ sudo update-alternatives --config vim
There are 2 choices for the alternative vim (providing /usr/bin/vim).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/nvim 30 auto mode
* 1 /usr/bin/nvim 30 manual mode
2 /usr/bin/vim.basic 30 manual mode
Press <enter> to keep the current choice[*], or type selection number:
여기서 /user/bin/nvim을 선택하면, vim 입력시 nvim이 실행이 됨. 마찬가지로 vi에 대해서도 설정.
$ sudo update-alternatives --config vi
There are 2 choices for the alternative vi (providing /usr/bin/vi).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/nvim 30 auto mode
* 1 /usr/bin/nvim 30 manual mode
2 /usr/bin/vim.basic 30 manual mode
Press <enter> to keep the current choice[*], or type selection number:
현재 아이폰을 메인 회선으로 사용하고, 두 개의 아이패드를 데이터 함께쓰기로 사용하고 있습니다. 예전에는 아이패드를 변경하게 되면, 현재 꼽혀있는 유심을 뽑아서, 새로운 아이패드에 꼽으면 별다른 문제없이 사용할 수 있었는데, 올해 9월부터 약간의 정책이 바뀌었다고 합니다.
결론으론,
예전 아이패드에서 유심을 뽑기 전, 반드시 해당 기기의 전원을 정상적으로 종료해야 합니다. 전원이 정상적으로 종료된 이후에, 유심을 뽑아 새로운 기기에 꼽게 되면, 잠시 후 바로 통신이 가능하게 됩니다. 또 전원을 끈 이후 24시간이 지나면 안됩니다.
위 과정을 거치치 않으면, 해당 유심이 락이 걸려서 통신이 안되도록 한다고 합니다. 이때는 예전 기기에 다시 유심을 꼽고, 전원 종료를 해주시면 됩니다. 예전 기기가 없어진 상태거나, 사용하지 못하는 경우라면 어쩔수 없이 대리점에 방문해야 할 듯 하네요.
Xenomai는 기존 Linux 시스템의 커널과 병행하여 실행되며, Hard Realtime Task를 지원하는 소프트웨어 프레임웍입니다. 설치 방법도 간단하고, POSIX 인터페이스를 지원하여 개발도 쉽게 할 수 있습니다.
인터넷에서 Xenomai 설치 방법을 검색해보면, Xenomai2 버전과 예전 Linux 버전을 기준으로 설명해놓는 것들이 많고 (그만큼 인기가 없다는 얘기…) Xenomai3라고 해도 예전 iPipe를 사용하는 방법이 위주라서, 가장 최신 버전으로 Xenomai를 설치하는 방법을 정리해보았습니다.
물론 Xenoami도 Xenomai4 버전이 출시되어있긴 하지만, 아직까진 성능 검증 및 개발 방법에 대한 친절한 문서를 찾아보기가 힘들었습니다. 이 포스트는 Xenoami3, Ubuntu 22.04 버전을 기준으로 설명합니니다.
다음으로 작업할 임시 디렉토리를 하나 만들고, 그곳에 커널 및 Xenomai 라이브러리 소스를 받아옵니다.
$ mkdir ~/tmp
$ cd ~/tmp
$ wget https://source.denx.de/Xenomai/linux-dovetail/-/archive/v6.1.61-dovetail1/linux-dovetail-v6.1.61-dovetail1.tar.gz
$ wget https://source.denx.de/Xenomai/xenomai/-/archive/v3.2.4/xenomai-v3.2.4.tar.gz
$ tar zxf linux-dovetail-v6.1.61-dovetail1.tar.gz
$ tar zxf xenomai-v3.2.4.tar.gz
커널 버전은 자유롭게 선택이 가능합니다. 사용하는 디바이스 드라이버 및 소프트웨어 개발환경에 따라 적절히 선택해주면 됩니다. 저는 6.1.61 버전을 선택하였습니다. 이전에는 ipipe 패치를 해줘야 했지만, ipipe는 개발이 종료되었고, dovetail이 그 기능을 이어받아 개발 중입니다. 위 Repository에서는 dovetail이 패치된 커널 소스를 제공하고 있습니다. Xenomai 라이브러리는 가장 최신 버전인 3.2.4를 사용합니다.
Xenomai는 두 가지 모드로 실행이 가능한데, Cobalt는 기존 커널과 Xenomai 커널을 동시에 존재하고, 두 개의 커널 사이의 통신을 위해 dovetail을 이용합니다.
커널을 패치하기 위해 패치를 생성하고, 커널 소스에 적용해 줍니다.
$ cd ~/tmp/xenomai-v3.2.4/scripts
$ ./prepare-kernel.sh --linux=/home/robot/tmp/linux-dovetail-v6.1.61-dovetail1 --arch=x86_64 --outpatch=/home/robot/tmp/patch-cobalt-3.2.4.patch
$ cd ~/tmp/linux-dovetail-v6.1.61-dovetail1
$ patch -p1 < ../patch-cobalt-3.2.4.patch
이제 커널을 설정해줍니다. make menuconfig 를 이용하겠습니다. 현재 설치된 Ubuntu의 커널 설정을 복사하여 기본으로 사용합니다.
$ cd ~/tmp/linux-dovetail-v6.1.61-dovetail1
$ cp /boot/config-`uname -r` .config
$ make menuconfig
몇가지 필수 설정들이 필요하고, 그 외엔 사용하는 환경에 따라 커널 모듈 및 설정을 추가/삭제하면 됩니다.
General setup --->
Preemption Model (Preemptible Kernel --->
(X) Preemptible Kernel (Low-Latency Desktop)
Processor type and features --->
Processor family (Generic-x86-64) --->
(X) Core 2/newer Xeon
[*] Multi-core scheduler support
[ ] CPU core priorities scheduler support
Power management and ACPI options --->
CPU Frequency scaling --->
[ ] CPU Frequency scaling
[*] ACPI (Advanced Configuration and Power Interface) Support --->
< > Processor
CPU Idle --->
[ ] CPU idle PM support
Memory Management options --->
[ ] Transparent Hugepage Support
[ ] Allow for memory compaction
[ ] Page migration
[ ] Contiguous Memory Allocator
[*] Xenomai/cobalt (NEW) --->
Drivers --->
RTnet --->
<M> RTnet, TCP/IP socket interface
Drivers --->
Real-time IPC drivers --->
<M> RTIPC protocol family
[*] XDDP cross-domain datagram protocol (NEW)
[*] IDDP intra-domain datagram protocol (NEW)
(32) Number of IDDP communication ports (NEW)
[*] Buffer protocol (NEW)
(32) Number of BUFP communication ports (NEW)
저장하고, 다시 터미널로 돌아옵니다.
빌드하기 전에 시스템 키 설 정 및 디버깅코드 생성을 중지하도록 설정해줍니다. 시스템 키 설정은 따로 키를 생성하지 않는 한 에러가 발생하고, 디버깅 코드의 생성 중지는 빌드를 조금 더 빠르게 해줍니다.
xenomai.allowed_group=1001 % 생성한 그룹의 사용자들이 xenomai를 사용할 수 있도록 권한 부여
isolcpus=0,1 % CPU0, CPU1을 일반 커널에서 사용하지 못하도록 Isolation
xenomai.supported_cpus=0x3 % CPU0, CPU1을 Xenomai에서 사용하도록 설정
update-grub를 실행하여 변경된 옵션을 적용합니다.
$ sudo update-grub
$ sudo reboot
다음으로 XDDP (비실시간 커널과 실시간 커널과의 통신을 위한 IPC 방법 중 하나)를 사용하기 위해 퍼미션을 설정해줍니다. udev 룰을 이용하여 권한을 부여할 수 있습니다.
$ sudo vi /etc/udev/rules.d/99-xenomai.rules
KERNEL=="rtp[0-32]*", MODE="0666"
SUBSYSTEM=="rtdm", MODE="0666"
다음으로 XDDP 커널 모듈을 부팅 시에 자동으로 로딩하도록 설정합니다.
$ sudo vi /etc/modules
xeno_rtipc
이제 재부팅해줍니다. 재부팅시 설치된 실시간 커널 버전을 선택해줍니다.
커널 버전 확인
$ uname -a
Linux former-0030 6.1.61-xenomai #5 SMP PREEMPT_DYNAMIC IRQ_PIPELINE Fri Nov 17 16:46:35 KST 2023 x86_64 x86_64 x86_64 GNU/Linux
XDDP 커널 모듈 로딩 확인
$ lsmod | grep xeno
xeno_rtipc
Xenomai 라이브러리를 설치해줍니다. 먼저 빌드를 위한 패키지 필요 패키지를 설치합니다.
$ sudo apt install fuse
Xenomai 라이브러리를 빌드하고 설치합니다.
$ cd ~/tmp/xenomai-v3.2.4
$ ./scripts/bootstrap
$ ./configure --with-pic --with-core=cobalt --enable-smp --disable-tls --enable-dlopen-libs --disable-clock-monotonic-raw
$ make -j4
$ sudo make install