commit 3dc49844d0f1cacf833a0a720b8443e7c025c9b7 Author: jonathan Date: Fri Oct 10 21:19:35 2025 +0200 initd version diff --git a/Config.in b/Config.in new file mode 100644 index 0000000..e69de29 diff --git a/board/qemu/x86_64/linux.config b/board/qemu/x86_64/linux.config new file mode 100644 index 0000000..4214b70 --- /dev/null +++ b/board/qemu/x86_64/linux.config @@ -0,0 +1,103 @@ +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +CONFIG_USER_NS=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_SMP=y +CONFIG_HYPERVISOR_GUEST=y +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_SPINLOCKS=y +# CONFIG_GCC_PLUGINS is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_RAW=y +CONFIG_BRIDGE=y +# CONFIG_WIRELESS is not set +CONFIG_PCI=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=1 +CONFIG_VIRTIO_BLK=y +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_SD=y +CONFIG_SCSI_VIRTIO=y +CONFIG_ATA=y +CONFIG_ATA_PIIX=y +CONFIG_NETDEVICES=y +CONFIG_VETH=y +CONFIG_VIRTIO_NET=y +CONFIG_NE2K_PCI=y +CONFIG_8139CP=y +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=y +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_VIRTIO_CONSOLE=y +CONFIG_HW_RANDOM_VIRTIO=m +CONFIG_DRM=y +CONFIG_DRM_QXL=y +CONFIG_DRM_VIRTIO_GPU=y +CONFIG_DRM_BOCHS=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_HDA_INTEL=y +CONFIG_SND_HDA_GENERIC=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_UHCI_HCD=y +CONFIG_USB_STORAGE=y +CONFIG_VIRTIO_PCI=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_INPUT=y +CONFIG_VIRTIO_MMIO=y +CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y +CONFIG_EXT4_FS=y +CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y +CONFIG_OVERLAY_FS_INDEX=y +CONFIG_OVERLAY_FS_XINO_AUTO=y +CONFIG_OVERLAY_FS_METACOPY=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_XATTR=y +CONFIG_CRYPTO_DEFLATE=y +CONFIG_UNWINDER_FRAME_POINTER=y + diff --git a/board/qemu/x86_64/post-build.sh b/board/qemu/x86_64/post-build.sh new file mode 100644 index 0000000..bf83a00 --- /dev/null +++ b/board/qemu/x86_64/post-build.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -u +set -e + +# Add a console on tty1 +if [ -e ${TARGET_DIR}/etc/inittab ]; then + grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \ + sed -i '/GENERIC_SERIAL/a\ +tty1::respawn:/sbin/getty -L tty1 0 vt100 # QEMU graphical window' ${TARGET_DIR}/etc/inittab +fi diff --git a/configs/nimux_x86_defconfig b/configs/nimux_x86_defconfig new file mode 100644 index 0000000..ea1d65e --- /dev/null +++ b/configs/nimux_x86_defconfig @@ -0,0 +1,73 @@ +BR2_x86_64=y +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_12=y +BR2_GLOBAL_PATCH_DIR="board/qemu/patches" +#BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_NIMUX_PATH)/patches" +BR2_RELRO_PARTIAL=y +BR2_FORTIFY_SOURCE_2=y +BR2_TARGET_GENERIC_HOSTNAME="nimux" +BR2_TARGET_GENERIC_ISSUE="Welcome to Nimux!" +BR2_TARGET_GENERIC_PASSWD_SHA512=y +BR2_TARGET_ROOTFS_CPIO=y +BR2_TARGET_ROOTFS_CPIO_GZIP=y +BR2_TARGET_ENABLE_ROOT_LOGIN=y +BR2_TARGET_GENERIC_ROOT_PASSWD="hellotux" +BR2_TARGET_ROOTFS_INITRAMFS=y +BR2_TARGET_ROOTFS_ISO9660=y +BR2_TARGET_ROOTFS_ISO9660_ISOLINUX=y +BR2_TARGET_SYSLINUX=y +BR2_TARGET_SYSLINUX_LEGACY_BIOS=y +BR2_TARGET_SYSLINUX_ISOLINUX=y +BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y +BR2_SYSTEM_BIN_SH_BASH=y +BR2_SYSTEM_BIN_SH="bash" +BR2_ENABLE_LOCALE_WHITELIST="C C.UTF-8 en_US en_US.UTF-8" +BR2_GENERATE_LOCALE="C en_US" +BR2_TARGET_TZ_INFO=y +BR2_TARGET_LOCALTIME="Europe/Amsterdam" +BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_NIMUX_PATH)/rootfs-overlay" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_VERSION=y +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.12.27" +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_NIMUX_PATH)/board/qemu/x86_64/linux.config" +#BR2_LINUX_KERNEL_XZ=y +#BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y +BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF=y +BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y +#BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL_NIMUX_PATH)/board/pc/busybox.config" +BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y +BR2_PACKAGE_SQUASHFS=y +BR2_PACKAGE_SQUASHFS_GZIP=y +BR2_PACKAGE_SSHFS=y +BR2_PACKAGE_ZFS=y +BR2_PACKAGE_ACPID=y +BR2_PACKAGE_EUDEV_RULES_GEN=y +BR2_PACKAGE_HDPARM=y +BR2_PACKAGE_HWDATA=y +BR2_PACKAGE_HWDATA_IAB_OUI_TXT=y +BR2_PACKAGE_CA_CERTIFICATES=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBCURL_CURL=y +BR2_PACKAGE_LIBCAP=y +BR2_PACKAGE_BRIDGE_UTILS=y +BR2_PACKAGE_IFTOP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NANO=y +BR2_PACKAGE_NANO_TINY=n +BR2_PACKAGE_BASH=y +BR2_PACKAGE_BASH_COMPLETION=y +BR2_PACKAGE_INOTIFY_TOOLS=y +BR2_PACKAGE_SUDO=y +BR2_PACKAGE_CPULOAD=y +BR2_PACKAGE_DOCKER_CLI=y +BR2_PACKAGE_DOCKER_COMPOSE=y +BR2_PACKAGE_DOCKER_ENGINE=y +BR2_DOWNLOAD_FORCE_CHECK_HASHES=y +BR2_SYSTEM_DHCP="eth0" +BR2_ROOTFS_POST_BUILD_SCRIPT="board/qemu/x86_64/post-build.sh" +#BR2_ROOTFS_POST_IMAGE_SCRIPT="board/qemu/post-image.sh" +BR2_ROOTFS_POST_SCRIPT_ARGS="$(BR2_DEFCONFIG)" +# BR2_TARGET_ROOTFS_EXT2=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_PACKAGE_HOST_QEMU=y +BR2_PACKAGE_HOST_QEMU_SYSTEM_MODE=y diff --git a/external.desc b/external.desc new file mode 100644 index 0000000..52fca4b --- /dev/null +++ b/external.desc @@ -0,0 +1,2 @@ +name: NIMUX +desc: The custom buildroot overlay for nimux diff --git a/external.mk b/external.mk new file mode 100644 index 0000000..e31b10e --- /dev/null +++ b/external.mk @@ -0,0 +1 @@ +include $(sort $(wildcard $(BR2_EXTERNAL_NIMUX_PATH)/package/*/*.mk)) diff --git a/rootfs-overlay/etc/fstab b/rootfs-overlay/etc/fstab new file mode 100644 index 0000000..25ccc7c --- /dev/null +++ b/rootfs-overlay/etc/fstab @@ -0,0 +1,10 @@ +# +proc /proc proc defaults,nosuid,nodev,noexec 0 0 +devpts /dev/pts devpts defaults,nosuid,noexec,gid=5,mode=620,ptmxmode=000 0 0 +tmpfs /dev/shm tmpfs nosuid,nodev,mode=0777 0 0 +tmpfs /tmp tmpfs nosuid,nodev,mode=1777 0 0 +tmpfs /run tmpfs nosuid,nodev,mode=0755 0 0 +tmpfs /mnt tmpfs nosuid,nodev,mode=0755 0 0 +tmpfs /var/log tmpfs nosuid,nodev,mode=0775 0 0 +sysfs /sys sysfs defaults,nosuid,nodev,noexec 0 0 +cgroup2 /sys/fs/cgroup cgroup2 defaults,nosuid,nodev,noexec 0 0 diff --git a/rootfs-overlay/etc/inittab b/rootfs-overlay/etc/inittab new file mode 100644 index 0000000..b452259 --- /dev/null +++ b/rootfs-overlay/etc/inittab @@ -0,0 +1,62 @@ +# /etc/inittab +# +# Copyright +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. + +# Format for each entry: ::: +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + + +# Startup the system. + +::sysinit:/bin/mount /proc # Lightwhale requires the pseudo file systems for setup-persistence... +::sysinit:/bin/mount /sys # ...and since the rootfs is already mounted in RAM at this point... +::sysinit:/bin/mount /run # ...we have /etc/fstab present which is used for mount options... +::sysinit:/bin/mount /tmp # ...so we are mounting them as intended. +::sysinit:/bin/mount /mnt # +::sysinit:/bin/mount /var/log +::sysinit:/bin/mount -t cgroup2 none /sys/fs/cgroup + +::sysinit:/bin/mkdir -p /dev/pts /dev/shm /run/lock /run/db # Subdirs in pseudo file system required by init scripts. + +#::sysinit:/lib/lightwhale/rescue-shell +#::sysinit:/lib/lightwhale/setup-persistence + +# create a read-only mapping of the rootfs +::sysinit:mkdir -p /mnt/root.squashfs +::sysinit:mount --bind / /mnt/root.squashfs +::sysinit:mount --make-rprivate /mnt/root.squashfs/ + +# create overlay +::sysinit:/usr/sbin/zpool import nimux-zfs +::sysinit:/bin/mount -t overlay overlay-etc -o lowerdir=/mnt/root.squashfs/etc/,upperdir=/mnt/overlays/root/etc/upper,workdir=/mnt/overlays/root/etc/work /etc +::sysinit:/bin/mount -t overlay overlay-home -o lowerdir=/mnt/root.squashfs/home/,upperdir=/mnt/overlays/root/home/upper,workdir=/mnt/overlays/root/home/work /home + +null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd +null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin +null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout +null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr + +::sysinit:/bin/mount -a +#::sysinit:/sbin/swapon -a +::sysinit:/bin/hostname -F /etc/hostname # Because a custom hostname may have been mounted at this point. + +# Now run all the lovely rc scripts. +::sysinit:/etc/init.d/rcS + +# Put a getty on the serial port. +tty1::respawn:/sbin/getty -L tty1 0 vt100 # First console +tty2::respawn:/sbin/getty -L tty2 0 vt100 # Extra console, for good measure. +console::respawn:/sbin/getty -L console 0 vt100 # Serial console, for headless QEMU. + +# Stuff to do before rebooting. +::shutdown:/etc/init.d/rcK +#::shutdown:/sbin/swapoff -a +::shutdown:/bin/umount -a -r diff --git a/rootfs-overlay/etc/modules-load.d/zfs.conf b/rootfs-overlay/etc/modules-load.d/zfs.conf new file mode 100644 index 0000000..73304bc --- /dev/null +++ b/rootfs-overlay/etc/modules-load.d/zfs.conf @@ -0,0 +1 @@ +zfs diff --git a/rootfs-overlay/etc/profile.d/editor.sh b/rootfs-overlay/etc/profile.d/editor.sh new file mode 100644 index 0000000..54dddfa --- /dev/null +++ b/rootfs-overlay/etc/profile.d/editor.sh @@ -0,0 +1,2 @@ +# change the default editor to nano +export EDITOR='/bin/nano' diff --git a/rootfs-overlay/etc/profile.d/prompt.sh b/rootfs-overlay/etc/profile.d/prompt.sh new file mode 100644 index 0000000..45fe095 --- /dev/null +++ b/rootfs-overlay/etc/profile.d/prompt.sh @@ -0,0 +1,8 @@ +# overrule the default prompt to make it more usefull +if [ "$PS1" ]; then + if [ "`id -u`" -eq 0 ]; then + export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]# " + else + export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ " + fi +fi