diff options
author | Cem Keylan <cem@ckyln.com> | 2019-12-09 11:15:26 +0300 |
---|---|---|
committer | Cem Keylan <cem@ckyln.com> | 2019-12-09 11:15:26 +0300 |
commit | 2a31f7cdd33726deacc97c373d44a1a6bc8d994d (patch) | |
tree | fccabc2b72fe6522679b4196eb89fa1ade626630 | |
download | init-0.1.tar.gz |
initial commit0.1
-rw-r--r-- | LICENSE | 21 | ||||
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | etc/inittab | 11 | ||||
-rwxr-xr-x | lib/init/rc.boot | 172 | ||||
-rwxr-xr-x | lib/init/rc.shutdown | 48 |
5 files changed, 254 insertions, 0 deletions
@@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Cem Keylan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. @@ -0,0 +1,2 @@ +carbs init scripts +================== diff --git a/etc/inittab b/etc/inittab new file mode 100644 index 0000000..2cd998c --- /dev/null +++ b/etc/inittab @@ -0,0 +1,11 @@ +::sysinit:/lib/init/rc.boot +::restart:/sbin/init +::shutdown:/lib/init/rc.shutdown +::respawn:runsvdir -P /var/service 'log: ................................................................................................................................................................................................................................................................' + +tty1::respawn:/sbin/getty 38400 tty1 +tty2::respawn:/sbin/getty 38400 tty2 +tty3::respawn:/sbin/getty 38400 tty3 +tty4::respawn:/sbin/getty 38400 tty4 +tty5::respawn:/sbin/getty 38400 tty5 +tty6::respawn:/sbin/getty 38400 tty6 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 |