mirror of
https://github.com/MichielDerhaeg/build-linux.git
synced 2025-09-03 05:02:36 +02:00
almost done with init
This commit is contained in:
73
README.md
73
README.md
@@ -200,7 +200,7 @@ $ mkdir -p usr/{sbin,bin} bin sbin boot
|
|||||||
```
|
```
|
||||||
And while we're at it, we can create the rest of the file system hierarchy. This
|
And while we're at it, we can create the rest of the file system hierarchy. This
|
||||||
is actually standardized and applications often assume this is the way you're
|
is actually standardized and applications often assume this is the way you're
|
||||||
doing it, but you can often do what you want. You can find more info in this
|
doing it, but you can often do what you want. You can find more info
|
||||||
[here](http://www.pathname.com/fhs/).
|
[here](http://www.pathname.com/fhs/).
|
||||||
```bash
|
```bash
|
||||||
$ mkdir -p {dev,etc,home,lib}
|
$ mkdir -p {dev,etc,home,lib}
|
||||||
@@ -228,6 +228,16 @@ done
|
|||||||
These symlinks might be incorrect from outside the system because of the
|
These symlinks might be incorrect from outside the system because of the
|
||||||
absolute path, but they work just fine from within the booted system.
|
absolute path, but they work just fine from within the booted system.
|
||||||
|
|
||||||
|
Lastly, we'll copy some files from ``../filesystem`` to the image that will be
|
||||||
|
some use to us later.
|
||||||
|
|
||||||
|
* ``passwd`` that contains information about users
|
||||||
|
|
||||||
|
* ``shadow`` that contains the hashed passwords of the users. It is best to
|
||||||
|
``chmod 600`` the file so normal users can't read it.
|
||||||
|
|
||||||
|
* ``fstab`` where
|
||||||
|
|
||||||
The Boot Loader
|
The Boot Loader
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
@@ -336,6 +346,7 @@ This implies that PID 1 has a special role to fill in our operating system.
|
|||||||
Namely that of starting everything, keeping everything running, and shutting
|
Namely that of starting everything, keeping everything running, and shutting
|
||||||
everything down because it's the first and last process to live.
|
everything down because it's the first and last process to live.
|
||||||
|
|
||||||
|
% TODO better init intro
|
||||||
This also makes this ``init`` process very suitable to start and manage services
|
This also makes this ``init`` process very suitable to start and manage services
|
||||||
as is the case with the very common ``sysvinit`` and the more modern
|
as is the case with the very common ``sysvinit`` and the more modern
|
||||||
``systemd``. But this isn't strictly necessary and some other process can cary
|
``systemd``. But this isn't strictly necessary and some other process can cary
|
||||||
@@ -352,8 +363,15 @@ $ mount -t proc proc /proc
|
|||||||
$ mount / -o remount,rw
|
$ mount / -o remount,rw
|
||||||
```
|
```
|
||||||
|
|
||||||
So first things first, we'll create a script
|
``busybox`` provides only two ways of editing files: ``vi`` and ``ed``. If you
|
||||||
Don't forget to ``chmod +x`` this file when you're creating it.
|
are not confortable using either of those you could always shutdown the VM,
|
||||||
|
mount the image again, and use your favorite text editor on your host machine.
|
||||||
|
% TODO keymap
|
||||||
|
|
||||||
|
First, we'll create a script that handles the initialisation of the system
|
||||||
|
itself like mounting filesystems and configuring devices, etc. I called it
|
||||||
|
``startup`` and put it in the ``/etc/init.d`` directory (create this first).
|
||||||
|
Don't forget to ``chmod +x`` this file when you're done.
|
||||||
```bash
|
```bash
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# /etc/init.d/startup
|
# /etc/init.d/startup
|
||||||
@@ -372,6 +390,9 @@ mount -t devpts devpts /dev/pts -o mode=0620,gid=5,nosuid,noexec
|
|||||||
# they don't need to be stored on the disk, we'll store them in RAM
|
# they don't need to be stored on the disk, we'll store them in RAM
|
||||||
mount -t tmpfs run /run -o mode=0755,nosuid,nodev
|
mount -t tmpfs run /run -o mode=0755,nosuid,nodev
|
||||||
mount -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev
|
mount -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev
|
||||||
|
# the nosuid,noexec,nodev options are for security reasons and are not
|
||||||
|
# strictly necessary, you can read about them in the 'mount'
|
||||||
|
# man page
|
||||||
|
|
||||||
# the kernel does not read /etc/hostname on it's own
|
# the kernel does not read /etc/hostname on it's own
|
||||||
# you need to write it in /proc/sys/kernel/hostname to set it
|
# you need to write it in /proc/sys/kernel/hostname to set it
|
||||||
@@ -379,7 +400,10 @@ if [[ -f /etc/hostname ]]; then
|
|||||||
cat /etc/hostname > /proc/sys/kernel/hostname
|
cat /etc/hostname > /proc/sys/kernel/hostname
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# populate /dev with devices by analyzing /sys
|
# mdev is a mini-udev implementation that
|
||||||
|
# populates /dev with devices by scanning /sys
|
||||||
|
# see the util-linux/mdev.c file in the busybox source
|
||||||
|
# for more information
|
||||||
mdev -s
|
mdev -s
|
||||||
echo /sbin/mdev > /proc/sys/kernel/hotplug
|
echo /sbin/mdev > /proc/sys/kernel/hotplug
|
||||||
|
|
||||||
@@ -395,10 +419,49 @@ mount -o remount,rw /
|
|||||||
# end of /etc/init.d/startup
|
# end of /etc/init.d/startup
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The next file is the init configuration ``/etc/inittab``. The syntax of this
|
||||||
|
file is very similar to that of ``sysvinit``'s ``inittab`` but has several
|
||||||
|
differences. For more information you can look at the ``examples/inittab`` file
|
||||||
|
in the busybox source.
|
||||||
```inittab
|
```inittab
|
||||||
# /etc/inittab
|
# /etc/inittab
|
||||||
|
::sysinit:/bin/echo STARTING SYSTEM
|
||||||
::sysinit:/etc/init.d/startup
|
::sysinit:/etc/init.d/startup
|
||||||
::askfirst:-/bin/sh
|
tty1::respawn:/sbin/getty 38400 tty1
|
||||||
|
tty2::respawn:/sbin/getty 38400 tty2
|
||||||
|
tty3::respawn:/sbin/getty 38400 tty3
|
||||||
::ctrlaltdel:/bin/umount -a -r
|
::ctrlaltdel:/bin/umount -a -r
|
||||||
|
::shutdown:/bin/echo SHUTTING DOWN
|
||||||
::shutdown:/bin/umount -a -r
|
::shutdown:/bin/umount -a -r
|
||||||
|
# end of /etc/inittab
|
||||||
```
|
```
|
||||||
|
The ``sysinit`` entry is the first command ``init`` will execute. We'll put our
|
||||||
|
``startup`` script here. You can specify multiple entries of this kind and they
|
||||||
|
will be executed sequentially. The same goes for the ``shutdown`` entry, which
|
||||||
|
will obviously be executed at shutdown. The ``respawn`` entries will be executed
|
||||||
|
after ``sysinit`` and will be restarted when they exit. We'll put some
|
||||||
|
``getty``'s on the specified tty's. These will ask for your username and execute
|
||||||
|
``/bin/login`` which will ask for your password and stars a shell for you when
|
||||||
|
it's correct. If you don't care for user login and passwords, you could instead
|
||||||
|
of the ``getty``'s do ``::askfirst:-/bin/sh``. ``askfirst`` does the same as
|
||||||
|
``respawn`` but asks you to press enter first. No tty is specified so it will
|
||||||
|
figure out what the console is. And the ``-`` infront of ``-/bin/sh`` means that
|
||||||
|
the shell is started as a login shell. ``/bin/login`` usually does this for us
|
||||||
|
but we have to specify it here. Starting the shell as a login shell means that
|
||||||
|
it configures certain things it otherwise assumes already to be configured.
|
||||||
|
|
||||||
|
We can you start our system with ``init``. You can remove the ``init=/bin/sh``
|
||||||
|
entry in ``/boot/grub/grub.cfg`` because it defaults to ``/sbin/init``. And if
|
||||||
|
you reboot the system you should see a login screen. Instead of rebooting, you
|
||||||
|
could also do
|
||||||
|
```bash
|
||||||
|
$ exec init
|
||||||
|
```
|
||||||
|
Because the shell we are currently using is PID 1 and you could just replace the
|
||||||
|
shell process with ``init``
|
||||||
|
|
||||||
|
The root password should be empty so it should only ask for a username.
|
||||||
|
|
||||||
|
Service Supervision
|
||||||
|
-------------------
|
||||||
|
% TODO
|
||||||
|
Reference in New Issue
Block a user