Skip to main content

Command Palette

Search for a command to run...

Making an http server very close to computer

Not an os just an iso file that will connect to wifi and start an http server

Updated
9 min read
Making an http server very close to computer

As i was developing on Macbook the linux library is not automatically present here so what i did instead i make an ubuntu docker container and then got inside that container and then installed the necessary things

Provisioning a docker container and connecting to it

docker pull ubuntu
docker run --platform linux/amd64 --privileged -it --rm -v ~/Downloads/linux:/workspace/ ubuntu

Here I also made a linux directory on my downloads folder and linked it to my /workspace inside the ubuntu docker container so anything in workspace goes automatically to my ~/Downloads/linux folder. As we will later boot on my old laptop which is x86_64 architechture the --platform flag ensures the build is for that architechture.

Setting up docker environment

Download all the necessary dependencies to build linux kernel

apt update
apt install -y bzip2 git vim make gcc libncurses-dev flex bison bc cpio libelf-dev libssl-dev xz-utils

While selecting timezone dont select indian first select first Asian then Kolkata, I dont really know why its like that but that like it is.

Cloning Linux repository

After that inside my docker i go to my workspace and cloned linux repo

cd linux 
make menuconfig

This already include the wifi drivers vga support and everything needed for development after development try to turn off some features which is unnecessarily included.

building it (the cpu heavy part)

make -j$(nproc)

use this to build the kernel

Some of the images of cpu consumption you can skip these i am adding it for fun.

cpu consumption

The build was taking too much time so i went to build the absolute minimum wireless support + vga support

wireless stack

Networking support ---> Wireless ---> cfg80211 cfg80211 wireless extensions compatibility

Intel wifi

Device Drivers ---> Network device support ---> Wireless LAN ---> Intel devices ---> Intel Wireless WiFi Next Gen AGN

Firmware loader

Device Drivers ---> Generic Driver Options ---> Firmware loader

Networking

Networking support ---> Networking options ---> TCP/IP networking

Cryptographic apis for WPA/WPA2 PSK

AES CCM GCM SHA1 SHA256 HMAC CMAC

Enable this for debugging

Device Drivers -> Character devices -> Serial drivers -> 8250/16550 ... (set to *, not M)

For getting the kernel panic message when no initramfs is there.

Later you should enable this also so that we can mirror the vga output to the serial console

 Symbol: SERIAL_8250 [=y]                                                                                               │
  │ Type  : tristate                                                                                                       │
  │ Defined at drivers/tty/serial/8250/Kconfig:7                                                                           │
  │   Prompt: 8250/16550 and compatible serial support                                                                     │
  │   Depends on: TTY [=y] && HAS_IOMEM [=y] && !S390                                                                      │
  │   Location:                                                                                                            │
  │     -> Device Drivers                                                                                                  │
  │       -> Character devices                                                                                             │
  │         -> Enable TTY (TTY [=y])                                                                                       │
  │           -> Serial drivers                                                                                            │
  │ (1)         -> 8250/16550 and compatible serial support (SERIAL_8250 [=y])                                             │
  │ Selects: SERIAL_CORE [=n] && SERIAL_MCTRL_GPIO [=n]

Enable initramfs for initial ram filesystem

General setup --> Initial RAM filesystem and RAM disk (initramfs/initrd) support

Enable Executable file formats

[*] Kernel support for ELF binaries                                                          │ │
  │ │                       [*] Kernel support for scripts starting with #!                                              │ │
  │ │                       [*] Kernel support for MISC binaries                                                         │ │
  │ │                       [ ] Enable core dump support

Then start building using

make -j$(nproc)

After that you will get a kernel image at arch/x86/boot/bzImage

you can launch it via qemu-system-x86_64 using

qemu-system-x86_64 \
    -kernel arch/x86/boot/bzImage \
    -append "console=ttyS0" \
    -nographic

This will start a linux kernel which will panic at last because there is no init file there

My log is embedded here

https://gist.github.com/lsnnt/3b46d1b6fb79ae4444a1179d3d2bdc05

Building initramfs

After we have built the kernel we should build the initramfs which is the first file system which is like You can give Linux a specific compressed archive containing some files, and it will load it into RAM, and use it as its initial root file system

For the init filesystem we are using busybox and also we need the init file that will be entrypoint of out linux system

Building busybox

clone busybox repository

git clone --depth 1 https://github.com/vda-linux/busybox_mirror
cd busybox_mirror/
make menuconfig

in menuconfig disable tc

sed -i 's/CONFIG_TC=y/# CONFIG_TC is not set/' .config

make the binary

make -j8

After compilation we do need the initramfs so make a bootf directory in the workspace and will start working in it

mkdir -p /workspace/bootf/initramfs

We need that initramfs for later on developing the files that will be there at the boot time

After building busybox we need to install it inside the initramfs directory

make CONFIG_PREFIX=/workspace/bootf/initramfs install

This will make the initial ram filesystem for the linux kernel

also we will make the /init file which will be loading at the startup so make an init file and write this inside initramfs folder

#!/bin/sh

mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev

echo ""
echo "================================="
echo "      Ghost Linux Booted"
echo "================================="
echo ""

exec /bin/sh

This file is very basic it will mount the required folders for the linux and starts a filesystem. Also we need to build it as an archive we will use cpio here because its an older archive format and linux kernel supports it inside initramfs do this

find . | cpio -H newc -o | gzip -9 > ../initramfs.cpio.gz

then we already have the bzImage and initramfs.cpio.gz we can now make the .iso file or we can just boot it with qemu

booting it

qemu-system-x86_64 \                                         
  -kernel bzImage \
  -initrd initramfs.cpio.gz \
  -append "console=ttyS0" \
  -nographic

This starts a busybox shell on top of linux system which is mainly for testing and will be removed when i find out how to access internet here

For the iso building we will be using grub bootloader grub expects the file format as follows

root@183ae334d9f9:/workspace/bootf# tree iso
iso
`-- boot
    |-- bzImage
    |-- grub
    |   `-- grub.cfg
    `-- initramfs.cpio.gz

3 directories, 3 files

just copy the bzImage and initramfs.cpio.gz into the iso/boot folder and inside iso/boot/grub/grub.cfg make this file for giving grub what to boot

set timeout=3
set default=0

insmod all_video

menuentry "Ghost Linux Test" {
    search --file --set=root /boot/bzImage
    linux /boot/bzImage console=tty0
    initrd /boot/initramfs.cpio.gz
}

here insmod all_video does the kernel module insertion for video drivers

making the iso file is easy now

just this command

 grub-mkrescue -o test.iso iso

Alas! I dont have the USB drive.

I got it now

So i managed to get the usb drive and after formatting it via balena etcher with my custom made iso file i will try to boot it on my old (10 years old :-) ) laptop.

moment of truth

Booting on my old laptop (moment of truth)

Add internet to it

For internet i have to do many changes in linux kernel config and also add iwlwifi driver module firmware say whatever

changed the init script all the workspace will be shared so lookup that for all the files

each and everything is changed after adding internet to it better use my shared workspace and take help

Just give me ISO file i will run it myself

here is the public url of the iso file : here

This is not a distributable version and only contains kernels and firmwares according to my laptop wifi card and other specification

Now i want your workspace each and every file that you used to generate the iso file

download it here : zip (1.57GB compressed) (3 GB uncompressed)

explaining the project directory

.
├── bootf (contains initramfs and iso)
│   ├── initramfs
│   └── iso 
├── busybox_mirror
│   ├── applets
│   ├── applets_sh
│   ├── arch
│   ├── archival
│   ├── configs
│   ├── console-tools
│   ├── coreutils
│   ├── debianutils
│   ├── docs
│   ├── e2fsprogs
│   ├── editors
│   ├── examples
│   ├── findutils
│   ├── include
│   ├── init
│   ├── klibc-utils
│   ├── libbb
│   ├── libpwdgrp
│   ├── loginutils
│   ├── mailutils
│   ├── miscutils
│   ├── modutils
│   ├── networking
│   ├── printutils
│   ├── procps
│   ├── qemu_multiarch_testing
│   ├── runit
│   ├── scripts
│   ├── selinux
│   ├── shell
│   ├── sysklogd
│   ├── testsuite
│   └── util-linux
├── firmwares
│   └── linux-firmware
├── httpserver
│   ├── src
│   └── target
├── iw
│   └── iw-6.7
├── libnl-3.9.0
│   ├── build-aux
│   ├── etc
│   ├── include
│   ├── lib
│   ├── m4
│   ├── man
│   ├── python
│   ├── src
│   └── tests
└── linux
    ├── arch
    ├── block
    ├── certs
    ├── crypto
    ├── Documentation
    ├── drivers
    ├── fs
    ├── include
    ├── init
    ├── io_uring
    ├── ipc
    ├── kernel
    ├── lib
    ├── LICENSES
    ├── mm
    ├── net
    ├── rust
    ├── samples
    ├── scripts
    ├── security
    ├── sound
    ├── tools
    ├── usr
    └── virt

Expanding iso

iso
└── boot
    ├── bzImage
    ├── grub
    │   └── grub.cfg
    └── initramfs.cpio.gz

Busybox_mirror is used to compile it statically and include it inside the initramfs

firmware directory contains linux firmwares such as firmware and driver code to connect via intel chip wifi

initramfs contains the directories as follows

initramfs
├── bin
├── dev
├── etc
├── lib
│   ├── firmware
│   └── modules
│       └── 7.1.0+
├── proc
├── run
├── sbin
├── sys
├── usr
│   ├── bin
│   ├── sbin
│   └── share
│       └── udhcpc
└── www

The index.html in www will be loaded

Youtube video demonstration (moment of truth)

https://youtu.be/7sAwB5_MRzM

At last keep your curiosity high and bye :-)

Signing off,

Nityanand Thakur

Email : tnityanand523@gmail.com