From 85d243ff5836fc17416c65dca8a9e8b4e9d915bc Mon Sep 17 00:00:00 2001 From: Gerardo Exequiel Pozzi Date: Sat, 18 Jun 2011 18:38:58 -0300 Subject: [archiso] Use dm-snapshot instead of aufs2 (A.K.A. "The Big Commit") * Use device mapper + snapshot module, instead union layer filesystem. * A block-level approach vs vfs-level. * No more unofficial (Linux) things. * More memory is needed. * Refactor mkarchiso. * Refactor hooks/archiso. * Fix install/archiso_pxe_nbd (due recent change in mkinitcpio-0.6.15 on checked_modules()/all_modules()) [Thanks Dave for the improved workaround] * New configs/releng to build official images. * Works with a Bash script instead of Makefile. (better control and easy to maintain) * Remove configs/syslinux-iso. * Remove archiso2dual script. Integrate functionality in configs/releng. * New configs/baseline to build the most basic live medium or use as template. * New README (draft). [Thanks Dieter for fixing english grammar] Signed-off-by: Gerardo Exequiel Pozzi --- README | 273 +++++----- README.old | 117 +++++ archiso/Makefile | 16 +- archiso/hooks/archiso | 207 ++++---- archiso/install/archiso | 23 +- archiso/install/archiso_pxe_nbd | 8 +- archiso/mkarchiso | 559 ++++++++++++++------- archiso2dual/Makefile | 13 - archiso2dual/README | 55 -- archiso2dual/archiso2dual | 411 --------------- archiso2dual/isomounts | 12 - archiso2dual/removefiles.lst | 7 - archiso2dual/syslinux.cfg | 12 - archiso2dual/syslinux_32only.cfg | 3 - archiso2dual/syslinux_arch32.cfg | 10 - archiso2dual/syslinux_arch64.cfg | 10 - archiso2dual/syslinux_both.cfg | 4 - archiso2dual/syslinux_head.cfg | 32 -- archiso2dual/syslinux_tail.cfg | 29 -- configs/baseline/aitab | 2 + configs/baseline/build.sh | 97 ++++ configs/baseline/isolinux/isolinux.cfg | 5 + configs/baseline/mkinitcpio.conf | 2 + configs/baseline/root-image/etc/fstab | 2 + configs/baseline/syslinux/syslinux.cfg | 12 + configs/releng/aitab.core | 6 + configs/releng/aitab.netinstall | 4 + configs/releng/build.sh | 284 +++++++++++ configs/releng/core.exclude.i686 | 4 + configs/releng/core.exclude.x86_64 | 4 + configs/releng/isolinux/isolinux.cfg | 5 + configs/releng/mkinitcpio.conf | 2 + configs/releng/packages.i686 | 38 ++ configs/releng/packages.x86_64 | 38 ++ configs/releng/root-image/arch/report-issues | 1 + configs/releng/root-image/arch/setup | 3 + configs/releng/root-image/etc/arch-release | 1 + configs/releng/root-image/etc/archiso/functions | 20 + configs/releng/root-image/etc/fstab | 5 + configs/releng/root-image/etc/hosts | 9 + configs/releng/root-image/etc/inittab | 48 ++ configs/releng/root-image/etc/issue | 5 + configs/releng/root-image/etc/motd | 16 + configs/releng/root-image/etc/pam.d/su | 6 + configs/releng/root-image/etc/rc.conf | 35 ++ configs/releng/root-image/etc/rc.d/archiso | 48 ++ .../etc/rc.d/functions.d/automated_script | 25 + configs/releng/root-image/etc/sudoers.d/g_wheel | 1 + configs/releng/root-image/usr/bin/autologin | 2 + configs/releng/root-image/usr/bin/km | 2 + configs/releng/syslinux.dual/syslinux.cfg | 12 + configs/releng/syslinux.dual/syslinux_32only.cfg | 3 + configs/releng/syslinux.dual/syslinux_arch32.cfg | 11 + configs/releng/syslinux.dual/syslinux_arch64.cfg | 11 + configs/releng/syslinux.dual/syslinux_both.cfg | 4 + configs/releng/syslinux.dual/syslinux_head.cfg | 27 + configs/releng/syslinux.dual/syslinux_tail.cfg | 29 ++ configs/releng/syslinux/splash.png | Bin 0 -> 45400 bytes configs/releng/syslinux/syslinux.cfg | 70 +++ configs/syslinux-iso/Makefile | 94 ---- configs/syslinux-iso/boot-files/releasenotes.txt | 3 - configs/syslinux-iso/boot-files/splash.png | Bin 45400 -> 0 bytes .../syslinux-iso/boot-files/syslinux/syslinux.cfg | 69 --- configs/syslinux-iso/download-repo.sh | 66 --- configs/syslinux-iso/instructions | 36 -- configs/syslinux-iso/isomounts | 12 - configs/syslinux-iso/mkinitcpio.conf | 6 - configs/syslinux-iso/overlay/arch/report-issues | 1 - configs/syslinux-iso/overlay/arch/setup | 3 - configs/syslinux-iso/overlay/etc/arch-release | 1 - configs/syslinux-iso/overlay/etc/archiso/functions | 20 - configs/syslinux-iso/overlay/etc/fstab | 5 - configs/syslinux-iso/overlay/etc/hosts | 8 - configs/syslinux-iso/overlay/etc/inittab | 48 -- configs/syslinux-iso/overlay/etc/issue | 5 - configs/syslinux-iso/overlay/etc/motd | 16 - configs/syslinux-iso/overlay/etc/pacman.conf | 80 --- configs/syslinux-iso/overlay/etc/pam.d/su | 6 - configs/syslinux-iso/overlay/etc/rc.conf | 36 -- configs/syslinux-iso/overlay/etc/rc.d/archiso | 57 --- .../overlay/etc/rc.d/functions.d/automated_script | 25 - configs/syslinux-iso/overlay/etc/sudoers | 2 - configs/syslinux-iso/overlay/usr/bin/autologin | 2 - configs/syslinux-iso/overlay/usr/bin/km | 2 - configs/syslinux-iso/packages.i686 | 46 -- configs/syslinux-iso/packages.x86_64 | 46 -- 86 files changed, 1682 insertions(+), 1713 deletions(-) create mode 100644 README.old delete mode 100644 archiso2dual/Makefile delete mode 100644 archiso2dual/README delete mode 100755 archiso2dual/archiso2dual delete mode 100644 archiso2dual/isomounts delete mode 100644 archiso2dual/removefiles.lst delete mode 100644 archiso2dual/syslinux.cfg delete mode 100644 archiso2dual/syslinux_32only.cfg delete mode 100644 archiso2dual/syslinux_arch32.cfg delete mode 100644 archiso2dual/syslinux_arch64.cfg delete mode 100644 archiso2dual/syslinux_both.cfg delete mode 100644 archiso2dual/syslinux_head.cfg delete mode 100644 archiso2dual/syslinux_tail.cfg create mode 100644 configs/baseline/aitab create mode 100755 configs/baseline/build.sh create mode 100644 configs/baseline/isolinux/isolinux.cfg create mode 100644 configs/baseline/mkinitcpio.conf create mode 100644 configs/baseline/root-image/etc/fstab create mode 100644 configs/baseline/syslinux/syslinux.cfg create mode 100644 configs/releng/aitab.core create mode 100644 configs/releng/aitab.netinstall create mode 100755 configs/releng/build.sh create mode 100644 configs/releng/core.exclude.i686 create mode 100644 configs/releng/core.exclude.x86_64 create mode 100644 configs/releng/isolinux/isolinux.cfg create mode 100644 configs/releng/mkinitcpio.conf create mode 100644 configs/releng/packages.i686 create mode 100644 configs/releng/packages.x86_64 create mode 100755 configs/releng/root-image/arch/report-issues create mode 100755 configs/releng/root-image/arch/setup create mode 100644 configs/releng/root-image/etc/arch-release create mode 100644 configs/releng/root-image/etc/archiso/functions create mode 100644 configs/releng/root-image/etc/fstab create mode 100644 configs/releng/root-image/etc/hosts create mode 100644 configs/releng/root-image/etc/inittab create mode 100644 configs/releng/root-image/etc/issue create mode 100644 configs/releng/root-image/etc/motd create mode 100644 configs/releng/root-image/etc/pam.d/su create mode 100644 configs/releng/root-image/etc/rc.conf create mode 100755 configs/releng/root-image/etc/rc.d/archiso create mode 100644 configs/releng/root-image/etc/rc.d/functions.d/automated_script create mode 100644 configs/releng/root-image/etc/sudoers.d/g_wheel create mode 100755 configs/releng/root-image/usr/bin/autologin create mode 100755 configs/releng/root-image/usr/bin/km create mode 100644 configs/releng/syslinux.dual/syslinux.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_32only.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_arch32.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_arch64.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_both.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_head.cfg create mode 100644 configs/releng/syslinux.dual/syslinux_tail.cfg create mode 100644 configs/releng/syslinux/splash.png create mode 100644 configs/releng/syslinux/syslinux.cfg delete mode 100644 configs/syslinux-iso/Makefile delete mode 100644 configs/syslinux-iso/boot-files/releasenotes.txt delete mode 100644 configs/syslinux-iso/boot-files/splash.png delete mode 100644 configs/syslinux-iso/boot-files/syslinux/syslinux.cfg delete mode 100755 configs/syslinux-iso/download-repo.sh delete mode 100644 configs/syslinux-iso/instructions delete mode 100644 configs/syslinux-iso/isomounts delete mode 100644 configs/syslinux-iso/mkinitcpio.conf delete mode 100755 configs/syslinux-iso/overlay/arch/report-issues delete mode 100755 configs/syslinux-iso/overlay/arch/setup delete mode 100644 configs/syslinux-iso/overlay/etc/arch-release delete mode 100644 configs/syslinux-iso/overlay/etc/archiso/functions delete mode 100644 configs/syslinux-iso/overlay/etc/fstab delete mode 100644 configs/syslinux-iso/overlay/etc/hosts delete mode 100644 configs/syslinux-iso/overlay/etc/inittab delete mode 100644 configs/syslinux-iso/overlay/etc/issue delete mode 100644 configs/syslinux-iso/overlay/etc/motd delete mode 100644 configs/syslinux-iso/overlay/etc/pacman.conf delete mode 100644 configs/syslinux-iso/overlay/etc/pam.d/su delete mode 100644 configs/syslinux-iso/overlay/etc/rc.conf delete mode 100755 configs/syslinux-iso/overlay/etc/rc.d/archiso delete mode 100644 configs/syslinux-iso/overlay/etc/rc.d/functions.d/automated_script delete mode 100644 configs/syslinux-iso/overlay/etc/sudoers delete mode 100755 configs/syslinux-iso/overlay/usr/bin/autologin delete mode 100755 configs/syslinux-iso/overlay/usr/bin/km delete mode 100644 configs/syslinux-iso/packages.i686 delete mode 100644 configs/syslinux-iso/packages.x86_64 diff --git a/README b/README index e3001be..dee3a50 100644 --- a/README +++ b/README @@ -1,117 +1,156 @@ -Archiso For Dummies Like Me and You -------------------------------------- - - -- What the hell is Archiso? - -Archiso is a small set of bash scripts that is capable of building fully -functional Arch Linux based live CDs. It is a very generic tool, so it -could potentially be used to generate anything from rescue systems, -to install disks, to special interest live CD systems, and who knows what -else. Simply put, if it involves Arch on a shiny coaster, it can do it. - - -- Alright, so how does one install it? - -First off, Archiso has some dependencies: - - mkinitcpio - - cdrkit - - squashfs-tools - - aufs2 (only needed in target media) - - aufs2-util (only needed in target media) - - devtools for mkarchroot - - syslinux - - nbd - - mkinitcpio-nfs-utils - -Archiso itself can be installed with the handy dandy included Makefile, -and the incantation 'make install'. - - -- Great, so how do you use this thing? - -The heart and soul of Archiso is mkarchiso. All of its options are -documented in its usage output, so we won't go into detail here. -Instead, let's go over the general process. - -The first thing you should probably do is create a directory to work -in, and cd to it. This'll help keep things organized. Next, you'll want -to create a mkinitcpio config file that suits your needs. Typically this -means modifying whatever hooks you want. A typical set of hooks for -archiso looks something like this: - -HOOKS="base udev archiso archiso_pxe_nbd pata scsi sata usb fw pcmcia filesystems usbinput" - -It's probably worth mentioning that hardware autodetection and things -of that nature do not belong here. Only what's necessary to get the system -on its feet, and out of the initcpio really belong here, fancier stuff -can be done on the booted system anyway. - -You'll also want to create a list of packages you want installed on your -live CD system. A file full of package names, one-per-line, is the format -for this. Typically you'll want BASE and a kernel as a bare minimum, but -you're free to install whatever else you want. This is *great* for -special interest live CDs, just specify packages you want and gogogo. - -The last item of importance is what are called addons. Basically this -means any other crap you might want to include on your live CD, including -binary package repos, special configurations, random files, we don't -know, be creative. mkarchiso expects them all to be put in a single -directory, with an fstab-like config file. Currently two types of addons -are supported, squashfs images that get layered onto the root union, and -plain directories which can be bind mounted anywhere under the root. - -If you want to add a squashfs union layer: -- Set up whatever you want to include in a separate directory someplace, - as if that directory was / . Then run mksquahfs on it, and copy the - created image to your addons directory. -- Add an entry to your addons config file (which must be named 'config', - by the way). Typical squashfs entries look like this: - live_overlay.sqfs / squashfs - Where the first component is the path to the image relative to your - addons directory, the second is the mountpoint (irrelevant for - squashfs, they will all get layered at /) and of course the third - component is the type. -- Be aware that the order of entries on the config matters! Entries will - be layered on top of one another, later entries are mounted _UNDER_ - earlier entries (an unfortunate counterintuitive result of the way we - have to mount the unions). - -If you want to add plain directories to bind mount: -- Set up your directory somewhere, and copy it to your addon directory. -- Add an entry to your addons config file, example entry: - core /packages bind - where the first component is the path to the directory relative to - your addons directory, the second component is where you'd like it - bind-mounted relative to the live CD's root filesystem, and the last - component is the type. - - -- How can build installation mediums like provided by Arch Linux? - -- Just follow these next steps as root. -- Note that mkarchroot is optional, but with it, will ensure to have - a clean enviroment for building isos. -- This clean chroot, will take about 400MB (+130MB with all needed tools). -- After make, max space usage is about 2GB. -- In last step instead of just execute make, can be more selective: - Execute "make net-iso" or make "core-iso". - Do not execute make net-iso after make core-iso, otherwise net-iso - will be really a core-iso. - - -pacman -S devtools --needed -mkarchroot /tmp/somedir base -mkarchroot -r bash /tmp/somedir -# vi/nano /etc/pacman.d/mirrorlist and uncomment your prefered mirror. -pacman -S git squashfs-tools syslinux devtools cdrkit make nbd mkinitcpio-nfs-utils -cd /tmp -git clone git://projects.archlinux.org/archiso.git -cd archiso/archiso -make install -cd ../configs/syslinux-iso/ -make - -Done! - -vim: textwidth=72 +INDEX +----- + +* Image types generated by mkarchiso. +* File format for aitab. +* Why the /isolinux and /arch/boot/syslinux directories? +* Building the most basic Arch Linux live media. (configs/baseline) +* Building official Arch Linux live media. (configs/releng) + + + +*** Image types generated by mkarchiso. + +* image-name.sfs SquashFS image with all files directly on it. +* image-name.fs.sfs SquashFS with only one file inside (image-name.fs), + which is an image of some type of filesystem + (ext4, ext3, ext2, xfs), all files reside on it. +* image-name.fs Like image-name.fs.sfs but without SquashFS. + (For testing purposes only. The option copytoram + for archiso hook does not have any effect on these images) + + + +*** File format for aitab. + +The aitab file holds information about the filesystems images that must be +created by mkarchiso and mounted at initramfs stage from the archiso hook. +It consists of some fields which define the behaviour of images. + +# + + Image name without extension (.fs .fs.sfs .sfs). + Mount point. + Architecture { i686 | x86_64 | any }. + SquashFS compression type { gzip | lzo | xz }. + A special value of "none" denotes no usage of SquashFS. + Set the filesystem type of the image { ext4 | ext3 | ext2 | xfs }. + A special value of "none" denotes no usage of a filesystem. + In that case all files are pushed directly to SquashFS filesystem. + An absolute value of file system image size in MiB. + (example: 100, 1000, 4096, etc) + A relative value of file system free space [in percent]. + {1%..99%} (example 50%, 10%, 7%). + This is an estimation, and calculated in a simple way. + Space used + 10% (estimated for metadata overhead) + desired % + +Note: Some combinations are invalid, example: sfs_comp=none and fs_type=none + + + +*** Why the /isolinux and /arch/boot/syslinux directories? + +The /isolinux directory holds files needed for the ISOLINUX boot loader +module of SYSLINUX. ISOLINUX can not find config files on +/arch/boot/syslinux, like other boot loaders modules (EXTLINUX, SYSLINUX, etc). +When make your custom boot-pendrive, you need to copy /arch directory to it. +/isolinux/isolinux.cfg just holds /arch/boot/syslinux/syslinux.cfg + + + +*** Building the most basic Arch Linux live media. (configs/baseline) + +* First install devtools if needed, mkarchroot needs it. + [host] # pacman -S devtools + +* Create a chroot to work on it. + (prefix with linux32 if you want to build a 32 bits enviroment under 64 bits) + [host] # mkarchroot /tmp/chroot base + +* Enter it. (prefix with linux32 if needed). + [host] # mkarchroot -r bash /tmp/chroot + +* Create a loopback device. + (mkarchiso does not create it, use other number if not available) + [chroot] # mknod /dev/loop0 b 7 0 + +* Setup a mirror. + [chroot] # echo 'Server = MIRROR/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist + +* Install aditional packages needed for mkarchiso. + (git is only needed to get a copy of archiso.git) + [chroot] # pacman -S git squashfs-tools syslinux devtools cdrkit make + +* Install archiso. + [chroot] # cd /tmp + [chroot] # git clone git://projects.archlinux.org/archiso.git + [chroot] # cd archiso/archiso + [chroot] # make install-program + +* Build a basic iso. + [chroot] # cd /tmp/archiso/configs/baseline + [chroot] # ./build.sh + +* Exit from chroot. + [chroot] # exit + +Note: If you want to customize, just see the configs/releng directory which is +used to build official images with much more things. + + + +*** Building official Arch Linux live media. (configs/releng) + +Note: These steps should be done with 64 bits support. + +* Prepare a 32 bit chroot enviroment. + +linux32 mkarchroot /tmp/chroot32 base +linux32 mkarchroot -r bash /tmp/chroot32 +echo 'Server = MIRROR/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist +pacman -S squashfs-tools syslinux devtools cdrkit make mkinitcpio-nfs-utils nbd --noconfirm --needed +exit + +* Prepare a 64 bits chroot enviroment. + +mkarchroot /tmp/chroot64 base +mkarchroot -r bash /tmp/chroot64 +echo 'Server = MIRROR/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist +pacman -S squashfs-tools syslinux devtools cdrkit make mkinitcpio-nfs-utils nbd --noconfirm --needed +exit + +* Create a shared directory which archiso can access from both chroot enviroments. + +mkdir /tmp/shared +cd /tmp/shared +git clone git://github.com/djgera/archiso.git -b dm-snapshot +cd +mount --bind /tmp/shared /tmp/chroot32/tmp +mount --bind /tmp/shared /tmp/chroot64/tmp + +* Enter 32 bits chroot enviroment, install mkarchiso, + then build core and netinstall single images. + +linux32 mkarchroot -r bash /tmp/chroot32 +mknod /dev/loop1032 b 7 1032 +cd /tmp/archiso/archiso +make install-program +cd ../configs/releng/ +./build.sh all_iso_single + +* Enter 64 bits chroot enviroment, install mkarchiso, + then build core and netinstall single images. + +mkarchroot -r bash /tmp/chroot64 +mknod /dev/loop1064 b 7 1064 +cd /tmp/archiso/archiso +make install-program +cd ../configs/releng/ +./build.sh all_iso_single + +* Finally build core and netinstall dual images + from any of the chroot enviroments. (The final result is the same). + +mkarchroot -r bash /tmp/chroot64 +cd /tmp/archiso/configs/releng/ +./build.sh all_iso_dual diff --git a/README.old b/README.old new file mode 100644 index 0000000..cbfed9e --- /dev/null +++ b/README.old @@ -0,0 +1,117 @@ +Archiso For Dummies Like Me and You +------------------------------------- + + +- What the hell is Archiso? + +Archiso is a small set of bash scripts that is capable of building fully +functional Arch Linux based live CDs. It is a very generic tool, so it +could potentially be used to generate anything from rescue systems, +to install disks, to special interest live CD systems, and who knows what +else. Simply put, if it involves Arch on a shiny coaster, it can do it. + + +- Alright, so how does one install it? + +First off, Archiso has some dependencies: + - mkinitcpio + - cdrkit + - squashfs-tools + - aufs2 (only needed in target media) + - aufs2-util (only needed in target media) + - devtools for mkarchroot + - syslinux + - nbd + - mkinitcpio-nfs-utils + +Archiso itself can be installed with the handy dandy included Makefile, +and the incantation 'make install'. + + +- Great, so how do you use this thing? + +The heart and soul of Archiso is mkarchiso. All of its options are +documented in its usage output, so we won't go into detail here. +Instead, let's go over the general process. + +The first thing you should probably do is create a directory to work +in, and cd to it. This'll help keep things organized. Next, you'll want +to create a mkinitcpio config file that suits your needs. Typically this +means modifying whatever hooks you want. A typical set of hooks for +archiso looks something like this: + +HOOKS="base udev archiso pata scsi sata usb fw pcmcia filesystems usbinput" + +It's probably worth mentioning that hardware autodetection and things +of that nature do not belong here. Only what's necessary to get the system +on its feet, and out of the initcpio really belong here, fancier stuff +can be done on the booted system anyway. + +You'll also want to create a list of packages you want installed on your +live CD system. A file full of package names, one-per-line, is the format +for this. Typically you'll want BASE and a kernel as a bare minimum, but +you're free to install whatever else you want. This is *great* for +special interest live CDs, just specify packages you want and gogogo. + +The last item of importance is what are called addons. Basically this +means any other crap you might want to include on your live CD, including +binary package repos, special configurations, random files, we don't +know, be creative. mkarchiso expects them all to be put in a single +directory, with an fstab-like config file. Currently two types of addons +are supported, squashfs images that get layered onto the root union, and +plain directories which can be bind mounted anywhere under the root. + +If you want to add a squashfs union layer: +- Set up whatever you want to include in a separate directory someplace, + as if that directory was / . Then run mksquahfs on it, and copy the + created image to your addons directory. +- Add an entry to your addons config file (which must be named 'config', + by the way). Typical squashfs entries look like this: + live_overlay.sqfs / squashfs + Where the first component is the path to the image relative to your + addons directory, the second is the mountpoint (irrelevant for + squashfs, they will all get layered at /) and of course the third + component is the type. +- Be aware that the order of entries on the config matters! Entries will + be layered on top of one another, later entries are mounted _UNDER_ + earlier entries (an unfortunate counterintuitive result of the way we + have to mount the unions). + +If you want to add plain directories to bind mount: +- Set up your directory somewhere, and copy it to your addon directory. +- Add an entry to your addons config file, example entry: + core /packages bind + where the first component is the path to the directory relative to + your addons directory, the second component is where you'd like it + bind-mounted relative to the live CD's root filesystem, and the last + component is the type. + + +- How can build installation mediums like provided by Arch Linux? + +- Just follow these next steps as root. +- Note that mkarchroot is optional, but with it, will ensure to have + a clean enviroment for building isos. +- This clean chroot, will take about 400MB (+130MB with all needed tools). +- After make, max space usage is about 2GB. +- In last step instead of just execute make, can be more selective: + Execute "make net-iso" or make "core-iso". + Do not execute make net-iso after make core-iso, otherwise net-iso + will be really a core-iso. + + +pacman -S devtools --needed +mkarchroot /tmp/somedir base +mkarchroot -r bash /tmp/somedir +# vi/nano /etc/pacman.d/mirrorlist and uncomment your prefered mirror. +pacman -S git squashfs-tools syslinux devtools cdrkit make nbd mkinitcpio-nfs-utils +cd /tmp +git clone git://projects.archlinux.org/archiso.git +cd archiso/archiso +make install +cd ../configs/syslinux-iso/ +make + +Done! + +vim: textwidth=72 diff --git a/archiso/Makefile b/archiso/Makefile index 93d68af..74f9ff2 100644 --- a/archiso/Makefile +++ b/archiso/Makefile @@ -1,6 +1,8 @@ all: -install: all +install: install-program install-examples install-doc + +install-program: # install to sbin since script only usable by root install -D -m 755 mkarchiso $(DESTDIR)/usr/sbin/mkarchiso # testiso can be used by anyone @@ -12,11 +14,16 @@ install: all install -D -m 644 install/archiso_pxe_nbd $(DESTDIR)/lib/initcpio/install/archiso_pxe_nbd install -D -m 644 hooks/archiso_loop_mnt $(DESTDIR)/lib/initcpio/hooks/archiso_loop_mnt install -D -m 644 install/archiso_loop_mnt $(DESTDIR)/lib/initcpio/install/archiso_loop_mnt - # install docs and examples + +install-examples: + # install examples install -d -m 755 $(DESTDIR)/usr/share/archiso/ cp -r ../configs $(DESTDIR)/usr/share/archiso/configs - install -D -m 644 ../README $(DESTDIR)/usr/share/doc/archiso/README +install-doc: + install -d -m 755 $(DESTDIR)/usr/share/archiso/ + install -D -m 644 ../README $(DESTDIR)/usr/share/doc/archiso/README + uninstall: rm -f $(DESTDIR)/usr/sbin/mkarchiso rm -f $(DESTDIR)/usr/bin/testiso @@ -25,4 +32,5 @@ uninstall: rm -f $(DESTDIR)/lib/initcpio/hooks/archiso_pxe_nbd rm -f $(DESTDIR)/lib/initcpio/install/archiso_pxe_nbd rm -rf $(DESTDIR)/usr/share/archiso/ - rm -rf $(DESTDIR)/usr/share/doc/archiso/ + +.PHONY: install install-program install-examples install-doc uninstall diff --git a/archiso/hooks/archiso b/archiso/hooks/archiso index a129b20..b81bbf7 100644 --- a/archiso/hooks/archiso +++ b/archiso/hooks/archiso @@ -1,158 +1,165 @@ -# args: source, mountpoint -_mnt_aufs() { - src="${1}" - mnt="${2}" - msg "::: Adding new aufs branch: ${src} to ${mnt}" - mkdir -p "${mnt}" - /bin/mount -t aufs -o remount,append:"${src}"=ro none "${mnt}" +# Initialize loopback device logic (we using on-demand mode) +# args: none +_init_loop_dev() { + loop_dev_cnt=99 +} + +# Call this function before _make_loop_dev() each time. +# args: none +_next_loop_dev() { + loop_dev_cnt=$((loop_dev_cnt+1)) +} + +# Setup a loopback device for image passed as arguemnt and echo the path to loopback device used. +# args: /path/to/image_file +_make_loop_dev() { + local img="${1}" + mknod /dev/loop${loop_dev_cnt} b 7 ${loop_dev_cnt} &> /dev/null + losetup /dev/loop${loop_dev_cnt} "${img}" &> /dev/null + echo /dev/loop${loop_dev_cnt} } # args: source, mountpoint -_mnt_bind() { - src="${1}" - mnt="${2}" - msg "::: Binding ${src} to ${mnt}" +_mnt_fs() { + local img="${1}" + local mnt="${2}" + local img_fullname="${img##*/}"; + local img_name="${img_fullname%%.*}" + local ro_dev ro_dev_size ro_dev_fs_type rw_dev + mkdir -p "${mnt}" - /bin/mount -o bind "${src}" "${mnt}" + + _next_loop_dev + ro_dev=$(_make_loop_dev "${img}") + ro_dev_size=$(blockdev --getsz ${ro_dev}) + ro_dev_fs_type=$(blkid -o value -s TYPE -p ${ro_dev} 2> /dev/null) + + dd of="/cowspace/${img_name}.cow" count=0 seek=${ro_dev_size} &> /dev/null + _next_loop_dev + rw_dev=$(_make_loop_dev "/cowspace/${img_name}.cow") + + echo "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} N 8" | dmsetup create ${img_name} + + msg ":: Mounting '/dev/mapper/${img_name}' (${ro_dev_fs_type}) to '${mnt}'" + if ! mount -t "${ro_dev_fs_type}" "/dev/mapper/${img_name}" "${mnt}" ; then + echo "ERROR: while mounting '/dev/mapper/${img_name}' to '${mnt}'" + launch_interactive_shell + fi } # args: /path/to/image_file, mountpoint -_mnt_squashfs() { - img="${1}" - mnt="${2}" - img_fullname="${img##*/}"; - img_name="${img_fullname%.*}" - tmp_mnt="/ro_branch/${img_name}" - - if [ "${copytoram}" = "y" ]; then +_mnt_sfs() { + local img="${1}" + local mnt="${2}" + local img_fullname="${img##*/}"; + + mkdir -p "${mnt}" + + if [[ "${copytoram}" == "y" ]]; then msg -n ":: Copying squashfs image to RAM..." - /bin/cp "${img}" "/copytoram/${img_fullname}" - if [ $? -ne 0 ]; then - echo "ERROR: while copy ${img} to /copytoram/${img_fullname}" + if ! cp "${img}" "/copytoram/${img_fullname}" ; then + echo "ERROR: while copy '${img}' to '/copytoram/${img_fullname}'" launch_interactive_shell fi img="/copytoram/${img_fullname}" msg "done." fi - - mkdir -p "${tmp_mnt}" - /bin/mount -r -t squashfs "${img}" "${tmp_mnt}" - if [ $? -ne 0 ]; then - echo "ERROR: while mounting ${img} to ${tmp_mnt}" + _next_loop_dev + msg ":: Mounting '${img}' (SquashFS) to '${mnt}'" + if ! mount -r -t squashfs $(_make_loop_dev "${img}") "${mnt}" &> /dev/null ; then + echo "ERROR: while mounting '${img}' to '${mnt}'" launch_interactive_shell fi - - if [ "/${mnt#/*/}" = "/" ]; then - _mnt_aufs "${tmp_mnt}" "${mnt}" - else - _mnt_bind "${tmp_mnt}" "${mnt}" - fi } run_hook() { - if [ "x${arch}" = "x" ]; then - arch="$(uname -m)" - fi - - if [ "x${rw_branch_size}" = "x" ]; then - rw_branch_size="75%" - fi - - if [ "x${copytoram_size}" = "x" ]; then - copytoram_size="75%" - fi - - if [ "x${archisobasedir}" = "x" ]; then - archisobasedir="arch" - fi - - if [ "x${isomounts}" != "x" ]; then - isomounts="/bootmnt/${isomounts}" + [[ -z "${arch}" ]] && arch="$(uname -m)" + [[ -z "${cowspace_size}" ]] && cowspace_size="75%" + [[ -z "${copytoram_size}" ]] && copytoram_size="75%" + [[ -z "${archisobasedir}" ]] && archisobasedir="arch" + [[ -z "${archisodevice}" ]] && archisodevice="/dev/disk/by-label/${archisolabel}" + if [[ -z "${aitab}" ]]; then + aitab="/bootmnt/${archisobasedir}/aitab" else - isomounts="/bootmnt/${archisobasedir}/isomounts" + aitab="/bootmnt/${aitab}" fi - - if [ "x${archisodevice}" = "x" ]; then - archisodevice="/dev/disk/by-label/${archisolabel}" - fi - # set mount handler for archiso mount_handler="archiso_mount_handler" } +# This function is called normally from init script, but it can be called +# as chain from other mount handlers. +# args: /path/to/newroot archiso_mount_handler() { - newroot="${1}" + local newroot="${1}" + local fstype fserror + + _init_loop_dev msg ":: Waiting for boot device..." - while ! poll_device ${archisodevice} 30; do + while ! poll_device "${archisodevice}" 30; do echo "ERROR: boot device didn't show up after 30 seconds..." echo " Falling back to interactive prompt" echo " You can try to fix the problem manually, log out when you are finished" launch_interactive_shell done - FSTYPE=$(blkid -o value -s TYPE -p ${archisodevice} 2> /dev/null) - if [ -n "${FSTYPE}" ]; then - if mount -r -t "${FSTYPE}" ${archisodevice} /bootmnt > /dev/null 2>&1; then - if [ -e "${isomounts}" ]; then - echo "SUCCESS: Mounted archiso volume successfully." - fserror="0" + fstype=$(blkid -o value -s TYPE -p "${archisodevice}" 2> /dev/null) + if [[ -n "${fstype}" ]]; then + if mount -r -t "${fstype}" "${archisodevice}" /bootmnt; then + if [[ -f "${aitab}" ]]; then + msg ":: Mounted archiso volume successfully." + fserror=0 else - echo "ERROR: Mounting was successful, but the ${isomounts} file does not exist." - fserror="1" + echo "ERROR: Mounting was successful, but the '${aitab}' file does not exist." + fserror=1 fi else - echo "ERROR; Failed to mount ${archisodevice} (FS is ${FSTYPE})" - fserror="1" + echo "ERROR; Failed to mount '${archisodevice}' (FS is ${fstype})" + fserror=1 fi else - echo "ERROR: ${archisodevice} found, but the filesystem type is unknown." - fserror="1" + echo "ERROR: '${archisodevice}' found, but the filesystem type is unknown." + fserror=1 fi - if [ "${fserror}" = "1" ]; then + if [[ ${fserror} -eq 1 ]]; then echo " Falling back to interactive prompt" echo " You can try to fix the problem manually, log out when you are finished" launch_interactive_shell fi - if [ "${copytoram}" = "y" ]; then + if [[ "${copytoram}" == "y" ]]; then msg -n ":: Mounting /copytoram (tmpfs) filesystem, size=${copytoram_size}..." mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /copytoram msg "done." fi - msg -n ":: Mounting rw_branch (tmpfs) filesystem, size=${rw_branch_size}..." - mount -t tmpfs -o "size=${rw_branch_size}",mode=0755 rw_branch /rw_branch + msg -n ":: Mounting /cowspace (tmpfs) filesystem, size=${cowspace_size}..." + mount -t tmpfs -o "size=${cowspace_size}",mode=0755 cowspace /cowspace msg "done." - msg ":: Mounting root (aufs) filesystem" - /bin/mount -t aufs -o dirs=/rw_branch=rw union "${newroot}" - if [ $? -ne 0 ]; then - echo "ERROR: while mounting root (aufs) filesystem." - launch_interactive_shell - fi - - msg ":: Mounting images" - while read img imgarch mountpoint type; do - # check if this line is a comment (starts with #) - [ "${img#"#"}" != "${img}" ] && continue - - [ "$imgarch" != "$arch" ] && continue - - [ ! -r "/bootmnt/${archisobasedir}/${img}" ] && continue - - if [ "${type}" = "bind" ]; then - _mnt_bind "/bootmnt/${archisobasedir}/${img}" "${newroot}${mountpoint}" - elif [ "${type}" = "squashfs" ]; then - _mnt_squashfs "/bootmnt/${archisobasedir}/${img}" "${newroot}${mountpoint}" + local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size + while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do + [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue + [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue + if [[ "${aitab_fs_type}" != "none" ]]; then + if [[ "${aitab_sfs_comp}" != "none" ]]; then + _mnt_sfs "/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/sfs/${aitab_img}" + _mnt_fs "/sfs/${aitab_img}/${aitab_img}.fs" "${newroot}${aitab_mnt}" + else + _mnt_fs "/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.fs" "${newroot}${aitab_mnt}" + fi + else + _mnt_sfs "/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.sfs" "${newroot}${aitab_mnt}" fi - done < "${isomounts}" + done < "${aitab}" - if [ "${copytoram}" = "y" ]; then - /bin/umount /bootmnt + if [[ "${copytoram}" == "y" ]]; then + umount /bootmnt else - _mnt_bind /bootmnt "${newroot}/bootmnt" + mkdir "${newroot}/bootmnt" + mount --bind /bootmnt "${newroot}/bootmnt" fi } diff --git a/archiso/install/archiso b/archiso/install/archiso index 7ad9d06..3ac6246 100644 --- a/archiso/install/archiso +++ b/archiso/install/archiso @@ -1,25 +1,28 @@ install () { - MODULES="cdrom ide-cd_mod ide-core ide-generic aufs squashfs isofs loop $(all_modules '/kernel/fs' | grep -v "nls") " - MODULES="${MODULES} $(checked_modules "/usb/host" | grep -ve "_cs" -e "sl811-hcd" -e "isp116x-hcd")" - MODULES=$(echo ${MODULES}) #trim whitespace - if [ "x${MODULES}" != "x" ]; then - MODULES="${MODULES} usb_storage sd_mod sr_mod" - fi + MODULES="cdrom ide-cd_mod ide-core ide-generic loop dm-mod dm-snapshot squashfs isofs $(all_modules '/kernel/fs' | grep -v "nls")" + MODULES="${MODULES} $(checked_modules "/usb/host" | grep -ve "_cs" -e "sl811_hcd" -e "isp116x_hcd")" + MODULES="${MODULES} usb_storage sd_mod sr_mod" MODULES="${MODULES} virtio_pci virtio_blk" + MODULES=$(echo ${MODULES}) #trim whitespace BINARIES="" FILES="" - add_dir /rw_branch - add_dir /ro_branch + + add_dir /cowspace add_dir /copytoram add_dir /bootmnt - add_device /lib/udev/devices/loop0 b 7 0 - add_binary /lib/udev/cdrom_id + add_binary /sbin/blockdev + add_binary /sbin/lvm + add_binary /sbin/dmsetup add_file /lib/udev/rules.d/60-cdrom_id.rules + add_file /lib/udev/rules.d/10-dm.rules + add_file /lib/udev/rules.d/13-dm-disk.rules + add_file /lib/udev/rules.d/95-dm-notify.rules + add_file /lib/udev/rules.d/11-dm-lvm.rules SCRIPT="archiso" } diff --git a/archiso/install/archiso_pxe_nbd b/archiso/install/archiso_pxe_nbd index fbf43c6..189a7b1 100644 --- a/archiso/install/archiso_pxe_nbd +++ b/archiso/install/archiso_pxe_nbd @@ -2,8 +2,12 @@ install () { - MODULES="nbd $(checked_modules "/drivers/net/" | grep -v -e "/irda/" -e "/phy/" -e "/plip" -e "/ppp" -e "/wimax/" -e "/wireless/") " - + MODULES="nbd" + MODULES="${MODULES} $(comm -2 -3 <(checked_modules "/drivers/net/" | sort) \ + <(find $MODULEDIR/kernel/drivers/net/{irda,phy,wimax,wireless} \ + -name '*.ko*' \ + -exec bash -c 'printf "%s\n" "${@%%.ko*}" | sed "s@.*/@@;s@-@_@" | sort' _ {} +) \ + | grep -v -e 'ppp_' -e 'plip' -e 'pppoe')" BINARIES="" FILES="" SCRIPT="archiso_pxe_nbd" diff --git a/archiso/mkarchiso b/archiso/mkarchiso index a165d03..92b2a26 100755 --- a/archiso/mkarchiso +++ b/archiso/mkarchiso @@ -1,254 +1,439 @@ #!/bin/bash -PKGLIST="" -QUIET="y" -FORCE="n" -PACCONFIG="/etc/pacman.conf" -export LABEL="ARCH_$(date +%Y%m)" -PUBLISHER="Arch Linux " -APPLICATION="Arch Linux Live/Rescue CD" -COMPRESSION="xz" -CREATE_DEFAULT="n" -INSTALL_DIR="arch" - -APPNAME=$(basename "${0}") -ARCH=$(uname -m) - -# usage: usage -usage () +set -e -u + +app_name=${0##*/} +arch=$(uname -m) +pkg_list="" +quiet="y" +pacman_conf="/etc/pacman.conf" +export iso_label="ARCH_$(date +%Y%m)" +iso_publisher="Arch Linux " +iso_application="Arch Linux Live/Rescue CD" +install_dir="arch" + +# Show an INFO message +# $1: message string +_msg_info() { + local _msg="${1}" + echo "[mkarchiso] INFO: ${_msg}" +} + +# Show an ERROR message then exit with status +# $1: message string +# $2: exit code number (with 0 does not exit) +_msg_error() { + local _msg="${1}" + local _error=${2} + echo + echo "[mkarchiso] ERROR: ${_msg}" + echo + if [[ ${_error} -gt 0 ]]; then + exit ${_error} + fi +} + +# Show space usage similar to df, but better formatted. +# $1: mount-point or mounted device. +_show_space_usage () { + local _where="${1}" + local _fs _total _used _avail _pct_u=0 _mnt + read _fs _total _used _avail _pct_u _mnt < <(df -m "${_where}" | tail -1) &> /dev/null + _msg_info "Total: ${_total} MiB (100%) | Used: ${_used} MiB (${_pct_u}) | Avail: ${_avail} MiB ($((100 - ${_pct_u%\%}))%)" +} + +# Mount a filesystem (trap signals in case of error for unmounting it +# $1: source image +# $2: mount-point +_mount_fs() { + local _src="${1}" + local _dst="${2}" + trap "_umount_fs ${_src}" EXIT HUP INT TERM + mkdir -p "${_dst}" + _msg_info "Mounting '${_src}' on '${_dst}'" + mount "${_src}" "${_dst}" + _show_space_usage "${_dst}" +} + +# Unmount a filesystem (and untrap signals) +# $1: mount-point or device/image +_umount_fs() { + local _dst="${1}" + _show_space_usage "${_dst}" + _msg_info "Unmounting '${_dst}'" + umount "${_dst}" + rmdir "${_dst}" + trap - EXIT HUP INT TERM +} + +# Compare if a file/directory (source) is newer than other file (target) +# $1: source file/directory +# $2: target file +# return: 0 if target does not exists or if target is older than source. +# 1 if target is newer than source +_is_directory_changed() { + local _src="${1}" + local _dst="${2}" + + if [ -e "${_dst}" ]; then + if [[ $(find ${_src} -newer ${_dst} | wc -l) -gt 0 ]]; then + _msg_info "Target '${_dst}' is older than '${_src}', updating." + rm -f "${_dst}" + return 0 + else + _msg_info "Target '${_dst}' is up to date with '${_src}', skipping." + return 1 + fi + else + _msg_info "Target '${_dst}' does not exist, making it from '${_src}'" + return 0 + fi +} + +# Show help usage, with an exit status. +# $1: exit status number. +_usage () { - echo "usage ${APPNAME} [options] command " + echo "usage ${app_name} [options] command " echo " general options:" - echo " -f Force overwrite of working files/squashfs image/bootable image" - echo " -p PACKAGE(S) Additional package(s) to install, can be used multiple times" - echo " -C Config file for pacman. Default $PACCONFIG" + echo " -p PACKAGE(S) Package(s) to install, can be used multiple times" + echo " -C Config file for pacman. Default ${pacman_conf}" echo " -L