The root location is changed dynamically via 'switch_root'. This is prerequisite for more complex boot process.
This commit is contained in:
parent
2a6f913801
commit
a65281ac48
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user