freebsd-rustdate

freebsd-rustdate라는 프로젝트를 최근에 보게 되었습니다. 기존의 freebsd-update(8)을 rust로 재구현한 프로젝트라고 하는데, 기존 도구와 호환성도 있고 기존의 FreeBSD 업데이트 서버를 이용하고 있다고 하여 큰 주의사항 없이 시도해 볼 수 있겠다는 생각이 들었습니다. 이번에는 개인 서버를 업그레이드하는데 사용해 보았습니다.

결론적으로는 문제없이 잘 동작하였습니다. 기존에 설치되어 있던 FreeBSD 14.1-RELEASE 은 소스에서 빌드한 것이라 업데이트가 가능할지 궁금하였는데 아마 업그레이드라서 그랬는지는 모르겠지만 기존 바이너리는 그대로 덮어 쓰는 것으로 보입니다.

이 도구는 pkg 에서 구할 수 있으므로, 홈페이지에 나와 있는 것 처럼 소스에서 설치해도 되지만 그대로 pkg 를 이용하면 됩니다.

# pkg install freebsd-rustdate

이 글을 쓰는 시점에서의 최신 버전은 1.0.1 이었습니다.

% pkg info freebsd-rustdate
freebsd-rustdate-1.0.1_2
Name           : freebsd-rustdate
Version        : 1.0.1_2
Installed on   : Sun Dec  8 13:41:49 2024 UTC
Origin         : sysutils/freebsd-rustdate
Architecture   : FreeBSD:14:amd64
Prefix         : /usr/local
Categories     : sysutils
Licenses       : BSD2CLAUSE
Maintainer     : [email protected]
WWW            : https://rustdate.over-yonder.net/
Comment        : Faster freebsd-update replacement

FreeBSD 14.1-RELEASE 에서 14.2-RELEASE로 업그레이드

현재 버전을 확인해 봅니다.

% freebsd-version -ku
14.1-RELEASE
14.1-RELEASE

이제 FreeBSD 14.2 로 업그레이드를 시작해 봅니다.

# sudo freebsd-rustdate upgrade -r 14.2-RELEASE
Currently running 14.1-RELEASE.
Loading info for 14.1-RELEASE.
Trying server update2.freebsd.org....   OK.
Loading metadata index for 14.1-RELEASE...   OK.
Getting metadata files for 14.1-RELEASE...  2 missing.
...

기존 서버가 GENERIC커널을 그대로 쓰지 않고 다른 커널 설정을 사용하고 있었는데, 업그레이드하면서 덮어 쓰겠다는 의미입니다. 제 경우는 덮어 써도 문제가 없어서 그대로 두었는데 커널을 다시 빌드하지 않으면 부팅이 안되거나 하는 경우라면 주의해야 합니다.

    WARNING  --  WARNING  --  WARNING
This system is running a *** kernel, which is not
a distributed kernel config.  As part of upgrading, this
kernel will be replaced with a GENERIC kernel.
    WARNING  --  WARNING  --  WARNING

나머지 과정이 진행 됩니다.

...
Trying to merge 4 files.
4 files merged cleanly.
Run `freebsd-rustdate show-merges` to review.

Upgrade will remove 9 files, add 56 files, and update 6838 files.
Run `freebsd-rustdate show-merges` to review merge results.
Run `freebsd-rustdate show-install` to see details of what will be installed.

Run `freebsd-rustdate install` to upgrade from 14.1-RELEASE to 14.2-RELEASE.

업데이트할 파일을 받아서 설치하고, /etc 아래 설정 파일을 자동으로 병합해 줍니다. 이번 경우에는 자동으로 처리 되었는데 필요하면 수동으로 병합해 주어야 할 수 있습니다. 직접 보지는 못했는데 아마 기존 etcmerge 랑 비슷할 거라 봅니다.

show-merges 해도 잘 병합 된 것을 (다른 점이 없음) 알 수 있습니다.

# freebsd-rustdate show-merges
Pending upgrade from 14.1-RELEASE to 14.2-RELEASE.
4 merged files

diff /etc/group
--- /etc/group  (original)
+++ /etc/group  (modified)

diff /etc/master.passwd
--- /etc/master.passwd  (original)
+++ /etc/master.passwd  (modified)

diff /etc/shells
--- /etc/shells  (original)
+++ /etc/shells  (modified)

diff /etc/sysctl.conf
--- /etc/sysctl.conf  (original)
+++ /etc/sysctl.conf  (modified)

이제 freebsd-rustdate install을 실행해서 커널을 설치 합니다.

# freebsd-rustdate install
Installing pending upgrade from 14.1-RELEASE to 14.2-RELEASE
Checking required files are present...   10848 hashfiles...  Ok.

...

Kernel updates have been installed.  Please reboot and run
`freebsd-rustdate install` again to finish installing updates.
Note: you may need to update your UEFI bootblocks.

커널이 설치 되었으므로 리부팅합니다.

# reboot

재부팅이 안되면 콘솔로 접속해서 어떤 문제인지 살펴 보기 바랍니다. 필요하면 이전 버전 커널로 다시 부팅해야 합니다. 제 경우에는 문제없이 ssh 연결이 다시 가능 했습니다.

% freebsd-version -ku
14.2-RELEASE
14.1-RELEASE

커널만 14.2-RELEASE 인 것을 알 수 있습니다. 이제 나머지 부분을 계속해서 설치 합니다.

# freebsd-rustdate install
Installing pending upgrade from 14.2-RELEASE to 14.2-RELEASE
Checking required files are present...   10848 hashfiles...  Ok.
Creating snapshot of existing boot environment: (14.2-RELEASE_2024-12-08_132128)...  Done.
...
Installing world...
...
Rebuilding passwd db...  Done.
Rebuilding login.conf db...  Done.
Rebuilding manpage indices...  /usr/share/man /usr/share/openssl/man Done.

World update installed.
Deleting 9 paths...   Done.

Upgrade complete.

마지막 문장이 출력되면 잘 된 것입니다. 버전을 다시 확인해 봅니다.

% freebsd-version -ku
14.2-RELEASE
14.2-RELEASE

이걸로 업그레이드는 완료 하였습니다만, 한번 더 리부팅하는 편이 깔끔하게 시작할 수 있으니 리부팅을 한번 더 해 줍니다.

# reboot

다시 돌아 오면 다른 문제가 없는지 확인 합니다.

패키지 재설치

기존에 설치된 패키지를 업그레이드 합니다. 깔끔하게 하려면 업그레이드할 필요 없는 동일한 버전이라도 다시 덮어 쓰도록 -f 옵션을 주어서 업그레이드합니다.

# pkg-static upgrade -f
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking for upgrades (268 candidates): 100%
Processing candidates (268 candidates): 100%
The following 238 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	brotli: 1.1.0,1
	p5-Class-Inspector: 1.36
	p5-File-ShareDir: 1.118

Installed packages to be UPGRADED:
	abseil: 20230125.3 -> 20240722.0
	apr: 1.7.3.1.6.3_1 -> 1.7.5.1.6.3_3
	bash: 5.2.26_1 -> 5.2.37
	boehm-gc: 8.2.6 -> 8.2.8
...

이제 완료입니다! pkg 로 설치한 것 중 부팅할 때 실행되는 것들이 있다면 (네트워크 서비스 등) 깔끔하게 다시한번 리부팅하는 것도 좋겠습니다.

끝으로

freebsd-rustdate 가 생각보다 깔끔하게 실행되어서 놀랐는데, 다음에는 일반 업데이트를 한번 시도해 볼 생각인데 기대가 크네요. 아직 rust 기반 시스템 유틸리티는 없는 것으로 아는데, FreeBSD 기반 시스템에 도입 논의가 있는 것으로 보이니 향후가 기대 됩니다.