aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rwxr-xr-xlib/init/rc.boot172
-rwxr-xr-xlib/init/rc.shutdown48
2 files changed, 220 insertions, 0 deletions
diff --git a/lib/init/rc.boot b/lib/init/rc.boot
new file mode 100755
index 0000000..5489b9e
--- /dev/null
+++ b/lib/init/rc.boot
@@ -0,0 +1,172 @@
+#!/bin/sh
+
+log() { printf '\033[1;36m=>\033[m\033[1m %s\n' "$@" ;}
+
+welcome() { printf '\033[1;36m=>\033[m\033[1m Welcome to\033[35m Carbs Linux\033[m\033[1m!\n' ;}
+
+error() { printf '\033[1m\033[31m=> ERROR: %s\033[m\n' "$@" ;}
+
+mnt() {
+ mountpoint -q "$1" || {
+ dir=$1
+ shift
+ mount "$@" "$dir"
+ }
+}
+
+emergency_shell() {
+ error \
+ "Cannot continue init due to errors above, starting emergency shell" \
+ "When ready, type 'exit' to continue the boot."
+
+ /bin/sh -l
+}
+
+main() {
+ PATH=/usr/bin:/usr/sbin
+ old_ifs=$IFS
+ set -f
+
+ welcome
+
+ log "Mounting pseudo filesystems..."; {
+ mnt /proc -o nosuid,noexec,nodev -t proc proc
+ mnt /sys -o nosuid,noexec,nodev -t sysfs sys
+ mnt /run -o mode=0755,nosuid,nodev -t tmpfs run
+ mnt /dev -o mode=0755,nosuid -t devtmpfs dev
+
+ mkdir -pm 0755 /run/runit \
+ /run/lvm \
+ /run/user \
+ /run/lock \
+ /run/log \
+ /dev/pts \
+ /dev/shm
+
+ mnt /dev/pts -o mode=0620,gid=5,nosuid,noexec -nt devpts devpts
+ mnt /dev/shm -o mode=1777,nosuid,nodev -nt tmpfs shm
+ }
+
+ log "Starting eudev..."; {
+ command -v udevd >/dev/null && {
+ udevd --daemon
+ udevadm trigger --action=add --type=subsystems
+ udevadm trigger --action=add --type=devices
+ udevadm settle
+ }
+ }
+
+ log "Remounting rootfs as ro..."; {
+ mount -o remount,ro / || emergency_shell
+ }
+
+ log "Activating encrypted devices (if any exist)..."; {
+ [ -e /etc/crypttab ] && [ -x /bin/cryptsetup ] && {
+ exec 3<&0
+
+ while read -r name dev pass opts err; do
+ [ "${name##\#*}" ] || continue
+
+ # Break on invalid crypttab.
+ [ "$err" ] && {
+ printf 'error: A valid crypttab has only 4 columns.\n'
+ break
+ }
+
+ # Turn 'UUID=*' lines into device names.
+ [ "${dev##UUID*}" ] || dev=$(blkid -l -o device -t "$dev")
+
+ # Parse options by turning list into a pseudo array.
+ IFS=,
+ set -- $opts
+ IFS=$old_ifs
+
+ copts="cryptsetup luksOpen"
+
+ # Create an argument list (no other way to do this in sh).
+ for opt; do case $opt in
+ discard) copts="$copts --allow-discards" ;;
+ readonly|read-only) copts="$copts -r" ;;
+ tries=*) copts="$copts -T ${opt##*=}" ;;
+ esac; done
+
+ # If password is 'none', '-' or empty ask for it.
+ case $pass in
+ none|-|"") $copts "$dev" "$name" <&3 ;;
+ *) $copts -d "$pass" "$dev" "$name" ;;
+ esac
+ done < /etc/crypttab
+
+ exec 3>&-
+
+ [ "$copts" ] && [ -x /bin/vgchance ] && {
+ log "Activating LVM devices for dm-crypt..."
+ vgchange --sysinit -a y || emergency_shell
+ }
+ }
+ }
+
+ log "Checking filesystems..."; {
+ fsck -ATat noopts=_netdev
+ [ $? -gt 1 ] && emergency_shell
+ }
+
+ log "Mounting rootfs rw..."; {
+ mount -o remount,rw / || emergency_shell
+ }
+
+ log "Mounting all local filesystems..."; {
+ mount -at nosysfs,nonfs,nonfs4,nosmbfs,nocifs -O no_netdev ||
+ emergency_shell
+ }
+
+ log "Enabling swap..."; {
+ swapon -a || emergency_shell
+ }
+
+ log "Seeding random..."; {
+ if [ -f /var/random.seed ]; then
+ cat /var/random.seed > /dev/urandom
+ else
+ log "This may hang."
+ log "Mash the keyboard to generate entropy..."
+
+ dd count=1 bs=512 if=/dev/random of=/var/random.seed
+ fi
+ }
+
+ log "Setting up loopback..."; {
+ ip link set up dev lo
+ }
+
+ log "Setting hostname..."; {
+ read -r hostname < /etc/hostname
+ printf '%s\n' "${hostname:-carbs-linux}" > /proc/sys/kernel/hostname
+ } 2>/dev/null
+
+ log "Loading sysctl settings..."; {
+ find /run/sysctl.d \
+ /etc/sysctl.d \
+ /usr/local/lib/sysctl.d \
+ /usr/lib/sysctl.d \
+ /lib/sysctl.d \
+ /etc/sysctl.conf \
+ -name \*.conf -type f 2>/dev/null \
+ | while read -r conf; do
+ seen="$seen ${conf##*/}"
+
+ case $seen in
+ *" ${conf##*/} "*) ;;
+ *) printf '%s\n' "* Applying $conf ..."
+ sysctl -p "$conf" ;;
+ esac
+ done
+ }
+
+ command -v udevd >/dev/null &&
+ udevadm control --exit
+
+ log "Boot stage complete..."
+}
+
+main
diff --git a/lib/init/rc.shutdown b/lib/init/rc.shutdown
new file mode 100755
index 0000000..9dba627
--- /dev/null
+++ b/lib/init/rc.shutdown
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+log() { printf '\033[36;1m=>\033[m\033[1m %s\n' "$@" ;}
+
+main() {
+ PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+ log "Waiting for services to stop..."; {
+ sv -w196 force-stop /var/service/*
+ sv exit /var/service/*
+ }
+
+ log "Saving random seed..."; {
+ dd count=1 bs=512 if=/dev/random of=/var/random.seed
+ }
+
+ halt -w
+
+ log "Sending TERM signal to all processes..."; {
+ killall5 -TERM
+ sleep 1
+ }
+
+ log "Sending KILL signal to all processes..."; {
+ killall5 -KILL
+ }
+
+ log "Unmounting filesystems and disabling swap..." \
+ "Remounting rootfs as readonly"; {
+ swapoff -a
+ umount -rat nosysfs,noproc,nodevtmpfs,notmpfs
+ mount -o remount,ro /
+
+ sync
+ }
+
+ log "Deactivating dmcrypt devices (if any exist)."; {
+ [ -x /bin/cryptsetup ] && [ -x /bin/dmsetup ] && {
+ dmsetup ls --target crypt \
+ --exec "dmsetup info -c --noheadings -o open,name" |
+ while read -r drive; do
+ [ "${drive%%:*}" = "0" ] && cryptsetup close "${drive##*:}"
+ done
+ }
+ }
+}
+
+main