목차

  1. 리모트 저장소 초기화
  2. 리모트 저장소 내용 추가
  3. 로컬 저장소 초기화
  4. 로컬 저장소 활용하기

리모트 저장소 초기화


우선 등장하는 디렉토리부터 정리하자.
참고로 /var/www/html 디렉토리는 아파치에서 사용하는 static webserver의 root 디렉토리이다.
  • /home/kkangeva/example/rootfs : 가상의 rootfs
  • /var/www/html/server : libostree 리모트 저장소
  • /home/kkangeva/example/local : libostree 로컬 저장소
우선 리모트 저장소를 만들어보자. 저장소는 default로 bare 모드로 생성된다.
이 모드에서는 저장되는 파일이 실제 파일이다. 그래서 Hard Link를 사용할 수 있는 모드이다.


archive 모드는 서버에서 사용하는 모드다.

이 모드에서는 파일들이 gzip으로 압축이된다. 따라서 Hard Link로 사용할 수 없다.

$ ostree init --repo=/var/www/html/server --mode=archive


이제 첫 번째 커밋을 만들어보자. 그 전에 rootfs가 있어야 한다.

이 부분은 환경이나 제품에 특화되었기 때문에 가정을 할 수 없다.

참고로 libostree에서는 tarball을 지원한다고 한다. 해당 tarball은 Yocto 프로젝트 기반에서 사용할 수 있다.


여기서는 이미 생성된 rootfs가 있다고 가정하겠다. 일단 커밋을 해보자.

최초에 commit의 시간이 어마어마하게 걸린다. 나의 경우에는 2분이상이 걸렸다.

$ ostree commit --repo=/var/www/html/server -s '1st' -b 'example' --tree=dir=/home/kkangeva/example/rootfs

4f95069d97bd9a5cc4443215ff65c95f810f8dfb82d1c9e13d7eb4c5ef577943


리모트 저장소 내용 추가


이제 생성된 리모트 저장소에 파일을 추가해보자. 파일하나를 추가했음에도 2분이상이 걸린다.
그 이유는 archive 모드에서는 libostree가 각 파일에 대해서 '압축해제-체크섬-비교-재압축' 과정을 각 파일들에 대해서 수행하기 때문이다.
$ echo "2nd" >> /home/kkangeva/example/rootfs/2nd.txt
ostree commit --repo=/var/www/html/server -s '2nd' -b 'example' --tree=dir=/home/kkangeva/example/rootfs

리모트 저장소의 히스토리를 확인해보자.
$ ostree ls --repo=/var/www/html/server 'example'
d00755 1000 1000      0 /
-00664 1000 1000      4 /2nd.txt
d00755 1000 1000      0 /bin
d00755 1000 1000      0 /etc
d00755 1000 1000      0 /lib
d00755 1000 1000      0 /pkgdata
d00755 1000 1000      0 /sysroot-providers
d00755 1000 1000      0 /usr
d00755 1000 1000      0 /var
$ ostree cat --repo=/var/www/html/server 'example' /2nd.txt
2nd
$ ostree log --repo=/var/www/html/server 'example'
commit a957c7bf3b1bcfddcd98b417823c62e096268a2356337e7190210a444225bbd2
ContentChecksum:  548d51741a76edc951d6e0e049613fc2605aef839834555297a9f3a783e88a4d
Date:  2019-01-31 02:38:47 +0000

    2nd

commit 4f95069d97bd9a5cc4443215ff65c95f810f8dfb82d1c9e13d7eb4c5ef577943
ContentChecksum:  e3793b09d37ec99526678a7f64cb6eca1daf53dd3f227c52a2a1570f2c1f591a
Date:  2019-01-31 02:35:15 +0000

    1st


브라우저로 접속해보면 아래와 같이 접속이 되는 것을 확인할 수 있다.



로컬 저장소 초기화


우선 로컬 저장소를 만들자.
$ mkdir /home/kkangeva/example/local
$ ostree init --repo=/home/kkangeva/example/local

이제 로컬 저장소와 리모트 저장소를 연결해야 한다. 이때 사용되는 명령어는 remote이다.
참고로 http와 file 스키마 모두를 지원한다. 아래에 보면 두 스키마를 이용해 remote를 등록하는 것을 볼 수 있다.
그런데 GPG verification이 enable되어 있는데 관련 signature를 찾을 수 없다는 에러가 나온다.
$ ostree remote --repo=/home/kkangeva/example/local add http http://localhost/server
$ ostree remote --repo=/home/kkangeva/example/local add file file:///var/www/html/server
$ ostree remote --repo=/home/kkangeva/example/local list
file
http
$ ostree pull --repo=/home/kkangeva/example/local http example
error: Commit a957c7bf3b1bcfddcd98b417823c62e096268a2356337e7190210a444225bbd2: GPG verification enabled, but no signatures found (use gpg-verify=false in remote config to disable)

libostree는 GPG 방식으로 이미지 검증을 하는데 일단은 이를 disable 하자. local에서 아래 명령을 수행하면 된다.
그러면 저장소 안에 config 파일에 해당 저장소의 gpg-verify 옵션이 false가 된다.
$ ostree config --repo=/home/kkangeva/example/local set 'remote "http"'.gpg-verify false
$ cat /home/kkangeva/example/local/config 
[core]
repo_version=1
mode=bare

[remote "http"]
url=http://localhost/server
gpg-verify=false

다시 리모트 서버로부터 pull을 해보자. log로 확인해보니 최신 버전을 받아온 것을 확인할 수 있다.
$ ostree pull --repo=/home/kkangeva/example/local http example
Receiving objects: 44% (43347/96581) 43.4 MB/s 260.2 MB                                                 
Receiving objects: 51% (49419/96581) 42.5 MB/s 297.8 MB                                                 
Receiving objects: 75% (73329/96581) 45.2 MB/s 497.3 MB                                                 
8649 metadata, 87932 content objects fetched; 634368 KiB transferred in 19 seconds
$ ostree log --repo=/home/kkangeva/example/local example
commit a957c7bf3b1bcfddcd98b417823c62e096268a2356337e7190210a444225bbd2
ContentChecksum:  548d51741a76edc951d6e0e049613fc2605aef839834555297a9f3a783e88a4d
Date:  2019-01-31 02:38:47 +0000

    2nd

<< History beyond this commit not fetched >>

2nd 이전의 정보는 어떻게 해야 가져올 수 있을까? 이를 위한 추가 옵션은 depth이다.
depth는 디폴트로 0이 지정되고 -1을 지정하면 모든 히스토리를 가져온다.
$ ostree pull --repo=/home/kkangeva/example/local http example --depth=1
4 metadata, 0 content objects fetched; 650 B transferred in 0 seconds
$ ostree log --repo=/home/kkangeva/example/local example
commit a957c7bf3b1bcfddcd98b417823c62e096268a2356337e7190210a444225bbd2
ContentChecksum:  548d51741a76edc951d6e0e049613fc2605aef839834555297a9f3a783e88a4d
Date:  2019-01-31 02:38:47 +0000

    2nd

commit 4f95069d97bd9a5cc4443215ff65c95f810f8dfb82d1c9e13d7eb4c5ef577943
ContentChecksum:  e3793b09d37ec99526678a7f64cb6eca1daf53dd3f227c52a2a1570f2c1f591a
Date:  2019-01-31 02:35:15 +0000

    1st

로컬 저장소 활용하기


로컬 저장소가 준비가 되었으니 이를 활용해보자. 이전 포스팅(링크)에서 확인했듯이 저장소 자체로는 사용할 수 없다. 사용하기 위해서는 저장소의 내용을 checkout해와야 한다. 일단 rootfs 두개를 checkout 해보자.
rootfs가 2.2GB인데 반해 실제 용량은 40MB 정도씩 증가하는 것을 볼 수 있다. Hard Link의 위력이다.

$ df --block-size=M

/dev/nvme0n1p2   467923M 250029M   194057M  57% /

$ ostree checkout --repo=/home/kkangeva/example/local example 2nd

$ df --block-size=M

/dev/nvme0n1p2   467923M 250069M   194017M  57% /

$ ostree checkout --repo=/home/kkangeva/example/local example^ 1st
$ df --block-size=M
/dev/nvme0n1p2   467923M 250109M   193977M  57% /


당연히 checkout 받아온 내용은 서로 다르다.

$ ls 1st/

bin  etc  lib  pkgdata  sysroot-providers  usr  var

$ ls 2nd/

2nd.txt  bin  etc  lib  pkgdata  sysroot-providers  usr  var

$ cat 2nd/2nd.txt 

2nd


+ Recent posts