-
Notifications
You must be signed in to change notification settings - Fork 90
Install
To build oasis, you need a POSIX system with following tools:
- C toolchain for both host and target system
- target toolchain must support
#include_next
- target toolchain must support
- curl
- git
- gzip (or compatible tool)
- ninja
- rc (plan9-compatible)
- zic
On a Debian-based system, you'll need to install a few packages.
sudo apt install 9base bison curl git ninja-build pax
PATH=$PATH:/usr/lib/plan9/bin
You'll also need a toolchain targeting musl libc. I recommend musl-cross-make if you want to build your own. If not, feel free to use my pre-built toolchain.
git clone https://github.com/michaelforney/oasis-toolchain
PATH=$PATH:$PWD/oasis-toolchain/bin
You should make sure that your git config has a set user and email (for applying patches).
git config --global user.name $MYNAME
git config --global user.email $MYEMAIL
These instructions use some references to environment variables. You are meant to replace those with appropriate values for your system.
-
EDITOR: Your text editor. -
DRIVE: Your target disk device. -
ROOTPART: Your / partition device. -
BOOTPART: Your /boot partition device. -
TIMEZONE: Your timezone.
First, prepare a root directory for oasis. We'll call it $ROOT. You should
mount any sub-filesystems you want at this time (for example, /boot).
cd $ROOT
git clone -c 'core.sharedRepository=group' https://github.com/michaelforney/oasis src/oasis
cd src/oasis
Next, configure config.rc to your liking.
cp config.def.rc config.rc
$EDITOR config.rc
Generate the ninja build files.
rc ./setup.rc
Build oasis.
ninja commit
Prepare root repository.
cd $ROOT
git init --template src/oasis/template
git remote add local src/oasis/out/root.git
git fetch local
git checkout master
You may want to include a toolchain.
git remote add toolchain https://github.com/michaelforney/oasis-toolchain
git fetch toolchain --depth=1
git branch -t toolchain toolchain/master
git merge -Xours --allow-unrelated-histories toolchain
Prepare your /etc directory.
git clone --template src/oasis/template -c 'oasis.root=..' https://github.com/michaelforney/oasis-etc etc
curl -L https://github.com/michaelforney/oasis-etc/archive/master.tar.gz | zcat | pax -r -s ',^[^/]*,etc,'
./libexec/oasis/applyperms -d etc
rm etc/.perms
It is possible to maintain your /etc directory with git just as / (set
oasis.root=..), but this is not recommended since perp uses the VTX bit to
keep track of active services, and merge conflicts or permission errors could
have disastrous side-effects.
Set up your system configuration.
ln -s ../share/zoneinfo/$TIMEZONE etc/localtime
cat >>etc/fstab <<EOF
/dev/$ROOTPART / ext4 rw,relatime 0 1
/dev/$BOOTPART /boot ext2 rw,relatime,noauto 0 0
EOF
touch var/log/lastlog
The default root password is oasis. If you would like to choose something
else before booting into the system, you should chroot into new filesystem
and run passwd.
Build/obtain a kernel. By convention, install it at /boot/linux.
For a oasis-specific kernel build procedure, see Kernel.
Feel free to install any bootloader you want.
syslinux is one option that is easy and convenient. You'll need a 32-bit libc in
order to run the pre-built binaries. On Debian-based systems, this is in
libc6-i386.
sudo apt install libc6-i386
For a BIOS system:
cd /tmp
curl -O https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
zcat syslinux-6.03.tar.gz | pax -r
mkdir $ROOT/boot/syslinux
find syslinux-6.03/bios -name '*.c32' -exec cp {} $ROOT/boot/syslinux ';'
syslinux-6.03/bios/extlinux/extlinux --install $ROOT/boot/syslinux
dd if=syslinux-6.03/bios/mbr/mbr.bin of=/dev/$DRIVE bs=440
cat >$ROOT/boot/syslinux/syslinux.cfg <<EOF
PROMPT 1
TIMEOUT 50
DEFAULT oasis
LABEL oasis
LINUX ../linux
APPEND root=/dev/$ROOTPART init=/bin/sinit ro
EOF
If your system uses UEFI and you built your kernel with CONFIG_EFI_STUB=y, you
can use efibootmgr to set up a new boot entry.
efibootmgr -c -d /dev/$DRIVE -p $BOOTPARTNUM -l /linux -L oasis "root=/dev/$BOOTPART init=/bin/sinit ro"
You might also want to enable extra/efibootmgr in your config.rc.