이번에는 ROS에서 snap을 공부하고, 사용하는 법에 대해서 익혀보자.
참고한 링크는 다음과 같다.
https://wiki.ros.org/ROS/Tutorials/Packaging%20your%20ROS%20project%20as%20a%20snap
💡 snap이란?
snap은 소프트웨어 패키지를 배포하고, 설치할 수 있는 패키징 형식이다. snap 패키지는 독립적으로 실행이 가능하며, 필요한 모든 종속성(의존성)이 함께 제공된다는 장점을 가지고 있다. 이를 통해 다양한 리눅스 배포판에서 소프트웨어를 손쉽게 설치하고 사용할 수 있다.
snap을 사용하는 장점을 정리하면 다음과 같다.
$ sudo apt install snapcraft
위 명령어를 통해서 snap 패키지를 만들기 위한 snapcraft라는 프로그램을 설치할 수 있다.
그리고, snap을 만들기 위해선 프로젝트 디렉토리 내에 snap 폴더를 만들고 그 안에 snapcraft.yaml라는 파일을 생성해야 한다. 이 파일은 snap 패키지의 메타데이터와 빌드 지침을 정의하는데 사용된다.
예를 들면 다음과 같다.
$ cd roscpp_tutorials
$ mkdir ~/roscpp_tutorials_snap
$ cd ~/roscpp_tutorials_snap
$ snapcraft init
이 명령어들을 통해서 yaml 파일을 생성할 수 있다.
snapcraft.yaml 파일을 연 이후에 다음 내용을 작성하자.
name: ros-talker-listener
version: '0.1'
summary: ROS Talker/Listener Example
description: |
This example launches a ROS talker and listener.
confinement: devmode
base: core20
parts:
ros-tutorials:
plugin: catkin
source: https://github.com/ros/ros_tutorials.git
source-branch: noetic-devel
source-subdir: roscpp_tutorials
stage-packages:
- ros-noetic-roslaunch
apps:
ros-talker-listener:
command: opt/ros/noetic/bin/roslaunch roscpp_tutorials talker_listener.launch
extensions: [ros1-noetic]
각 부분에 대한 설명은 다음과 같다.
snap 패키지가 시스템 리소스에 접근할 수 있는 범위를 정의하며, 보안과 밀접하게 연관이 된다. 옵션들은 다음과 같다.
1) devmode : 개발 모드로, 아무런 제약없이 실행이 가능하다. 다만, 보안이 보장되지 않는다.
2) strict : 기본 제약 모드로, 제한된 리소스만 접근 가능하다. 높은 보안성을 가지고 있기에 권한이 없는 경우 특정 시스템 리소스에 접근할 수 없다.
3) classic : 일부 제약만 적용되며, devmode와 strict의 중간 정도의 제약만 적용된다.
snap 패키지를 구성하는 빌드 블록이다. 패키지의 빌드, 설치, 실행에 필요한 구성 요소들을 정의하는 섹션으로, 특정 소스코드 혹은 리소를 가져와 빌드하고, 패키지의 최종 이미지에 포함될 파일들을 생성한다.
1) plugin : snap에서 사용하는 플러그인들을 정의한다.
2) source : 빌드할 소스 코드의 위치를 지정한다.
3) source-branch : 소스 코드를 가져올 브랜치를 지정한다.
4) source-subdir : 소스 코드에서 빌드할 서브 디렉토리를 지정한다.
5) stage-packags : 빌드 및 실행에 필요한 추가 패키지들을 지정한다.
snap 패키지가 제공하는 실행 가능한 프로그램을 정의한다.
1) command : 해당 프로그램(어플)이 실행될 때 호출되는 명령어를 정의한다.
2) extensions : snap에서 사용할 확장을 지정한다.
$ cd ~/roscpp_tutorials_snap
$ snapcraft --enable-experimental-extensions
위 명령어를 통해서 snap을 빌드할 수 있다.
빌드가 완료되면 .snap 패키지가 생성된다.
이후에는 다음과 같이 설치할 수 있다.
$ sudo snap install <my_snap_pkg_name>.snap --dangerous
그리고 실행은 다음 명령어를 통해서 사용한다.
$ <my_sanp_pkg_name>.<node_in_snap_pkg>