📄 build-initrd.sh
字号:
/* wandered off to change_root code path! */ wrStr("ERROR: initrd config says USEPIVOT>0, but bootloader acts like USEPIVOT=0\n"); _exit(0); }#else if(getpid() == 1) { /* change_root was configured, but kernel */ /* has wandered off to pivot_root code path! */ wrStr("ERROR: initrd config says USEPIVOT=0, but bootloader acts like USEPIVOT>0\n"); runInit(); }#endif#if ${INITIALDELAY} { struct timespec req; wrStr("Delaying ${BOOTDEV} mount for ${INITIALDELAY} seconds...\n"); req.tv_sec = ${INITIALDELAY}; req.tv_nsec = 0; nanosleep(&req, 0); wrStr("...delay complete, continuing\n"); }#endif#if ${TOOLSPROMPT} wrStr("Please insert BOOT-TOOLS media, and press ENTER "); read(0, buf, sizeof(buf));#endif /* this intentionally mounts /boot partition as /lib */ if(mount("${BOOTDEV}", "/lib", "${BOOTTYPE}", MS_MGC_VAL | MS_RDONLY, 0)) { wrStr("Mounting ${BOOTDEV} as /lib failed\n"); goto fail4; }#if ${UTF8KEYBMODE} buf[0] = 0; strCat(buf, "/lib/kbd_mode -u"); exeWait(buf);#endif#if ${LOADNATIONALKEYB} buf[0] = 0; strCat(buf, "/lib/loadkeys");#if ${UTF8KEYBMODE} strCat(buf, " -u");#endif strCat(buf, " /lib/default.kmap"); exeWait(buf);#endif uname(&un); if((un.release[0] > '2') || (un.release[1] != '.') || (un.release[2] >= '6') || (un.release[3] != '.')) { modext = ".ko"; } else { modext = ".o"; }#if ${USEMODULE} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/loop"); strCat(buf, modext); strCat(buf, " ${LOOPMODPARAMS}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTRAMODULELOAD1} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/${EXTRAMODULENAME1}"); strCat(buf, modext); strCat(buf, " ${EXTRAMODULEPARAMS1}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTRAMODULELOAD2} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/${EXTRAMODULENAME2}"); strCat(buf, modext); strCat(buf, " ${EXTRAMODULEPARAMS2}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTRAMODULELOAD3} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/${EXTRAMODULENAME3}"); strCat(buf, modext); strCat(buf, " ${EXTRAMODULEPARAMS3}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTRAMODULELOAD4} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/${EXTRAMODULENAME4}"); strCat(buf, modext); strCat(buf, " ${EXTRAMODULEPARAMS4}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTRAMODULELOAD5} buf[0] = 0; strCat(buf, "/lib/insmod /lib/modules-"); strCat(buf, &un.release[0]); strCat(buf, "/${EXTRAMODULENAME5}"); strCat(buf, modext); strCat(buf, " ${EXTRAMODULEPARAMS5}"); if(exeWait(buf)) goto fail5;#endif#if ${EXTERNALGPGFILES}#if ${MOUNTDELAY} { struct timespec req; wrStr("Delaying ${EXTERNALGPGDEV} mount for ${MOUNTDELAY} seconds...\n"); req.tv_sec = ${MOUNTDELAY}; req.tv_nsec = 0; nanosleep(&req, 0); wrStr("...delay complete, continuing\n"); }#endif if(mount("${EXTERNALGPGDEV}", "/mnt", "${EXTERNALGPGTYPE}", MS_MGC_VAL | MS_RDONLY, 0)) { wrStr("Mounting ${EXTERNALGPGDEV} containing gpg key files failed.\n"); goto fail5; }#endif tryAgain:#if !(${USEROOTSETUP}) wrStr("\nEncrypted file system, please supply correct password to continue\n\n");#endif buf[0] = 0; strCat(buf, "/lib/${LOSETUPPROG} -e ${CIPHERTYPE} ${PSEED} ${ITERCOUNTK} ${LOINIT}");#if ${USEGPGKEY} strCat(buf, " -K /${GPGMNTPATH}/${GPGKEYFILE} -G /${GPGMNTPATH}");#endif strCat(buf, " /dev/loop${DEVFSSLASH1}${ROOTLOOPINDEX} ${CRYPTROOT}"); if(exeWait(buf)) { if(++x >= 5) goto fail3; goto tryAgain; }#if !(${USEROOTSETUP}) wrStr("\n");#endif#if ${USEPIVOT} if(mount("/dev/loop${DEVFSSLASH1}${ROOTLOOPINDEX}", "/new-root", "${ROOTTYPE}", MS_MGC_VAL | MS_RDONLY, 0)) { wrStr("Mounting /dev/loop${DEVFSSLASH1}${ROOTLOOPINDEX} failed\n"); buf[0] = 0; strCat(buf, "/lib/${LOSETUPPROG} -d /dev/loop${DEVFSSLASH1}${ROOTLOOPINDEX}"); if(exeWait(buf)) goto fail3; if(++x >= 5) goto fail3; goto tryAgain; }#if ${EXTERNALGPGFILES} umount("/mnt");#endif umount("/lib"); if(chdir("/new-root")) { wrStr("chdir() to /new-root failed\n"); goto fail1; }#if ${USEPIVOT} == 2 removeInitramfsFiles(); if(mount(".", "/", 0, MS_MGC_VAL | MS_MOVE, 0)) { wrStr("Overmounting root failed\n"); fail1: chdir("/"); umount("/new-root"); goto fail4; } /* initramfs/switch_root type setup wants chroot() immediately after mount() */ if(chroot(".")) { wrStr("chroot() to new root failed\n"); goto fail1; }#else if(pivot_root(".", "initrd")) { wrStr("pivot_root() to new root failed.\n Either 'initrd' directory is missing from your encrypted root partition\n or your kernel doesn't have pivot_root system call.\n"); fail1: chdir("/"); umount("/new-root"); goto fail4; } /* pivot_root type setup wants chdir("/") immediately after pivot_root() */#endif chdir("/");#if ${USEDEVFS} if(mount("none", "dev", "devfs", MS_MGC_VAL, 0)) { wrStr("Mounting /dev failed\n"); goto fail1; }#endif x = open("dev/console", O_RDWR, 0); if(x == -1) { wrStr("Opening /dev/console on encrypted root failed\n"); goto fail1; } dup2(x, 0); dup2(x, 1); dup2(x, 2); close(x);#if ${USEPIVOT} == 1 /* pivot_root type setup wants chroot() after chdir("/") */ if(chroot(".")) { wrStr("chroot() to new root failed\n"); goto fail1; } wrStr("Pivoting to encrypted root completed successfully\n");#else wrStr("Switching to encrypted root completed successfully\n");#endif runInit();#else /* USEPIVOT=0 configured, write new device number to real-root-dev */ if(mount("none", "/proc", "proc", MS_MGC_VAL, 0)) { wrStr("Mounting /proc failed\n"); goto fail3; } if((x = open("/proc/sys/kernel/real-root-dev", O_WRONLY, 0)) == -1) { wrStr("Unable to open real-root-dev\n"); goto fail2; } write(x, "0x70${ROOTLOOPINDEX}\n", 6); close(x); fail2: umount("/proc");#endif fail3:#if ${EXTERNALGPGFILES} umount("/mnt");#endif fail5: umount("/lib"); fail4:#if ${USEPIVOT} doHalt();#endif _exit(0);}EOFif [ ${USEDIETLIBC} == 1 ] ; then diet ${GCC} -Wall -O2 -s -static -pipe tmp-c-$$.c -o tmp-c-$$else ${GCC} -Wall -O2 -s -static -nostartfiles -pipe tmp-c-$$.c -o tmp-c-$$firm -f tmp-c-$$.[co]mkdir tmp-d-$$if [ ${USEPIVOT} != 2 ] ; then x=`cat tmp-c-$$ | wc -c` y=`expr ${x} + 1023` x=`expr ${y} / 1024` y=`expr ${x} + 11` if [ ${x} -gt 7 ] ; then y=`expr ${y} + 1` fi if [ ${x} -gt 519 ] ; then y=`expr ${y} + 3` fi if [ ${USEGPGKEY} == 1 ] ; then y=`expr ${y} + 1` fi if [ ${EXTERNALGPGFILES} == 1 ] ; then y=`expr ${y} + 1` fi dd if=/dev/zero of=tmp-i-$$ bs=1024 count=${y} /sbin/mkfs -t minix -i 32 tmp-i-$$ mount -t minix tmp-i-$$ tmp-d-$$ -o loop=/dev/loop${DEVFSSLASH2}${TEMPLOOPINDEX}ficd tmp-d-$$mkdir dev libln -s lib lib64if [ ${USEPIVOT} != 2 ] ; then mv ../tmp-c-$$ linuxrcelse mv ../tmp-c-$$ initfiif [ ${EXTERNALGPGFILES} == 1 ] ; then mkdir mntfiif [ ${USEGPGKEY} == 1 ] ; then ln -s lib binfiif [ ${USEPIVOT} != 0 ] ; then mkdir new-rootelse mkdir procfi# <device name prefix> <major dev-id> <minor dev-id start> <device 0 suffix>function maybeMakeDiskNode{ x=$3 for i in "$4" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do for y in ${BOOTDEV} ${CRYPTROOT} ${GPGMOUNTDEV} ; do if [ ${y} == /dev/$1${i} ] ; then mknod dev/$1${i} b $2 ${x} mknodCount=`expr ${mknodCount} + 1` fi done x=`expr ${x} + 1` done return}if [ ${USEDEVFS} == 0 ] ; then mknodCount=0 mknodRefCount=2 if [ ${EXTERNALGPGFILES} == 1 ] ; then mknodRefCount=`expr ${mknodRefCount} + 1` fi maybeMakeDiskNode hda 3 0 "" maybeMakeDiskNode hdb 3 64 "" maybeMakeDiskNode hdc 22 0 "" maybeMakeDiskNode hdd 22 64 "" maybeMakeDiskNode hde 33 0 "" maybeMakeDiskNode hdf 33 64 "" maybeMakeDiskNode hdg 34 0 "" maybeMakeDiskNode hdh 34 64 "" maybeMakeDiskNode sda 8 0 "" maybeMakeDiskNode sdb 8 16 "" maybeMakeDiskNode sdc 8 32 "" maybeMakeDiskNode sdd 8 48 "" maybeMakeDiskNode sde 8 64 "" maybeMakeDiskNode sdf 8 80 "" maybeMakeDiskNode sdg 8 96 "" maybeMakeDiskNode sdh 8 112 "" maybeMakeDiskNode uba 180 0 "" maybeMakeDiskNode ubb 180 8 "" maybeMakeDiskNode ubc 180 16 "" maybeMakeDiskNode ubd 180 24 "" maybeMakeDiskNode ube 180 32 "" maybeMakeDiskNode ubf 180 40 "" maybeMakeDiskNode ubg 180 48 "" maybeMakeDiskNode ubh 180 56 "" maybeMakeDiskNode scd 11 0 0 maybeMakeDiskNode sr 11 0 0 maybeMakeDiskNode md 9 0 0 maybeMakeDiskNode fd 2 0 0 maybeMakeDiskNode idac0d0p 72 0 0 maybeMakeDiskNode idac0d1p 72 16 0 maybeMakeDiskNode idac0d2p 72 32 0 maybeMakeDiskNode idac0d3p 72 48 0 if [ ${mknodCount} != ${mknodRefCount} ] ; then echo "*****************************************************************" echo "*** Internal build-initrd.sh error condition detected. This ***" echo "*** script was supposed to create block device nodes for ***" echo "*** BOOTDEV=, CRYPTROOT= and possibly EXTERNALGPGDEV= but ***" echo "*** lacked knowledge of how to create at least one of them. ***" echo "*** Script aborted. ***" echo "*****************************************************************" cd .. if [ ${USEPIVOT} != 2 ] ; then umount tmp-d-$$ rmdir tmp-d-$$ rm tmp-i-$$ else rm -rf tmp-d-$$ fi exit 1 fi # NOTE: If you add/remove/change these device names, then also edit # removeInitramfsFiles() function so it can remove all device nodes mknod dev/console c 5 1 mknod dev/tty c 5 0 mknod dev/tty1 c 4 1 mknod dev/null c 1 3 mknod dev/zero c 1 5 mknod dev/ram0 b 1 0 mknod dev/ram1 b 1 1 mknod dev/loop${ROOTLOOPINDEX} b 7 ${ROOTLOOPINDEX}fiif [ ${USEPIVOT} != 2 ] ; then cd .. df tmp-d-$$ umount tmp-d-$$ rmdir tmp-d-$$ sync ; sync ; sync gzip -9 tmp-i-$$else find | cpio -o -H newc | gzip -9c >../tmp-i-$$.gz cd .. rm -rf tmp-d-$$fimv tmp-i-$$.gz ${DESTINATIONROOT}${DESTINATIONPREFIX}/${INITRDGZNAME}ls -l ${DESTINATIONROOT}${DESTINATIONPREFIX}/${INITRDGZNAME}if [ ${INITRDONLY} == 1 ] ; then echo Done. sync exit 0fiz="/sbin/losetup"if [ ${USEMODULE}${EXTRAMODULELOAD1}${EXTRAMODULELOAD2}${EXTRAMODULELOAD3}${EXTRAMODULELOAD4}${EXTRAMODULELOAD5} != 000000 ] ; then z="${z} /sbin/insmod" if [ -r ${SOURCEROOT}/sbin/insmod.modutils ] ; then z="${z} /sbin/insmod.modutils" fi if [ -r ${SOURCEROOT}/sbin/insmod.old ] ; then z="${z} /sbin/insmod.old" fifiif [ ${UTF8KEYBMODE} == 1 ] ; then z="${z} "`which kbd_mode`fiif [ ${LOADNATIONALKEYB} == 1 ] ; then z="${z} "`which loadkeys`fiif [ ${USEGPGKEY} == 1 ] ; then z="${z} "`which gpg`fifor x in ${z} ; do echo Copying ${SOURCEROOT}${x} to ${DESTINATIONROOT}${DESTINATIONPREFIX} cp -p ${SOURCEROOT}${x} ${DESTINATIONROOT}${DESTINATIONPREFIX} y=`ldd ${SOURCEROOT}${x} | perl -ne 'if(/([^ ]*) \(0x/){print "$1\n"}'` for a in ${y} ; do echo Copying ${SOURCEROOT}${a} to ${DESTINATIONROOT}${DESTINATIONPREFIX} cp -p ${SOURCEROOT}${a} ${DESTINATIONROOT}${DESTINATIONPREFIX} donedoneif [ ${USEPIVOT} != 2 ] ; then if [ ! -d ${DESTINATIONROOT}/initrd ] ; then mkdir ${DESTINATIONROOT}/initrd fifiecho Done.syncexit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -