Automatically convert a FreeBSD system to use pkgbase.
This project is sponsored by the FreeBSD Foundation.
Both the pkgbasify tool and pkgbase itself are experimental. Running pkgbasify may result in irreversible data loss and/or a system that fails to boot. It is highly recommended to make backups before running this tool.
That said, I am not aware of any bugs in pkgbasify and have done my best to make it as robust as possible. I currently believe pkgbasify to be as reliable as manual conversion if not better.
If you find a bug in pkgbasify please open an issue!
Download the script, give it permission to execute, run it as root:
fetch https://github.com/FreeBSDFoundation/pkgbasify/raw/refs/heads/main/pkgbasify.lua
chmod +x ./pkgbasify.lua
./pkgbasify.lua
If conversion succeeds:
- restart the system.
pkgbasify performs the following steps:
- Make a copy of the etcupdate(8) current database (
/var/db/etcupdate/current
). This makes it possible for pkgbasify to merge config files after converting the system. - Select a repository based on the output of freebsd-version(1) and create
/usr/local/etc/pkg/repos/FreeBSD-base.conf
. - Select packages that correspond to the currently installed base system components.
- For example: if the lib32 component is not already installed, pkgbasify will skip installation of lib32 packages.
- Prompt the user to create a "pre-pkgbasify" boot environment using bectl(8) if possible.
- Install the selected packages with pkg(8),
overwriting base system files and creating
.pkgsave
files as per standard pkg(8) behavior. - Run a three-way-merge between the
.pkgsave
files (ours), the new files installed by pkg (theirs), and the old files in the copy of the etcupdate database.- If there are merge conflicts, an error is logged and manual intervention may be required.
.pkgsave
files without a corresponding entry in the old etcupdate database are skipped.
- If sshd(8) is running, restart the service.
- Run pwd_mkdb(8) and cap_mkdb(1).
- Remove
/boot/kernel/linker.hints
.