slitaz-modular annotate initramfs/linuxrc @ rev 147

initramfs: Add makegraphs script.
author Christopher Rogers <slaxemulator@gmail.com>
date Wed Nov 16 16:17:22 2011 +0000 (2011-11-16)
parents a885658a2485
children a260a9380e9d
rev   line source
slaxemulator@0 1 #!/bin/ash
slaxemulator@0 2 # Initial script for Linux Live operating system
slaxemulator@0 3 # Author: Tomas M <http://www.linux-live.org/>
slaxemulator@0 4
slaxemulator@0 5 export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
slaxemulator@0 6
slaxemulator@0 7 mount -n -t proc proc /proc
slaxemulator@0 8 mount -n -t sysfs sysfs /sys
slaxemulator@0 9 #mount -n -o remount,rw / # for the case we forgot rw boot option
slaxemulator@0 10 ln -sf /proc/mounts /etc/mtab # this allows us to use umount -a
slaxemulator@0 11
slaxemulator@0 12 . /liblinuxlive # it requires proc to be mounted
slaxemulator@0 13
slaxemulator@0 14 # Don't print kernel messages to konsole now.
slaxemulator@0 15 # Syslog will reset printk settings, no need to remember it here anymore.
slaxemulator@0 16 echo "0" >/proc/sys/kernel/printk
slaxemulator@0 17
slaxemulator@0 18 # Load essential drivers, like CDROM drivers, aufs/squashfs etc,
slaxemulator@0 19 # use mdev to create /dev/ devices and setup it as a hotplug-handler
slaxemulator@0 20 modprobe_essential_modules
slaxemulator@0 21
slaxemulator@0 22 # /usr and some drivers are compressed in initrd
slaxemulator@0 23 # so it must be mounted from .lzm files
slaxemulator@0 24 #mount_initrd_loops
slaxemulator@0 25
slaxemulator@0 26 # start hotplugging before hw drivers load
slaxemulator@0 27 #mdev_start_hotplug
slaxemulator@0 28
slaxemulator@0 29 # Then load drivers for data storage and input devices
slaxemulator@0 30 modprobe_usb_modules
slaxemulator@0 31 modprobe_pcmcia_modules
slaxemulator@0 32
slaxemulator@0 33 debug_shell
slaxemulator@0 34
slaxemulator@0 35 # make sure ext3 partitions are not mounted using ext2 driver,
slaxemulator@0 36 # and vfat partitions are not mounted using msdos driver
slaxemulator@0 37 echo -e "ext4\next3\next2\nvfat\n*" >/etc/filesystems
slaxemulator@0 38
slaxemulator@0 39 mkdir -p $UNION
slaxemulator@0 40 mkdir -p $MEMORY
slaxemulator@0 41
slaxemulator@0 42 debug_shell
slaxemulator@0 43
slaxemulator@0 44 # Find livecd data directory by searching for livecd.sgn file
slaxemulator@0 45 SGN=$(cmdline_value sgnfile)
slaxemulator@0 46 if [ "$SGN" = "" ]; then SGN=livecd.sgn; fi
slaxemulator@0 47 echolog "looking for '$LIVECDNAME' data directory (searching for $SGN file)"
slaxemulator@0 48
slaxemulator@0 49 # First, try from= boot argument, if given
slaxemulator@0 50 DATAFROM=$(cmdline_value from)
slaxemulator@0 51
slaxemulator@0 52 # Boot directly from iso
slaxemulator@0 53 FINDISOVAR=$(cmdline_value findiso)
slaxemulator@0 54
slaxemulator@0 55 # If ip= parameter is present, assume we're booted over PXE
slaxemulator@0 56 # In that case, we have to initialize network very soon (now)
slaxemulator@0 57 # ip=<client-ip>:<boot-server-ip>:<gw-ip>:<netmask>
slaxemulator@0 58 # Nevertheless, from= parameter won't be overwritten by this
slaxemulator@0 59 IP=$(cmdline_value ip)
slaxemulator@0 60 if [ "$IP" != "" -a "$DATAFROM" = "" ]; then
slaxemulator@0 61 DATAFROM="http://"$(echo $IP | cut -d : -f 2)
slaxemulator@0 62 fi
slaxemulator@0 63
slaxemulator@0 64 if [ "$FINDISOVAR" != "" -a "$DATAFROM" = "" ]; then
slaxemulator@0 65 FINDISO=$(find_in_computer $FINDISOVAR)
slaxemulator@0 66 DATAFROM="$FINDISO"
slaxemulator@0 67 echolog "$FINDISO found."
slaxemulator@0 68 fi
slaxemulator@0 69
slaxemulator@0 70 if [ "$DATAFROM" ]; then
slaxemulator@0 71 if [ "$(echo $DATAFROM | cut -b 1-7 | tr "[:upper:]" "[:lower:]")" = "http://" ]; then
slaxemulator@0 72 init_dhcp $(modprobe_network_modules)
slaxemulator@0 73 mount_httpfs $DATAFROM $MOUNTDIR/httpfs
slaxemulator@0 74 # if mountdir/httpfs/livecdname is found, set DATA=, else umount httpfs
slaxemulator@0 75 # - currently this part works even without the above mentioned, but livecd.sgn is required now untill it's uncommented
slaxemulator@0 76 elif [ "$FINDISO" ]; then
slaxemulator@0 77 mount_device $DATAFROM $FINDISOMNT
slaxemulator@0 78 echolog "$FINDISO mounted."
slaxemulator@0 79 else
slaxemulator@0 80 DATAFROM=$(find_in_computer $DATAFROM)
slaxemulator@0 81 if [ "$DATAFROM" ]; then
slaxemulator@0 82 mount_device $DATAFROM $LOOPMOUNT # mount again, it may be loop device
slaxemulator@0 83 if [ $? -eq 0 -a "$(find_modules $LOOPMOUNT/$LIVECDNAME)" != "" ]; then
slaxemulator@0 84 echolog "found in $DATAFROM"
slaxemulator@0 85 DATA=$LOOPMOUNT/$LIVECDNAME
slaxemulator@0 86 else
slaxemulator@0 87 fumount $LOOPMOUNT
slaxemulator@0 88 fumount $MOUNTDIR/*
slaxemulator@0 89 fi
slaxemulator@0 90 fi
slaxemulator@0 91 fi
slaxemulator@0 92 fi
slaxemulator@0 93
slaxemulator@0 94 if [ "$DATA" = "" ]; then
slaxemulator@0 95 # from= is not used or it didn't contain valid data
slaxemulator@0 96 DATA=$(find_in_computer $LIVECDNAME/$SGN)
slaxemulator@0 97 DATA=$(dirname $DATA 2>/dev/null)
slaxemulator@0 98 fi
slaxemulator@0 99
slaxemulator@0 100 if [ "$DATA" = "" ]; then fatal \
slaxemulator@0 101 "$LIVECDNAME data not found.
slaxemulator@0 102 You are maybe using an unsupported boot device (eg. SCSI or old PCMCIA).
slaxemulator@0 103 Workaround: Copy the directory $LIVECDNAME from your boot device to an IDE/SATA
slaxemulator@0 104 disk, eg. to /mnt/hda1/$LIVECDNAME or C:\\$LIVECDNAME. Then try to boot again."
slaxemulator@0 105 fi
slaxemulator@0 106
slaxemulator@0 107 echolog "Using $LIVECDNAME data from $DATA"
slaxemulator@0 108
slaxemulator@0 109 debug_shell
slaxemulator@0 110
slaxemulator@0 111 echolog "Setting up directory for changes ..."
slaxemulator@0 112 CHANGESVAL=$(cmdline_value changes)
slaxemulator@0 113
slaxemulator@0 114 if [ "$CHANGESVAL" ]; then
slaxemulator@0 115 CHANGESMNT=$(find_in_computer $CHANGESVAL)
slaxemulator@0 116 echolog $CHANGESMNT
slaxemulator@0 117 fi
slaxemulator@0 118
slaxemulator@0 119 debug_shell
slaxemulator@0 120
slaxemulator@0 121 mount_device "$CHANGESMNT" $MEMORY # removes $MEMORY if CHANGESMNT is wrong
slaxemulator@0 122
slaxemulator@0 123 # test if the filesystem is writable so changes can be stored to it
slaxemulator@0 124 touch $MEMORY/empty 2>/dev/null && \
slaxemulator@0 125 rm -f $MEMORY/empty 2>/dev/null
slaxemulator@0 126
slaxemulator@0 127 # if changes can't be mounted or the filesystem is not writable,
slaxemulator@0 128 # fallback to the default: tmpfs
slaxemulator@0 129 if [ $? -ne 0 ]; then
slaxemulator@0 130 echolog "Changes not used or not writable, using memory only"
slaxemulator@0 131 fumount $MEMORY
slaxemulator@0 132 mkdir -p $MEMORY # mount_device might removed it
slaxemulator@0 133
slaxemulator@0 134 RAMSIZE=$(cmdline_value ramsize)
slaxemulator@0 135 if [ "$RAMSIZE" = "" ]; then RAMSIZE="60%"; fi
slaxemulator@0 136 mount -t tmpfs -o "size=$RAMSIZE" tmpfs $MEMORY
slaxemulator@0 137 XINO=$MEMORY
slaxemulator@0 138 else
slaxemulator@0 139 # So it is writable, we will keep the filesystem mounted.
slaxemulator@0 140 # Check if it supports links and chmod.
slaxemulator@0 141 # If not, overmount CHANGES using posixovl
slaxemulator@0 142 echolog "Testing the filesystem for posix compatibility ..."
slaxemulator@0 143 touch $MEMORY/.empty1 && \
slaxemulator@0 144 ln -sf $MEMORY/.empty1 $MEMORY/.empty2 2>/dev/null && \
slaxemulator@0 145 chmod +x $MEMORY/.empty1 2>/dev/null && \
slaxemulator@0 146 test -x $MEMORY/.empty1 && \
slaxemulator@0 147 chmod -x $MEMORY/.empty1 2>/dev/null && \
slaxemulator@0 148 test ! -x $MEMORY/.empty1 && \
slaxemulator@0 149 rm $MEMORY/.empty1 $MEMORY/.empty2 2>/dev/null
slaxemulator@0 150
slaxemulator@0 151 if [ $? -ne 0 ]; then
slaxemulator@0 152 echolog "Not compatible - starting posixovl"
slaxemulator@0 153 rm $MEMORY/.empty1 $MEMORY/.empty2 2>/dev/null
slaxemulator@0 154 mkdir -p $CHANGES
slaxemulator@0 155 posixovl -F $CHANGES -- -o attr_timeout=300,entry_timeout=300,negative_timeout=300,kernel_cache,allow_other
slaxemulator@0 156 find $CHANGES >/dev/null 2>&1 # cache everything now
slaxemulator@0 157 fi
slaxemulator@0 158 fi
slaxemulator@0 159
slaxemulator@0 160 # $UNION will be used as a root directory, livecd modules will be added soon
slaxemulator@0 161 echolog "Setup union directory (using aufs)"
slaxemulator@0 162
slaxemulator@0 163 mkdir -p $CHANGES
slaxemulator@0 164 mkdir -p $IMAGES
slaxemulator@0 165 mount -n -t tmpfs tmpfs $IMAGES
slaxemulator@0 166
slaxemulator@0 167 debug_shell
slaxemulator@0 168
slaxemulator@0 169 # store the xino file in memory in all cases, it's faster and safer
slaxemulator@0 170 if [ "$XINO" != "$MEMORY" ]; then
slaxemulator@0 171 mkdir -p $XINO
slaxemulator@0 172 mount -n -t tmpfs tmpfs $XINO
slaxemulator@0 173 fi
slaxemulator@0 174
slaxemulator@0 175 # mount aufs using the writable branch as the first one (leftmost/topmost)
slaxemulator@0 176 mount -t aufs -o nowarn_perm,xino=$XINO/.aufs.xino,br:$CHANGES=rw aufs $UNION
slaxemulator@0 177 if [ $? -ne 0 ]; then dmesg | tail -n 1; fatal "can't setup union (aufs)"; fi
slaxemulator@0 178
slaxemulator@0 179 debug_shell
slaxemulator@0 180
slaxemulator@13 181 # setup initramfs if it exist
slaxemulator@22 182 if [ -d /initramfs ]; then
slaxemulator@13 183 echolog "Setup initramfs for first module..."
slaxemulator@22 184 mount -n -o remount,add:1:/initramfs=ro aufs $UNION
slaxemulator@13 185 fi
slaxemulator@13 186
slaxemulator@13 187 debug_shell
slaxemulator@13 188
slaxemulator@0 189 # If toram or copy2ram boot parameter is present, copy all fs modules to RAM.
slaxemulator@0 190 # (skip modules from /optional/ which are not listed in load= boot option)
slaxemulator@0 191 # Finaly modify DATA variable so it will point to correct directory
slaxemulator@0 192 if [ "$(cmdline_parameter toram)" != "" -o "$(cmdline_parameter copy2ram)" != "" ]; then
slaxemulator@0 193 echolog "copying $LIVECDNAME data to RAM, this may take some time..."
slaxemulator@0 194 mkdir -p $COPY2RAM
slaxemulator@0 195
slaxemulator@0 196 # make sure it's in RAM even with changes= parameter
slaxemulator@0 197 if [ "$CHANGESMNT" ]; then mount -t tmpfs -o "size=$RAMSIZE" tmpfs $COPY2RAM; fi
slaxemulator@0 198 copy_to_ram $DATA $COPY2RAM
slaxemulator@0 199
slaxemulator@0 200 cd_autoeject 1
slaxemulator@0 201 fumount $DATA
slaxemulator@0 202 fumount $MOUNTDIR/*
slaxemulator@0 203 rmdir $MOUNTDIR/* 2>/dev/null # mounted device names are empty, remove them
slaxemulator@0 204 DATA=$COPY2RAM
slaxemulator@0 205 cd_autoeject 0
slaxemulator@0 206 fi
slaxemulator@0 207
slaxemulator@0 208 debug_shell
slaxemulator@0 209
slaxemulator@0 210 MODPATH=$(cmdline_value modpath)
slaxemulator@0 211 if [ "$MODPATH" != "" ]; then
slaxemulator@0 212 MODPATH=$(find_in_computer $MODPATH)
slaxemulator@0 213 if [ $FINDISOVAR ]; then
slaxemulator@0 214 mount_device $MODPATH $FINDISOMNT/$LIVECDNAME/tmp rbind
slaxemulator@0 215 else
slaxemulator@0 216 mount_device $MODPATH $DATA/tmp rbind
slaxemulator@0 217 fi
slaxemulator@0 218 fi
slaxemulator@0 219
slaxemulator@0 220 debug_shell
slaxemulator@0 221
slaxemulator@0 222 # DATA contains path to the base directory of all fs modules which need
slaxemulator@0 223 # to be mounted and inserted into live filesystem. Do it now.
slaxemulator@0 224 echolog "Loading modules:"
slaxemulator@0 225 union_insert_modules $UNION $DATA $IMAGES
slaxemulator@0 226
slaxemulator@0 227 # the $MEMORY directory can contain $MEMORY/modules too
slaxemulator@0 228 # in the case if changes= boot argument is used. If not, it doesn't hurt
slaxemulator@0 229 union_insert_modules $UNION $MEMORY $IMAGES
slaxemulator@0 230
slaxemulator@0 231 debug_shell
slaxemulator@0 232
slaxemulator@0 233 ROOTCOPY=$(cmdline_value rootcopy)
slaxemulator@0 234 if [ $(cmdline_parameter norootcopy) ]; then
slaxemulator@0 235 echolog "Not using rootcopy"
slaxemulator@0 236 elif [ "$ROOTCOPY" ]; then
slaxemulator@0 237 echolog "Mounting content of rootcopy directory"
slaxemulator@0 238 ROOTCOPY=$(find_in_computer $ROOTCOPY)
slaxemulator@34 239 mount_device $ROOTCOPY $DATA/rootcopy rbind
slaxemulator@34 240 echolog "Copying content of rootcopy directory"
slaxemulator@0 241 cp -af $DATA/rootcopy/* $UNION 2>/dev/null # may be empty
slaxemulator@0 242 else
slaxemulator@0 243 echolog "Copying content of rootcopy directory"
slaxemulator@0 244 cp -af $DATA/rootcopy/* $UNION 2>/dev/null # may be empty
slaxemulator@0 245 fi
slaxemulator@0 246
slaxemulator@0 247 # TODO: if copy2ram is used, there is no need to preserve the original in memory anymore
slaxemulator@0 248 #if [ "$DATA" = "$COPY2RAM" ]; then
slaxemulator@0 249 # rm from memory once ??
slaxemulator@0 250 #fi
slaxemulator@0 251
slaxemulator@0 252 echolog "Copying liblinuxlive library to union"
slaxemulator@0 253 cp -af /liblinuxlive $UNION/usr/lib/
slaxemulator@0 254
slaxemulator@0 255 debug_shell
slaxemulator@0 256
slaxemulator@0 257 echolog "Recreating /etc/fstab and /mnt directories"
slaxemulator@0 258 touch $UNION/etc/fstab
slaxemulator@0 259 rmdir $UNION/mnt/* 2>/dev/null
slaxemulator@30 260 #fstab_update $UNION
slaxemulator@30 261 fstab_clean $UNION
slaxemulator@0 262
slaxemulator@0 263 # everything is ready now, so we may unload unused kernel modules
slaxemulator@0 264 # and do some cleanup, unmount few things which are no longer needed.
slaxemulator@0 265 #rmmod_unused_modules
slaxemulator@0 266 #fumount /usr
slaxemulator@0 267 #fumount /sys
slaxemulator@0 268
slaxemulator@0 269 # More likely these directories aren't there.
slaxemulator@0 270 # Even if they are, this won't hurt.
slaxemulator@0 271 mkdir -p $UNION/boot
slaxemulator@0 272 mkdir -p $UNION/proc
slaxemulator@0 273 mkdir -p $UNION/sys
slaxemulator@0 274 mkdir -p $UNION/dev
slaxemulator@0 275 mkdir -p $UNION/tmp
slaxemulator@0 276 chmod 1777 $UNION/tmp
slaxemulator@0 277
slaxemulator@0 278 # Boot will contain whatever was in ./boot directory in the bootable media
slaxemulator@0 279 # Error output goes to null, as nothing is mounted with copy2ram
slaxemulator@0 280 #mount -n -o rbind $(dirname $DATA)/boot $UNION/boot 2>/dev/null
slaxemulator@38 281 MIRRORCMD=$(cmdline_value mirror)
slaxemulator@38 282 if [ "$MIRRORCMD" != "" ]; then
slaxemulator@38 283 MIRRORCMD=$(find_in_computer $MIRRORCMD)
slaxemulator@100 284 if [ -d $MIRRORCMD ]; then
slaxemulator@100 285 mkdir -p $MEMORY/$MIRROR
slaxemulator@100 286 mount_device $MIRRORCMD $MEMORY/$MIRROR #rbind
slaxemulator@38 287 fi
slaxemulator@38 288 fi
slaxemulator@38 289
slaxemulator@100 290 if [ -d $MEMORY/$MIRROR ]; then
slaxemulator@100 291 echolog "Setup repo for mirror iso..."
slaxemulator@100 292 mount -n -o remount,add:1:/$MEMORY/$MIRROR=ro aufs $UNION
slaxemulator@100 293 elif [ -d $FINDISOMNT/$MIRROR ]; then
slaxemulator@100 294 echolog "Setup repo for mirror iso..."
slaxemulator@100 295 mount -n -o remount,add:1:/$FINDISOMNT/$MIRROR=ro aufs $UNION
slaxemulator@100 296 elif [ -d $(dirname $DATA)/$MIRROR ]; then
slaxemulator@30 297 echolog "Setup repo for mirror iso..."
slaxemulator@34 298 mount -n -o remount,add:1:/$(dirname $DATA)/$MIRROR=ro aufs $UNION
slaxemulator@30 299 fi
slaxemulator@0 300
slaxemulator@0 301 # Union contains all the files and directories unioned from all modules.
slaxemulator@0 302 # Change root directory to it, and move initrd's root to /mnt/live/initramdisk
slaxemulator@0 303 # Finaly execute /sbin/init to start the distribution.
slaxemulator@0 304 echolog "changing root directory..."
slaxemulator@0 305
slaxemulator@0 306 cd $UNION
slaxemulator@0 307 mkdir -p $INITRAMDISK
slaxemulator@0 308
slaxemulator@0 309 # Copy all dev files (found by mdev) to unioned dev directory
slaxemulator@0 310 # so at least disk devices exist (your Linux may need them).
slaxemulator@0 311 # Two exceptions, do not copy pty* and tty* devs.
slaxemulator@0 312 if [ "$(cmdline_parameter nohotplug)" ]; then
slaxemulator@0 313 cp -fdR /dev . 2>/dev/null
slaxemulator@0 314 #else
slaxemulator@0 315 #mount -n -o move /dev dev
slaxemulator@0 316 fi
slaxemulator@0 317
slaxemulator@0 318 #mount -n -o move /proc proc
slaxemulator@0 319 #mount -n -o move /sys sys
slaxemulator@0 320 fumount /sys
slaxemulator@0 321
slaxemulator@0 322 if [ ! -e /dev/console ]; then mknod /dev/console c 5 1; fi
slaxemulator@0 323
slaxemulator@0 324 # find chroot and init
slaxemulator@0 325 if [ -x bin/chroot ]; then CHROOT=bin/chroot; fi
slaxemulator@0 326 if [ -x sbin/chroot ]; then CHROOT=sbin/chroot; fi
slaxemulator@0 327 if [ -x usr/bin/chroot ]; then CHROOT=usr/bin/chroot; fi
slaxemulator@0 328 if [ -x usr/sbin/chroot ]; then CHROOT=usr/sbin/chroot; fi
slaxemulator@0 329 if [ "$CHROOT" = "" ]; then fatal "Can't find executable chroot command"; fi
slaxemulator@0 330
slaxemulator@0 331 if [ -x bin/init ]; then INIT=bin/init; fi
slaxemulator@0 332 if [ -x sbin/init ]; then INIT=sbin/init; fi
slaxemulator@0 333 if [ "$INIT" = "" ]; then fatal "Can't find executable init command"; fi
slaxemulator@0 334
slaxemulator@0 335 # time to end Linux Live scripts and start the distribution itself,
slaxemulator@0 336 # using /sbin/init or whatever was found.
slaxemulator@0 337
slaxemulator@0 338 debug_shell
slaxemulator@0 339
slaxemulator@0 340 fumount /proc
slaxemulator@0 341
slaxemulator@0 342 mount -n -o remount,ro aufs .
slaxemulator@0 343
slaxemulator@0 344 # We will copy init from the distro to initrd (there should be 2MB free)
slaxemulator@0 345 # This allows us to use the cleanup script during reboot, as init will be
slaxemulator@0 346 # started from memory and not from the union and /union will not be busy.
slaxemulator@0 347
slaxemulator@0 348 cp -af $INIT /bin >/dev/null 2>&1
slaxemulator@0 349 if [ $? -eq 0 ]; then
slaxemulator@0 350 pivot_root . $INITRAMDISK
slaxemulator@0 351 exec $CHROOT . $INITRAMDISK/bin/init <dev/console >dev/console 2>&1
slaxemulator@0 352 else # If copying fails, start init directly.
slaxemulator@0 353 pivot_root . $INITRAMDISK
slaxemulator@0 354 exec $CHROOT . $INIT <dev/console >dev/console 2>&1
slaxemulator@0 355 fi
slaxemulator@0 356
slaxemulator@0 357 header "!!ERROR!!"
slaxemulator@0 358 fatal "You are not supposed to be here, something went wrong!"