The root location is changed dynamically via 'switch_root'. This is prerequisite for more complex boot process.

This commit is contained in:
Ivan Davidov 2016-04-09 18:48:53 +03:00
parent 2a6f913801
commit a65281ac48

View File

@ -24,35 +24,77 @@ cd ../../rootfs
# Remove 'linuxrc' which is used when we boot in 'RAM disk' mode. # Remove 'linuxrc' which is used when we boot in 'RAM disk' mode.
rm -f linuxrc rm -f linuxrc
# Create root FS folders. # Create the missing root FS folders.
mkdir dev
mkdir etc mkdir etc
mkdir dev
mkdir lib mkdir lib
mkdir mnt
mkdir proc mkdir proc
mkdir root mkdir root
mkdir src mkdir src
mkdir sys mkdir sys
mkdir tmp mkdir tmp
# '1' means that only the owner of particular file/directory can remove it.
chmod 1777 tmp
cd etc cd etc
# The script '/etc/prepare.sh' is automatically executed as part of the '/init'
# process. We suppress most kernel messages and mount all crytical file systems.
cat > prepare.sh << EOF
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t tmpfs none /tmp -o mode=1777
mount -t sysfs none /sys
EOF
chmod +x prepare.sh
# The script '/etc/switch.sh' is automatically executed as part of the '/init'
# process. We copy all files/folders to new mountpoint and then execute the
# command 'switch_root'.
cat > switch.sh << EOF
#!/bin/sh
# Create the new mountpoint in RAM.
mount -t tmpfs none /mnt
# Create folders for all crytical file systems.
mkdir /mnt/dev
mkdir /mnt/sys
mkdir /mnt/proc
mkdir /mnt/tmp
# Move all crytical file systems in the new mountpoint.
mount --move /dev /mnt/dev
mount --move /sys /mnt/sys
mount --move /tmp /mnt/tmp
mount --move /proc /mnt/proc
# Copy all root folders in the new mountpoint.
cp -a bin etc lib lib64 root sbin src usr /mnt
# The new mountpoint becomes file system root. All original root folders are
# deleted automatically as part of the command execution. The '/sbin/init'
# process is invoked and it becomes the new PID 1 parent process.
exec switch_root /mnt/ /sbin/init
EOF
chmod +x switch.sh
# The script '/etc/bootscript.sh' is automatically executed as part of the # The script '/etc/bootscript.sh' is automatically executed as part of the
# 'init' proess. We suppress most kernel messages, mount all crytical file # '/sbin/init' proess. All core boot configuration has been completed and now we
# systems, loop through all available network devices and we configure them # need to do the rest of the configuration on the user space level. Here we loop
# through DHCP. # through all available network devices and we configure them through DHCP.
cat > bootscript.sh << EOF cat > bootscript.sh << EOF
#!/bin/sh #!/bin/sh
echo "Welcome to \"Minimal Linbux Live\" (/sbin/init)" echo "Welcome to \"Minimal Linbux Live\" (/sbin/init)"
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
for DEVICE in /sys/class/net/* ; do for DEVICE in /sys/class/net/* ; do
echo "Found network device \${DEVICE##*/}" echo "Found network device \${DEVICE##*/}"
ip link set \${DEVICE##*/} up ip link set \${DEVICE##*/} up
@ -123,14 +165,21 @@ EOF
cd .. cd ..
# The '/init' script passes the execution to '/sbin/init' which in turn looks # The '/init' script is the first place where we gain execution control after
# for the configuration file '/etc/inittab'. # the kernel has been loaded. This script prepares the core file systems, then
# creates new mountpoint in RAM which we use as new root location and finally
# the execution is passed to the script '/sbin/init' which in turn looks for
# the configuration file '/etc/inittab'.
cat > init << EOF cat > init << EOF
#!/bin/sh #!/bin/sh
echo "Welcome to \"Minimal Linbux Live\" (/init)" echo "Welcome to \"Minimal Linbux Live\" (/init)"
exec /sbin/init # Let's mount all core file systems.
/etc/prepare.sh
# Now let's create new mountpoint in RAM and make it our new root location.
exec /etc/switch.sh
EOF EOF