*: refactor
Documentation will be rewritten and added later.
This commit is contained in:
		
							
								
								
									
										34
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,29 +1,21 @@ | ||||
| .POSIX: | ||||
|  | ||||
| PREFIX = /usr | ||||
| PREFIX = /usr/local | ||||
| BINDIR = ${PREFIX}/bin | ||||
| DATADIR = ${PREFIX}/share | ||||
| MANDIR = ${PREFIX}/share/man | ||||
| LIBDIR = ${PREFIX}/lib | ||||
|  | ||||
| install: | ||||
| 	mkdir -p ${DESTDIR}${DATADIR}/tinyramfs \ | ||||
| 		     ${DESTDIR}${MANDIR}/man5 \ | ||||
| 		     ${DESTDIR}${MANDIR}/man8 \ | ||||
| 		     ${DESTDIR}${MANDIR}/man7 \ | ||||
| 		     ${DESTDIR}${BINDIR} | ||||
| 	cp -R hooks      ${DESTDIR}${DATADIR}/tinyramfs | ||||
| 	cp device-helper ${DESTDIR}${DATADIR}/tinyramfs | ||||
| 	cp init          ${DESTDIR}${DATADIR}/tinyramfs | ||||
| 	cp tinyramfs     ${DESTDIR}${BINDIR}/tinyramfs | ||||
| 	cp docs/tinyramfs.8 ${DESTDIR}${MANDIR}/man8 | ||||
| 	cp docs/tinyramfs.hooks.7 ${DESTDIR}${MANDIR}/man7 | ||||
| 	cp docs/tinyramfs.cmdline.7 ${DESTDIR}${MANDIR}/man7 | ||||
| 	cp docs/tinyramfs.config.5 ${DESTDIR}${MANDIR}/man5 | ||||
| 	mkdir -p ${DESTDIR}${BINDIR} | ||||
| 	mkdir -p ${DESTDIR}${LIBDIR}/tinyramfs | ||||
| 	cp -f tinyramfs     ${DESTDIR}${BINDIR}/ | ||||
| 	cp -f lib/init.sh   ${DESTDIR}${LIBDIR}/tinyramfs/ | ||||
| 	cp -f lib/helper.sh ${DESTDIR}${LIBDIR}/tinyramfs/ | ||||
| 	cp -f lib/common.sh ${DESTDIR}${LIBDIR}/tinyramfs/ | ||||
| 	cp -R hook          ${DESTDIR}${LIBDIR}/tinyramfs/hook.d | ||||
|  | ||||
| uninstall: | ||||
| 	rm -f  ${DESTDIR}${BINDIR}/tinyramfs | ||||
| 	rm -rf ${DESTDIR}${DATADIR}/tinyramfs | ||||
| 	rm -f  ${DESTDIR}${MANDIR}/man8/tinyramfs.8 | ||||
| 	rm -f  ${DESTDIR}${MANDIR}/man7/tinyramfs.hooks.7 | ||||
| 	rm -f  ${DESTDIR}${MANDIR}/man7/tinyramfs.cmdline.7 | ||||
| 	rm -f  ${DESTDIR}${MANDIR}/man5/tinyramfs.config.5 | ||||
| 	rm -rf ${DESTDIR}${LIBDIR}/tinyramfs | ||||
|  | ||||
| check: | ||||
| 	(cd test && ./check.sh) | ||||
|   | ||||
| @@ -1,91 +0,0 @@ | ||||
| .\" Generated by scdoc 1.11.1 | ||||
| .\" Complete documentation for this program is not available as a GNU info page | ||||
| .ie \n(.g .ds Aq \(aq | ||||
| .el       .ds Aq ' | ||||
| .nh | ||||
| .ad l | ||||
| .\" Begin generated content: | ||||
| .TH "tinyramfs" "8" "2021-05-10" | ||||
| .P | ||||
| .SH NAME | ||||
| .P | ||||
| Tinyramfs - tiny initramfs written in POSIX shell | ||||
| .P | ||||
| .SH SYNOPSIS | ||||
| .P | ||||
| \fBtinyramfs\fR [option].\&.\&.\& | ||||
| .P | ||||
| .SH DESCRIPTION | ||||
| .P | ||||
| Tinyramfs is a simple, extensible and modular initramfs generator tool written | ||||
| with focus on portability.\& | ||||
| .P | ||||
| .SH OPTIONS | ||||
| .P | ||||
| \fB-o\fR, \fB--output\fR <file> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify output location where initramfs image will be stored.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-c\fR, \fB--config\fR <file> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify config location.\& Default is \fB/etc/tinyramfs/config\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-k\fR, \fB--kernel\fR <version> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify kernel version.\& Useful for bootstraping future system with modular | ||||
| kernel.\& Default is current kernel version.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-m\fR, \fB--modules\fR <directory> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify directory where modules stored.\& Default is \fB/lib/modules\fR.\& | ||||
| This option has no effect if \fBmonolith\fR or \fBhostonly\fR were enabled in config.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-H\fR, \fB--hooks\fR <directory> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify additional hooks location.\& Default is \fB/usr/share/tinyramfs/hooks\fR | ||||
| and \fB/etc/tinyramfs/hooks\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-D\fR, \fB--helper\fR <file> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify location to device helper.\& Default is \fB/usr/share/tinyramfs/device-helper\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-I\fR, \fB--init\fR <file> | ||||
| .P | ||||
| .RS 4 | ||||
| Specify location to init script.\& Default is \fB/usr/share/tinyramfs/init\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-d\fR, \fB--debug\fR | ||||
| .P | ||||
| .RS 4 | ||||
| Enable debug mode.\& Useful for reporting bugs in build stage.\& | ||||
| .P | ||||
| .RE | ||||
| \fB-f\fR, \fB--force\fR | ||||
| .P | ||||
| .RS 4 | ||||
| Forcefully overwrite initramfs image.\& | ||||
| .P | ||||
| .RE | ||||
| .SH NOTES | ||||
| .P | ||||
| If you have modular kernel and you use \fBbusybox modrobe\fR to handle modules, you | ||||
| must note that \fBbusybox modprobe\fR doesn't have ability to install soft | ||||
| dependencies of modules (i.\&e modules.\&softdep).\& You must install them yourself | ||||
| using hooks.\& See \fBtinyramfs.\&hooks\fR(7) how to do it.\& | ||||
| .P | ||||
| .SH SEE ALSO | ||||
| .P | ||||
| \fBtinyramfs.\&config\fR(5) \fBtinyramfs.\&cmdline\fR(7) \fBtinyramfs.\&hooks\fR(7) | ||||
| @@ -1,66 +0,0 @@ | ||||
| tinyramfs(8) | ||||
|  | ||||
| # NAME | ||||
|  | ||||
| Tinyramfs - tiny initramfs written in POSIX shell | ||||
|  | ||||
| # SYNOPSIS | ||||
|  | ||||
| *tinyramfs* [option]... | ||||
|  | ||||
| # DESCRIPTION | ||||
|  | ||||
| Tinyramfs is a simple, extensible and modular initramfs generator tool written | ||||
| with focus on portability. | ||||
|  | ||||
| # OPTIONS | ||||
|  | ||||
| *-o*, *--output* <file> | ||||
|  | ||||
| 	Specify output location where initramfs image will be stored. | ||||
|  | ||||
| *-c*, *--config* <file> | ||||
|  | ||||
| 	Specify config location. Default is */etc/tinyramfs/config*. | ||||
|  | ||||
| *-k*, *--kernel* <version> | ||||
|  | ||||
| 	Specify kernel version. Useful for bootstraping future system with modular | ||||
| 	kernel. Default is current kernel version. | ||||
|  | ||||
| *-m*, *--modules* <directory> | ||||
|  | ||||
| 	Specify directory where modules stored. Default is */lib/modules*. | ||||
| 	This option has no effect if *monolith* or *hostonly* were enabled in config. | ||||
|  | ||||
| *-H*, *--hooks* <directory> | ||||
|  | ||||
| 	Specify additional hooks location. Default is */usr/share/tinyramfs/hooks* | ||||
| 	and */etc/tinyramfs/hooks*. | ||||
| 	 | ||||
| *-D*, *--helper* <file> | ||||
|  | ||||
| 	Specify location to device helper. Default is */usr/share/tinyramfs/device-helper*. | ||||
|  | ||||
| *-I*, *--init* <file> | ||||
|  | ||||
| 	Specify location to init script. Default is */usr/share/tinyramfs/init*. | ||||
|  | ||||
| *-d*, *--debug* | ||||
|  | ||||
| 	Enable debug mode. Useful for reporting bugs in build stage. | ||||
|  | ||||
| *-f*, *--force* | ||||
|  | ||||
| 	Forcefully overwrite initramfs image. | ||||
|  | ||||
| # NOTES | ||||
|  | ||||
| If you have modular kernel and you use *busybox modrobe* to handle modules, you | ||||
| must note that *busybox modprobe* doesn't have ability to install soft | ||||
| dependencies of modules (i.e modules.softdep). You must install them yourself | ||||
| using hooks. See *tinyramfs.hooks*(7) how to do it. | ||||
|  | ||||
| # SEE ALSO | ||||
|  | ||||
| *tinyramfs.config*(5) *tinyramfs.cmdline*(7) *tinyramfs.hooks*(7) | ||||
| @@ -1,213 +0,0 @@ | ||||
| .\" Generated by scdoc 1.11.0 | ||||
| .\" Complete documentation for this program is not available as a GNU info page | ||||
| .ie \n(.g .ds Aq \(aq | ||||
| .el       .ds Aq ' | ||||
| .nh | ||||
| .ad l | ||||
| .\" Begin generated content: | ||||
| .TH "tinyramfs.cmdline" "7" "2020-09-10" | ||||
| .P | ||||
| .SH NAME | ||||
| .P | ||||
| Tinyramfs - kernel command-line parameters | ||||
| .P | ||||
| .SH DESCRIPTION | ||||
| .P | ||||
| Tinyramfs provides a way to control configuration dynamically via | ||||
| kernel parameters without needing to regenerate initramfs image.\&  | ||||
| .P | ||||
| .SS MAN PAGE SYNTAX | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| |   - OR | ||||
| \&.\&.\&. - can be repeated | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH GENERAL PARAMETERS | ||||
| .P | ||||
| \fBdebug\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Enable debug mode.\& | ||||
| .P | ||||
| .RE | ||||
| \fBbreak\fR=breakpoint | ||||
| .P | ||||
| .RS 4 | ||||
| Specify breakpoint where shell should be invoked.\& Useful for | ||||
| debugging.\& List of builtin breakpoints: | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| root | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| boot | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| Hooks can provide their own breakpoints.\& See source code of hooks | ||||
| for more information.\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot\fR=UUID|LABEL|/dev/*|PARTUUID | ||||
| .P | ||||
| .RS 4 | ||||
| Specify which way tinyramfs will use to look up root filesystem.\& | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| UUID     - lookup device by uuid | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| LABEL    - lookup device by label | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| /dev/*   - lookup device by full path | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| PARTUUID - lookup device by partition uuid | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| Initramfs must contain \fBblkid\fR(8) for ability to use UUID, LABEL, | ||||
| PARTUUID.\& Note that PARTUUID only supported in util-linux \fBblkid\fR(8).\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot_type\fR|\fBrootfstype\fR=type | ||||
| .P | ||||
| .RS 4 | ||||
| Explicitly set root filesystem type.\& Kernel must support specified type.\& | ||||
| .P | ||||
| .RE | ||||
| \fBrootdelay\fR=delay | ||||
| .P | ||||
| .RS 4 | ||||
| Specify maximum number of seconds to wait for root device.\& Default is 30.\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot_opts\fR|\fBrootflags\fR=opts | ||||
| .RS 4 | ||||
| .P | ||||
| See \fBfstab\fR(5) fourth field.\& | ||||
| .P | ||||
| .RE | ||||
| .SH HOOKS PARAMETERS | ||||
| .P | ||||
| Initramfs must contain appropriate hooks for ability to use below parameters.\& | ||||
| .P | ||||
| .SS LVM | ||||
| .P | ||||
| \fBlvm_tag\fR=tag | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM tag which will be used to trigger LVM.\& This option will be | ||||
| ignored if \fBlvm_name\fR/\fBlvm_group\fR was specified.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_name\fR=name | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM name which will be used to trigger LVM.\& \fBlvm_group\fR must be | ||||
| specified.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_group\fR=group | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM group which will be used to trigger LVM.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_discard\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Pass issue_discards to lvm.\& Leave empty to disable.\& Useful for SSD's.\& | ||||
| .P | ||||
| .RE | ||||
| .SS LUKS | ||||
| .P | ||||
| \fBluks_name\fR=name | ||||
| .P | ||||
| .RS 4 | ||||
| Specify which name will be registered to mapping table after cryptsetup | ||||
| unlocks LUKS root.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_root\fR=UUID|LABEL|/dev/*|PARTUUID | ||||
| .P | ||||
| .RS 4 | ||||
| See \fBroot\fR for details.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_discard\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Pass --allow-discards to \fBcryptsetup\fR.\& Leave empty to disable.\& Useful for | ||||
| SSD's, but you must know that security will be decreased.\& | ||||
| .P | ||||
| .RE | ||||
| .SH EXAMPLES | ||||
| .P | ||||
| .SS ROOT | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| vmlinuz initrd=initramfs root=/dev/sda1 \&.\&.\&. | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS DISABLE DISCARD | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| vmlinuz initrd=\\initramfs luks_discard= lvm_discard= \&.\&.\&. | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS PASS ARGUMENTS TO REAL INIT | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| vmlinuz initrd=\\initramfs \&.\&.\&. -- args | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH SEE ALSO | ||||
| .P | ||||
| \fBtinyramfs\fR(8) \fBtinyramfs.\&config\fR(5) \fBtinyramfs.\&hooks\fR(7) | ||||
| @@ -1,122 +0,0 @@ | ||||
| tinyramfs.cmdline(7) | ||||
|  | ||||
| # NAME | ||||
|  | ||||
| Tinyramfs - kernel command-line parameters | ||||
|  | ||||
| # DESCRIPTION | ||||
|  | ||||
| Tinyramfs provides a way to control configuration dynamically via | ||||
| kernel parameters without needing to regenerate initramfs image.  | ||||
|  | ||||
| ## MAN PAGE SYNTAX | ||||
|  | ||||
| ``` | ||||
| |   - OR | ||||
| ... - can be repeated | ||||
| ``` | ||||
|  | ||||
| # GENERAL PARAMETERS | ||||
|  | ||||
| *debug*=1 | ||||
|  | ||||
| 	Enable debug mode. | ||||
|  | ||||
| *break*=breakpoint | ||||
|  | ||||
| 	Specify breakpoint where shell should be invoked. Useful for | ||||
| 	debugging. List of builtin breakpoints: | ||||
|  | ||||
| 	- root | ||||
| 	- boot | ||||
|  | ||||
| 	Hooks can provide their own breakpoints. See source code of hooks | ||||
| 	for more information. | ||||
|  | ||||
| *root*=UUID|LABEL|/dev/\*|PARTUUID | ||||
|  | ||||
| 	Specify which way tinyramfs will use to look up root filesystem. | ||||
|  | ||||
| 	- UUID     - lookup device by uuid | ||||
| 	- LABEL    - lookup device by label | ||||
| 	- /dev/\*   - lookup device by full path | ||||
| 	- PARTUUID - lookup device by partition uuid | ||||
|  | ||||
| 	Initramfs must contain *blkid*(8) for ability to use UUID, LABEL, | ||||
| 	PARTUUID. Note that PARTUUID only supported in util-linux *blkid*(8). | ||||
|  | ||||
| *root_type*|*rootfstype*=type | ||||
|  | ||||
| 	Explicitly set root filesystem type. Kernel must support specified type. | ||||
| 	 | ||||
| *rootdelay*=delay | ||||
|  | ||||
| 	Specify maximum number of seconds to wait for root device. Default is 30. | ||||
|  | ||||
| *root_opts*|*rootflags*=opts | ||||
| 	 | ||||
| 	See *fstab*(5) fourth field. | ||||
|  | ||||
| # HOOKS PARAMETERS | ||||
|  | ||||
| Initramfs must contain appropriate hooks for ability to use below parameters. | ||||
|  | ||||
| ## LVM | ||||
|  | ||||
| *lvm_tag*=tag | ||||
|  | ||||
| 	Specify LVM tag which will be used to trigger LVM. This option will be | ||||
| 	ignored if *lvm_name*/*lvm_group* was specified. | ||||
|  | ||||
| *lvm_name*=name | ||||
|  | ||||
| 	Specify LVM name which will be used to trigger LVM. *lvm_group* must be | ||||
| 	specified. | ||||
|  | ||||
| *lvm_group*=group | ||||
|  | ||||
| 	Specify LVM group which will be used to trigger LVM. | ||||
|  | ||||
| *lvm_discard*=1 | ||||
|  | ||||
| 	Pass issue_discards to lvm. Leave empty to disable. Useful for SSD's. | ||||
|  | ||||
| ## LUKS | ||||
|  | ||||
| *luks_name*=name | ||||
|  | ||||
| 	Specify which name will be registered to mapping table after cryptsetup | ||||
| 	unlocks LUKS root. | ||||
|  | ||||
| *luks_root*=UUID|LABEL|/dev/\*|PARTUUID | ||||
|  | ||||
| 	See *root* for details. | ||||
|  | ||||
| *luks_discard*=1 | ||||
|  | ||||
| 	Pass --allow-discards to *cryptsetup*. Leave empty to disable. Useful for | ||||
| 	SSD's, but you must know that security will be decreased. | ||||
|  | ||||
| # EXAMPLES | ||||
|  | ||||
| ## ROOT | ||||
|  | ||||
| ``` | ||||
| vmlinuz initrd=\initramfs root=/dev/sda1 ... | ||||
| ``` | ||||
|  | ||||
| ## DISABLE DISCARD | ||||
|  | ||||
| ``` | ||||
| vmlinuz initrd=\\initramfs luks_discard= lvm_discard= ... | ||||
| ``` | ||||
|  | ||||
| ## PASS ARGUMENTS TO REAL INIT | ||||
|  | ||||
| ``` | ||||
| vmlinuz initrd=\\initramfs ... -- args | ||||
| ``` | ||||
|  | ||||
| # SEE ALSO | ||||
|  | ||||
| *tinyramfs*(8) *tinyramfs.config*(5) *tinyramfs.hooks*(7) | ||||
| @@ -1,469 +0,0 @@ | ||||
| .\" Generated by scdoc 1.11.0 | ||||
| .\" Complete documentation for this program is not available as a GNU info page | ||||
| .ie \n(.g .ds Aq \(aq | ||||
| .el       .ds Aq ' | ||||
| .nh | ||||
| .ad l | ||||
| .\" Begin generated content: | ||||
| .TH "tinyramfs.config" "5" "2020-09-07" | ||||
| .P | ||||
| .SH NAME | ||||
| .P | ||||
| Tinyramfs - configuration file | ||||
| .P | ||||
| .SH SYNOPSIS | ||||
| .P | ||||
| \fB/etc/tinyramfs/config\fR | ||||
| .P | ||||
| .SH DESCRIPTION | ||||
| .P | ||||
| Tinyramfs configuration file is a list of environment variables.\& | ||||
| Each variable must be written in POSIX way, bashism not allowed.\& | ||||
| .P | ||||
| Example: | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| key=value | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| If value contains spaces it must must be quoted.\& | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| key="value value2" | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| If value contains special symbols like $, it must be escaped | ||||
| or quoted using single quotes.\& | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| key=\\$value | ||||
| key='$value' | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| If line exceeded maximum space on your display and you want to make it | ||||
| more readable, you can concatenate them.\& | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| key=value | ||||
| key="${key}value" | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| If you want to temporary undefine variable without actually deleting it, | ||||
| you can simply prepend #.\& | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| #key=value | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS MAN PAGE SYNTAX | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| |   - OR | ||||
| *   - any value | ||||
| [a] - optional value | ||||
| \&.\&.\&. - can be repeated | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH GENERAL OPTIONS | ||||
| .P | ||||
| \fBmonolith\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Monolithic kernel means kernel with builtin modules.\& | ||||
| If you didn't build kernel yourself, then in most cases you have | ||||
| modular kernel and you don't need to enable this option.\& To check | ||||
| if you have monolithic you need to check if \fB/lib/modules/<kernel | ||||
| version>/modules\fR exist.\& If this directory doesn't exist you probably  | ||||
| have monolithic kernel which means you need to set \fBmonolith\fR to \fB1\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fBhostonly\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Hostonly mode enumerates \fBsysfs\fR(5) and copies only neccessary modules | ||||
| instead of copying all modules.\& Which means that this mode can dramatically | ||||
| reduce initramfs size.\& This option will be ignored if \fBmonolith\fR was set | ||||
| to \fB1\fR.\& | ||||
| .P | ||||
| .RE | ||||
| \fBcompress\fR=command [args .\&.\&.\&] | ||||
| .P | ||||
| .RS 4 | ||||
| Specify which command will be used to compress initramfs image.\& | ||||
| There is a lot of commands you can use, such as: | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| xz | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| zst (if supported by kernel) | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| gzip | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| bzip2 | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| and many more .\&.\&.\& | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| You can set compression level by specifing -[0-9] in args.\& | ||||
| For example - gzip -9.\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot\fR=UUID|LABEL|/dev/*|PARTUUID | ||||
| .P | ||||
| .RS 4 | ||||
| Specify which way tinyramfs will use to look up root filesystem.\& | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| UUID     - lookup device by uuid | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| LABEL    - lookup device by label | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| /dev/*   - lookup device by full path | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| PARTUUID - lookup device by partition uuid | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| You must install \fBblkid\fR(8) (avalable in toybox, busybox, util-linux) | ||||
| for ability to use UUID, LABEL, PARTUUID.\& Note that PARTUUID only | ||||
| supported in util-linux \fBblkid\fR(8).\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot_type\fR=type | ||||
| .P | ||||
| .RS 4 | ||||
| Explicitly set root filesystem type instead of automatically discovering via | ||||
| /proc/mounts.\& This option must be specified if you booted from Live CD.\& | ||||
| .P | ||||
| .RE | ||||
| \fBroot_opts\fR=opts | ||||
| .RS 4 | ||||
| .P | ||||
| See \fBfstab\fR(5) fourth field.\& | ||||
| .P | ||||
| .RE | ||||
| \fBhooks\fR=hook [hook .\&.\&.\&] | ||||
| .P | ||||
| .RS 4 | ||||
| Hooks provide a flexible way to extend tinyramfs with custom scripts.\& | ||||
| You must know that \fBhooks are launched in the order in which they are | ||||
| specified\fR.\& List of shipped by default hooks: | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| lvm - LVM support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| luks - LUKS support  | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| mdev - mdev support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| proc - CONFIG_UEVENT_HELPER support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| mdevd - mdevd support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| eudev - eudev support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| keymap - keymap support | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| systemd-udevd - systemd udevd support | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| See below how to use them.\& | ||||
| If hook doesn't have options, then it's not yet documented or can be used | ||||
| "as is".\& | ||||
| .P | ||||
| More detailed information and how to write your own hooks described in | ||||
| \fBtinyramfs.\&hooks\fR(7).\& | ||||
| .P | ||||
| .RE | ||||
| .SH HOOKS OPTIONS | ||||
| .P | ||||
| .SS LVM | ||||
| .P | ||||
| \fBlvm_tag\fR=tag | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM tag which will be used to trigger LVM.\& This option will be | ||||
| ignored if \fBlvm_name\fR/\fBlvm_group\fR was specified.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_name\fR=name | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM name which will be used to trigger LVM.\& \fBlvm_group\fR must be | ||||
| specified.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_group\fR=group | ||||
| .P | ||||
| .RS 4 | ||||
| Specify LVM group which will be used to trigger LVM.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_config\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Include \fB/etc/lvm/lvm.\&conf\fR in initramfs.\& | ||||
| .P | ||||
| .RE | ||||
| \fBlvm_discard\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Pass issue_discards to lvm.\& Useful for SSD's.\& | ||||
| .P | ||||
| .RE | ||||
| .SS LUKS | ||||
| .P | ||||
| \fBluks_key\fR=/path/to/key | ||||
| .RS 4 | ||||
| .P | ||||
| Specify location to key.\& | ||||
| GPG-encrypted key currently not supported.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_name\fR=name | ||||
| .P | ||||
| .RS 4 | ||||
| Specify which name will be registered to mapping table after cryptsetup | ||||
| unlocks LUKS root.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_root\fR=UUID|LABEL|/dev/*|PARTUUID | ||||
| .P | ||||
| .RS 4 | ||||
| See \fBroot\fR for details.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_header\fR=/path/to/header | ||||
| .P | ||||
| .RS 4 | ||||
| Specify location to detached header.\& | ||||
| .P | ||||
| .RE | ||||
| \fBluks_discard\fR=1 | ||||
| .P | ||||
| .RS 4 | ||||
| Pass --allow-discards to \fBcryptsetup\fR.\& Useful for SSD's, but you must know | ||||
| that security will be decreased.\& | ||||
| .P | ||||
| .RE | ||||
| .SS KEYMAP | ||||
| .P | ||||
| \fBkeymap_path\fR=/path/to/keymap | ||||
| .P | ||||
| .RS 4 | ||||
| Specify location to binary keymap.\& | ||||
| Currently, this hook supports loading keymap only via busybox loadkmap.\& | ||||
| kbd loadkeys not supported.\& | ||||
| .P | ||||
| .RE | ||||
| .SH EXAMPLES | ||||
| .P | ||||
| Remember, these just examples !\& \fIDon't copy blindly\fR !\& Your configuration may | ||||
| (and should) differ.\& | ||||
| .P | ||||
| .SS ROOT | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| hooks=eudev | ||||
| root=/dev/sda1 | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ROOT + MONOLITH + PROC (CONFIG_UEVENT_HELPER) | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| hooks=proc | ||||
| monolith=1 | ||||
| root=/dev/nvme0n1p1 | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ROOT + COMPRESS | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| hostonly=1 | ||||
| hooks=mdevd | ||||
| compress="gzip -9" | ||||
| root=PARTUUID=8e05009d-a1d5-4fdb-b407-b0e79360555c | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ROOT + KEYMAP | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| root_type=f2fs | ||||
| hooks="eudev keymap" | ||||
| root=UUID=13bcb7cc-8fe5-4f8e-a1fe-e4b5b336f3ef | ||||
| keymap_path=/usr/share/bkeymaps/colemak/en-latin9\&.bmap | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ROOT + LUKS | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| hooks="mdev luks" | ||||
| root=LABEL=my_root | ||||
|  | ||||
| luks_discard=1 | ||||
| luks_key=/root/key | ||||
| luks_header=/root/header | ||||
| luks_root=PARTUUID=35f923c5-083a-4950-a4da-e611d0778121 | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ROOT + LVM + LUKS | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| compress="lz4 -9" | ||||
| hooks="eudev lvm luks" | ||||
| root=/dev/disk/by-uuid/aa82d7bb-ab2b-4739-935f-fd8a5c9a6cb0 | ||||
|  | ||||
| luks_discard=1 | ||||
| luks_root=/dev/sdb2 | ||||
|  | ||||
| lvm_config=1 | ||||
| lvm_discard=1 | ||||
| lvm_name=lvm1 | ||||
| lvm_group=lvm_grp2 | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH SEE ALSO | ||||
| .P | ||||
| \fBtinyramfs\fR(8) \fBtinyramfs.\&cmdline\fR(7) \fBtinyramfs.\&hooks\fR(7) | ||||
| @@ -1,263 +0,0 @@ | ||||
| tinyramfs.config(5) | ||||
|  | ||||
| # NAME | ||||
|  | ||||
| Tinyramfs - configuration file | ||||
|  | ||||
| # SYNOPSIS | ||||
|  | ||||
| */etc/tinyramfs/config* | ||||
|  | ||||
| # DESCRIPTION | ||||
|  | ||||
| Tinyramfs configuration file is a list of environment variables. | ||||
| Each variable must be written in POSIX way, bashism not allowed. | ||||
|  | ||||
| Example: | ||||
|  | ||||
| ``` | ||||
| key=value | ||||
| ``` | ||||
|  | ||||
| If value contains spaces it must must be quoted. | ||||
|  | ||||
| ``` | ||||
| key="value value2" | ||||
| ``` | ||||
|  | ||||
| If value contains special symbols like $, it must be escaped | ||||
| or quoted using single quotes. | ||||
|  | ||||
| ``` | ||||
| key=\\$value | ||||
| key='$value' | ||||
| ``` | ||||
|  | ||||
| If line exceeded maximum space on your display and you want to make it | ||||
| more readable, you can concatenate them. | ||||
|  | ||||
| ``` | ||||
| key=value | ||||
| key="${key}value" | ||||
| ``` | ||||
|  | ||||
| If you want to temporary undefine variable without actually deleting it, | ||||
| you can simply prepend \#. | ||||
|  | ||||
| ``` | ||||
| #key=value | ||||
| ``` | ||||
|  | ||||
| ## MAN PAGE SYNTAX | ||||
|  | ||||
| ``` | ||||
| |   - OR | ||||
| *   - any value | ||||
| [a] - optional value | ||||
| ... - can be repeated | ||||
| ``` | ||||
|  | ||||
| # GENERAL OPTIONS | ||||
|  | ||||
| *monolith*=1 | ||||
|  | ||||
| 	Monolithic kernel means kernel with builtin modules. | ||||
| 	If you didn't build kernel yourself, then in most cases you have | ||||
| 	modular kernel and you don't need to enable this option. To check | ||||
| 	if you have monolithic you need to check if */lib/modules/<kernel | ||||
| 	version>/modules* exist. If this directory doesn't exist you probably  | ||||
| 	have monolithic kernel which means you need to set *monolith* to *1*. | ||||
|  | ||||
| *hostonly*=1 | ||||
|  | ||||
| 	Hostonly mode enumerates *sysfs*(5) and copies only neccessary modules | ||||
| 	instead of copying all modules. Which means that this mode can dramatically | ||||
| 	reduce initramfs size. This option will be ignored if *monolith* was set | ||||
| 	to *1*. | ||||
|  | ||||
| *compress*=command [args ...] | ||||
|  | ||||
| 	Specify which command will be used to compress initramfs image. | ||||
| 	There is a lot of commands you can use, such as: | ||||
|  | ||||
| 	- xz | ||||
| 	- zst (if supported by kernel) | ||||
| 	- gzip | ||||
| 	- bzip2 | ||||
| 	- and many more ... | ||||
|  | ||||
| 	You can set compression level by specifing -[0-9] in args. | ||||
| 	For example - gzip -9. | ||||
|  | ||||
| *root*=UUID|LABEL|/dev/\*|PARTUUID | ||||
|  | ||||
| 	Specify which way tinyramfs will use to look up root filesystem. | ||||
|  | ||||
| 	- UUID     - lookup device by uuid | ||||
| 	- LABEL    - lookup device by label | ||||
| 	- /dev/\*   - lookup device by full path | ||||
| 	- PARTUUID - lookup device by partition uuid | ||||
|  | ||||
| 	You must install *blkid*(8) (avalable in toybox, busybox, util-linux) | ||||
| 	for ability to use UUID, LABEL, PARTUUID. Note that PARTUUID only | ||||
| 	supported in util-linux *blkid*(8). | ||||
| 	 | ||||
| *root_type*=type | ||||
|  | ||||
| 	Explicitly set root filesystem type instead of automatically discovering via | ||||
| 	/proc/mounts. This option must be specified if you booted from Live CD. | ||||
|  | ||||
| *root_opts*=opts | ||||
| 	 | ||||
| 	See *fstab*(5) fourth field. | ||||
|  | ||||
| *hooks*=hook [hook ...] | ||||
|  | ||||
| 	Hooks provide a flexible way to extend tinyramfs with custom scripts. | ||||
| 	You must know that *hooks are launched in the order in which they are | ||||
| 	specified*. List of shipped by default hooks: | ||||
|  | ||||
| 	- lvm - LVM support | ||||
| 	- luks - LUKS support  | ||||
| 	- mdev - mdev support | ||||
| 	- proc - CONFIG_UEVENT_HELPER support | ||||
| 	- mdevd - mdevd support | ||||
| 	- eudev - eudev support | ||||
| 	- keymap - keymap support | ||||
| 	- systemd-udevd - systemd udevd support | ||||
|  | ||||
| 	See below how to use them. | ||||
| 	If hook doesn't have options, then it's not yet documented or can be used | ||||
| 	"as is". | ||||
|  | ||||
| 	More detailed information and how to write your own hooks described in | ||||
| 	*tinyramfs.hooks*(7). | ||||
|  | ||||
| # HOOKS OPTIONS | ||||
|  | ||||
| ## LVM | ||||
|  | ||||
| *lvm_tag*=tag | ||||
|  | ||||
| 	Specify LVM tag which will be used to trigger LVM. This option will be | ||||
| 	ignored if *lvm_name*/*lvm_group* was specified. | ||||
|  | ||||
| *lvm_name*=name | ||||
|  | ||||
| 	Specify LVM name which will be used to trigger LVM. *lvm_group* must be | ||||
| 	specified. | ||||
|  | ||||
| *lvm_group*=group | ||||
|  | ||||
| 	Specify LVM group which will be used to trigger LVM. | ||||
|  | ||||
| *lvm_config*=1 | ||||
|  | ||||
| 	Include */etc/lvm/lvm.conf* in initramfs. | ||||
|  | ||||
| *lvm_discard*=1 | ||||
|  | ||||
| 	Pass issue_discards to lvm. Useful for SSD's. | ||||
|  | ||||
| ## LUKS | ||||
|  | ||||
| *luks_key*=/path/to/key | ||||
|  | ||||
| 	Specify location to key. | ||||
| 	GPG-encrypted key currently not supported. | ||||
|  | ||||
| *luks_name*=name | ||||
|  | ||||
| 	Specify which name will be registered to mapping table after cryptsetup | ||||
| 	unlocks LUKS root. | ||||
|  | ||||
| *luks_root*=UUID|LABEL|/dev/\*|PARTUUID | ||||
|  | ||||
| 	See *root* for details. | ||||
|  | ||||
| *luks_header*=/path/to/header | ||||
|  | ||||
| 	Specify location to detached header. | ||||
|  | ||||
| *luks_discard*=1 | ||||
|  | ||||
| 	Pass --allow-discards to *cryptsetup*. Useful for SSD's, but you must know | ||||
| 	that security will be decreased. | ||||
|  | ||||
| ## KEYMAP | ||||
|  | ||||
| *keymap_path*=/path/to/keymap | ||||
|  | ||||
| 	Specify location to binary keymap. | ||||
| 	Currently, this hook supports loading keymap only via busybox loadkmap. | ||||
| 	kbd loadkeys not supported. | ||||
|  | ||||
| # EXAMPLES | ||||
|  | ||||
| Remember, these just examples ! _Don't copy blindly_ ! Your configuration may | ||||
| (and should) differ. | ||||
|  | ||||
| ## ROOT | ||||
|  | ||||
| ``` | ||||
| hooks=eudev | ||||
| root=/dev/sda1 | ||||
| ``` | ||||
|  | ||||
| ## ROOT + MONOLITH + PROC (CONFIG_UEVENT_HELPER) | ||||
|  | ||||
| ``` | ||||
| hooks=proc | ||||
| monolith=1 | ||||
| root=/dev/nvme0n1p1 | ||||
| ``` | ||||
|  | ||||
| ## ROOT + COMPRESS | ||||
|  | ||||
| ``` | ||||
| hostonly=1 | ||||
| hooks=mdevd | ||||
| compress="gzip -9" | ||||
| root=PARTUUID=8e05009d-a1d5-4fdb-b407-b0e79360555c | ||||
| ``` | ||||
|  | ||||
| ## ROOT + KEYMAP | ||||
|  | ||||
| ``` | ||||
| root_type=f2fs | ||||
| hooks="eudev keymap" | ||||
| root=UUID=13bcb7cc-8fe5-4f8e-a1fe-e4b5b336f3ef | ||||
| keymap_path=/usr/share/bkeymaps/colemak/en-latin9.bmap | ||||
| ``` | ||||
|  | ||||
| ## ROOT + LUKS | ||||
|  | ||||
| ``` | ||||
| hooks="mdev luks" | ||||
| root=LABEL=my_root | ||||
|  | ||||
| luks_discard=1 | ||||
| luks_key=/root/key | ||||
| luks_header=/root/header | ||||
| luks_root=PARTUUID=35f923c5-083a-4950-a4da-e611d0778121 | ||||
| ``` | ||||
|  | ||||
| ## ROOT + LVM + LUKS | ||||
|  | ||||
| ``` | ||||
| compress="lz4 -9" | ||||
| hooks="eudev lvm luks" | ||||
| root=/dev/disk/by-uuid/aa82d7bb-ab2b-4739-935f-fd8a5c9a6cb0 | ||||
|  | ||||
| luks_discard=1 | ||||
| luks_root=/dev/sdb2 | ||||
|  | ||||
| lvm_config=1 | ||||
| lvm_discard=1 | ||||
| lvm_name=lvm1 | ||||
| lvm_group=lvm_grp2 | ||||
| ``` | ||||
|  | ||||
| # SEE ALSO | ||||
|  | ||||
| *tinyramfs*(8) *tinyramfs.cmdline*(7) *tinyramfs.hooks*(7) | ||||
| @@ -1,177 +0,0 @@ | ||||
| .\" Generated by scdoc 1.11.1 | ||||
| .\" Complete documentation for this program is not available as a GNU info page | ||||
| .ie \n(.g .ds Aq \(aq | ||||
| .el       .ds Aq ' | ||||
| .nh | ||||
| .ad l | ||||
| .\" Begin generated content: | ||||
| .TH "tinyramfs.hooks" "7" "2021-05-10" | ||||
| .P | ||||
| .SH NAME | ||||
| .P | ||||
| Tinyramfs - hooks and related stuff | ||||
| .P | ||||
| .SH DESCRIPTION | ||||
| .P | ||||
| Hooks can be located in \fB/usr/share/tinyramfs/hooks\fR (system path) and | ||||
| \fB/etc/tinyramfs/hooks\fR (user path).\& Tinyramfs also allows you to specify custom | ||||
| location via \fB-H\fR option.\& See \fBtinyramfs\fR(8) for more information.\& | ||||
| .P | ||||
| Hooks provides a way to extend build and init process.\& Hooks must be written in | ||||
| POSIX shell.\& Bashisms and other non-portable extensions are forbidden.\& In order | ||||
| to write hooks you must know about hook structure.\& | ||||
| .P | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| <hook> - directory of hook scripts | ||||
| .RS 4 | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| <hook>           - invoked in build process.\& | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| <hook>.\&init      - invoked in init process.\& | ||||
| .RE | ||||
| .RS 4 | ||||
| .ie n \{\ | ||||
| \h'-04'\(bu\h'+03'\c | ||||
| .\} | ||||
| .el \{\ | ||||
| .IP \(bu 4 | ||||
| .\} | ||||
| <hook>.\&init.\&late - invoked after root filesystem was mounted.\& | ||||
|  | ||||
| .RE | ||||
| .P | ||||
| .RE | ||||
| .SS MAN PAGE SYNTAX | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| - B: extension can be used in build process | ||||
| - I: extension can be used in init process | ||||
| - BI: extension can be used in both processes | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH EXTENSIONS | ||||
| .P | ||||
| Tinyramfs also provides some extensions and environment variables to easily | ||||
| interact with build and init system.\& | ||||
| .P | ||||
| .SS BI: print <message> | ||||
| .P | ||||
| .RS 4 | ||||
| Print message to stdout.\& | ||||
| .P | ||||
| .RE | ||||
| .SS BI: panic [message] | ||||
| .P | ||||
| .RS 4 | ||||
| If message was not specified, then tinyramfs will print default error | ||||
| message.\& otherwise message will be printed.\& | ||||
| .P | ||||
| .RE | ||||
| .SS B: copy_module <full path> | ||||
| .P | ||||
| .RS 4 | ||||
| Copy kernel module by path to tinyramfs working directory.\& | ||||
| .P | ||||
| .RE | ||||
| .SS B: copy_binary <name or full path> | ||||
| .P | ||||
| .RS 4 | ||||
| If full path was specified and it's has executable bit, then it's will | ||||
| be copied to /bin location of tinyramfs working directory.\& | ||||
| .P | ||||
| If name was specified, then tinyramfs will try to find command by name | ||||
| in PATH.\& If it's success, command will be copied to /bin location of | ||||
| tinyramfs working directory.\& Otherwise error message will appear.\& | ||||
| .P | ||||
| .RE | ||||
| .SS B: copy_file <file> <destination> <mode> <strip> | ||||
| .P | ||||
| .RS 4 | ||||
| <file> must be full path to file.\& | ||||
| .P | ||||
| <destination> must be full path where <file> should be stored.\& Tinyramfs | ||||
| will automatically create all leading directories if they aren't exist | ||||
| already.\& Also no need to prepend path of tinyramfs working directory.\& | ||||
| .P | ||||
| <mode> permissions in octal format.\& | ||||
| .P | ||||
| <strip> if was set to 1, then tinyramfs will attempt to run strip | ||||
| on file.\& Tinyramfs will silently ignore errors if strip doesn't | ||||
| exists or failed to strip binary.\& | ||||
| .P | ||||
| .RE | ||||
| .SS I: resolve_device <UUID|LABEL|/dev/\*|PARTUUID> | ||||
| .P | ||||
| .RS 4 | ||||
| Sets \fBdevice\fR variable to full path of resolved UUID|LABEL|/dev/*|PARTUUID | ||||
| .P | ||||
| .RE | ||||
| .SH VARIABLES | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| - BI: debug - 1 if debug mode enabled | ||||
| - I: break  - breakpoint for debugging | ||||
| - B: tmpdir - full path of tinyramfs working directory (initramfs rootfs in future) | ||||
| - B: kernel - kernel version | ||||
| - B: moddir - modules directory | ||||
| - B: init   - path to init script | ||||
| - B: helper - path to device-helper script | ||||
| - B: config - config location | ||||
| - B: output - output path | ||||
| - BI: see tinyramfs\&.config(5) | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH EXAMPLES | ||||
| .P | ||||
| This example will show how to handle soft dependencies of ext4 module.\& | ||||
| Create \fB/etc/tinyramfs/hooks/ext4\fR directory and copy below scripts with | ||||
| appropriate names to that directory.\& After that, prepend \fBext4\fR to \fBhooks\fR | ||||
| option in tinyrams config.\& | ||||
| .P | ||||
| .SS ext4 | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| print "Copying ext4 dependencies" | ||||
|  | ||||
| for _mod in crc32c libcrc32c; do | ||||
|     copy_module "$_mod" | ||||
| done | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SS ext4.init | ||||
| .P | ||||
| .nf | ||||
| .RS 4 | ||||
| modprobe -a crc32c libcrc32c | ||||
| .fi | ||||
| .RE | ||||
| .P | ||||
| .SH SEE ALSO | ||||
| .P | ||||
| \fBtinyramfs\fR(8) \fBtinyramfs.\&config\fR(5) \fBtinyramfs.\&cmdline\fR(7) \fBtinyramfs.\&hooks\fR(7) | ||||
| @@ -1,115 +0,0 @@ | ||||
| tinyramfs.hooks(7) | ||||
|  | ||||
| # NAME | ||||
|  | ||||
| Tinyramfs - hooks and related stuff | ||||
|  | ||||
| # DESCRIPTION | ||||
|  | ||||
| Hooks can be located in */usr/share/tinyramfs/hooks* (system path) and | ||||
| */etc/tinyramfs/hooks* (user path). Tinyramfs also allows you to specify custom | ||||
| location via *-H* option. See *tinyramfs*(8) for more information. | ||||
|  | ||||
| Hooks provides a way to extend build and init process. Hooks must be written in | ||||
| POSIX shell. Bashisms and other non-portable extensions are forbidden. In order | ||||
| to write hooks you must know about hook structure. | ||||
|  | ||||
| - <hook> - directory of hook scripts | ||||
| 	- <hook>           - invoked in build process. | ||||
| 	- <hook>.init      - invoked in init process. | ||||
| 	- <hook>.init.late - invoked after root filesystem was mounted. | ||||
|  | ||||
| ## MAN PAGE SYNTAX | ||||
|  | ||||
| ``` | ||||
| - B: extension can be used in build process | ||||
| - I: extension can be used in init process | ||||
| - BI: extension can be used in both processes | ||||
| ``` | ||||
|  | ||||
| # EXTENSIONS | ||||
|  | ||||
| Tinyramfs also provides some extensions and environment variables to easily | ||||
| interact with build and init system. | ||||
|  | ||||
| ## BI: print <message> | ||||
|  | ||||
| 	Print message to stdout. | ||||
|  | ||||
| ## BI: panic [message] | ||||
|  | ||||
| 	If message was not specified, then tinyramfs will print default error | ||||
| 	message. otherwise message will be printed. | ||||
|  | ||||
| ## B: copy_module <full path> | ||||
|  | ||||
| 	Copy kernel module by path to tinyramfs working directory. | ||||
|  | ||||
| ## B: copy_binary <name or full path> | ||||
|  | ||||
| 	If full path was specified and it's has executable bit, then it's will | ||||
| 	be copied to /bin location of tinyramfs working directory. | ||||
| 	 | ||||
| 	If name was specified, then tinyramfs will try to find command by name | ||||
| 	in PATH. If it's success, command will be copied to /bin location of | ||||
| 	tinyramfs working directory. Otherwise error message will appear. | ||||
|  | ||||
| ## B: copy_file <file> <destination> <mode> <strip> | ||||
|  | ||||
| 	<file> must be full path to file. | ||||
|  | ||||
| 	<destination> must be full path where <file> should be stored. Tinyramfs | ||||
| 	will automatically create all leading directories if they aren't exist | ||||
| 	already. Also no need to prepend path of tinyramfs working directory. | ||||
|  | ||||
| 	<mode> permissions in octal format. | ||||
|  | ||||
| 	<strip> if was set to 1, then tinyramfs will attempt to run strip | ||||
| 	on file. Tinyramfs will silently ignore errors if strip doesn't | ||||
| 	exists or failed to strip binary. | ||||
|  | ||||
| ## I: resolve_device <UUID|LABEL|/dev/\*|PARTUUID> | ||||
|  | ||||
| 	Sets *device* variable to full path of resolved UUID|LABEL|/dev/\*|PARTUUID | ||||
|  | ||||
| # VARIABLES | ||||
|  | ||||
| ``` | ||||
| - BI: debug - 1 if debug mode enabled | ||||
| - I: break  - breakpoint for debugging | ||||
| - B: tmpdir - full path of tinyramfs working directory (initramfs rootfs in future) | ||||
| - B: kernel - kernel version | ||||
| - B: moddir - modules directory | ||||
| - B: init   - path to init script | ||||
| - B: helper - path to device-helper script | ||||
| - B: config - config location | ||||
| - B: output - output path | ||||
| - BI: see tinyramfs.config(5) | ||||
| ``` | ||||
|  | ||||
| # EXAMPLES | ||||
|  | ||||
| This example will show how to handle soft dependencies of ext4 module. | ||||
| Create */etc/tinyramfs/hooks/ext4* directory and copy below scripts with | ||||
| appropriate names to that directory. After that, prepend *ext4* to *hooks* | ||||
| option in tinyrams config. | ||||
|  | ||||
| ## ext4 | ||||
|  | ||||
| ``` | ||||
| print "Copying ext4 dependencies" | ||||
|  | ||||
| for _mod in crc32c libcrc32c; do | ||||
|     copy_module "$_mod" | ||||
| done | ||||
| ``` | ||||
|  | ||||
| ## ext4.init | ||||
|  | ||||
| ``` | ||||
| modprobe -a crc32c libcrc32c | ||||
| ``` | ||||
|  | ||||
| # SEE ALSO | ||||
|  | ||||
| *tinyramfs*(8) *tinyramfs.config*(5) *tinyramfs.cmdline*(7) *tinyramfs.hooks*(7) | ||||
							
								
								
									
										15
									
								
								hook/eudev/eudev
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								hook/eudev/eudev
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _bin in udevd udevadm; do | ||||
|     copy_exec "$_bin" | ||||
| done | ||||
|  | ||||
| mkdir -p "${tmpdir}/lib/udev/rules.d" | ||||
| cat > "${tmpdir}/lib/udev/rules.d/device.rules" << EOF | ||||
| SUBSYSTEMS=="block", ACTION=="add", RUN+="/sbin/helper" | ||||
| ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/sbin/helper" | ||||
| EOF | ||||
| @@ -1,11 +1,9 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| [ "$break" = eudev ] && { print "break before eudev.init"; sh; } | ||||
| 
 | ||||
| udevd -dN never | ||||
| udevadm trigger -c add -t subsystems | ||||
| udevadm trigger -c add -t devices | ||||
							
								
								
									
										8
									
								
								hook/keymap/keymap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								hook/keymap/keymap
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| copy_file "$keymap_path" "$keymap_path" 0644 | ||||
| copy_exec loadkmap | ||||
| @@ -1,10 +1,8 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| [ "$break" = keymap ] && { print "break before keymap.init"; sh; } | ||||
| 
 | ||||
| # TODO support loadkeys | ||||
| loadkmap < "$keymap_path" | ||||
| @@ -1,36 +1,36 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| [ "$luks_key" ] && { | ||||
|     copy_file "${luks_key#*=}" /root/key 400 0 | ||||
|     copy_file "${luks_key#*=}" /root/luks_key 0400 | ||||
| 
 | ||||
|     sed "s|${luks_key#*=}|/root/key|" \ | ||||
|     sed "s|${luks_key#*=}|/root/luks_key|" \ | ||||
|         "${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_" | ||||
| 
 | ||||
|     mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config" | ||||
| } | ||||
| 
 | ||||
| [ "$luks_header" ] && { | ||||
|     copy_file "${luks_header#*=}" /root/header 400 0 | ||||
|     copy_file "${luks_header#*=}" /root/luks_header 0400 | ||||
| 
 | ||||
|     sed "s|${luks_header#*=}|/root/header|" \ | ||||
|     sed "s|${luks_header#*=}|/root/luks_header|" \ | ||||
|         "${tmpdir}/etc/tinyramfs/config" > "${tmpdir}/_" | ||||
| 
 | ||||
|     mv "${tmpdir}/_" "${tmpdir}/etc/tinyramfs/config" | ||||
| } | ||||
| 
 | ||||
| [ "$hostonly" = 1 ] && | ||||
|     for _module in \ | ||||
| [ "$hostonly" ] && | ||||
|     for _mod in \ | ||||
|         aes ecb xts lrw wp512 sha256 \ | ||||
|         sha512 twofish serpent dm-crypt | ||||
|     do | ||||
|         copy_module "$_module" | ||||
|         copy_kmod "$_mod" | ||||
|     done | ||||
| 
 | ||||
| # https://bugs.archlinux.org/task/56771 | ||||
| [ -e /lib/libgcc_s.so.1 ] && copy_file /lib/libgcc_s.so.1 /lib/libgcc_s.so.1 755 1 | ||||
| [ -e /lib/libgcc_s.so.1 ] && copy_file /lib/libgcc_s.so.1 /lib/libgcc_s.so.1 0755 1 | ||||
| 
 | ||||
| copy_binary cryptsetup | ||||
| copy_exec cryptsetup | ||||
| @@ -1,11 +1,9 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| [ "$break" = luks ] && { print "break before luks.init"; sh; } | ||||
| 
 | ||||
| mkdir -p /run/cryptsetup | ||||
| 
 | ||||
| resolve_device "$luks_root" | ||||
| @@ -1,20 +1,20 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| [ "$hostonly" = 1 ] && | ||||
|     for _module in \ | ||||
| [ "$hostonly" ] && | ||||
|     for _mod in \ | ||||
|         dm-log dm-cache dm-mirror \ | ||||
|         dm-snapshot dm-multipath dm-thin-pool | ||||
|     do | ||||
|         copy_module "$_module" | ||||
|         copy_kmod "$_mod" | ||||
|     done | ||||
| 
 | ||||
| copy_binary lvm | ||||
| copy_exec lvm | ||||
| 
 | ||||
| lvm_config=" | ||||
| _config=' | ||||
|     devices { | ||||
|         write_cache_state = 0 | ||||
|     } | ||||
| @@ -24,11 +24,11 @@ lvm_config=" | ||||
|     } | ||||
|     global { | ||||
|         use_lvmetad = 0 | ||||
|     }" | ||||
|     }' | ||||
| 
 | ||||
| mkdir -p "${tmpdir}/etc/lvm" | ||||
| 
 | ||||
| lvm config \ | ||||
|     --config "$lvm_config" \ | ||||
|     --config "$_config" \ | ||||
|     ${lvm_config:+--mergedconfig} \ | ||||
| > "${tmpdir}/etc/lvm/lvm.conf" | ||||
							
								
								
									
										30
									
								
								hook/lvm/lvm.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								hook/lvm/lvm.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| mkdir -p /run/lvm /run/lock/lvm | ||||
|  | ||||
| set -- --sysinit -qq -aay ${lvm_discard:+--config=devices\{issue_discards=1\}} | ||||
|  | ||||
| if [ "$lvm_group" ] && [ "$lvm_name" ]; then | ||||
|     set -- lvchange "$@" "${lvm_group}/${lvm_name}" | ||||
| elif [ "$lvm_group" ]; then | ||||
|     set -- vgchange "$@" "$lvm_group" | ||||
| elif [ "$lvm_tag" ]; then | ||||
|     set -- lvchange "$@" "@${lvm_tag}" | ||||
| else | ||||
|     set -- vgchange "$@" | ||||
| fi | ||||
|  | ||||
| _count=0 | ||||
|  | ||||
| # Handle race condition. | ||||
| while ! DM_DISABLE_UDEV=1 lvm "$@"; do | ||||
|     if [ "$((_count += 1))" = 10 ]; then | ||||
|         panic "failed to trigger LVM" | ||||
|     else | ||||
|         sleep 1 | ||||
|     fi | ||||
| done | ||||
							
								
								
									
										14
									
								
								hook/mdev/mdev
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								hook/mdev/mdev
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _bin in mdev find kill; do | ||||
|     copy_exec "$_bin" | ||||
| done | ||||
|  | ||||
| cat > "${tmpdir}/etc/mdev.conf" << EOF | ||||
| SUBSYSTEM=block;.* 0:0 660 @/sbin/helper | ||||
| \$MODALIAS=.*      0:0 660 @/sbin/helper | ||||
| EOF | ||||
							
								
								
									
										24
									
								
								hook/mdev/mdev.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								hook/mdev/mdev.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| mdev -s | ||||
| mdev -df 2> /dev/null & | ||||
|  | ||||
| # https://shellcheck.net/wiki/SC2034 | ||||
| # shellcheck disable=2034 | ||||
| mdev_pid=$! | ||||
|  | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
|  | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
| @@ -1,7 +1,7 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| kill "$mdev_pid" | ||||
							
								
								
									
										14
									
								
								hook/mdevd/mdevd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								hook/mdevd/mdevd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _bin in mdevd mdevd-coldplug kill; do | ||||
|     copy_exec "$_bin" | ||||
| done | ||||
|  | ||||
| cat > "${tmpdir}/etc/mdev.conf" << EOF | ||||
| SUBSYSTEM=block;.* 0:0 660 @/sbin/helper | ||||
| \$MODALIAS=.*      0:0 660 @/sbin/helper | ||||
| EOF | ||||
							
								
								
									
										13
									
								
								hook/mdevd/mdevd.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								hook/mdevd/mdevd.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| mdevd 2> /dev/null & | ||||
|  | ||||
| # https://shellcheck.net/wiki/SC2034 | ||||
| # shellcheck disable=2034 | ||||
| mdevd_pid=$! | ||||
|  | ||||
| mdevd-coldplug | ||||
| @@ -1,7 +1,7 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
| 
 | ||||
| kill "$mdevd_pid" | ||||
| @@ -1,4 +1,4 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| 
 | ||||
| copy_binary find | ||||
| copy_exec find | ||||
							
								
								
									
										19
									
								
								hook/proc/proc.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								hook/proc/proc.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| printf '/sbin/helper\n' > /proc/sys/kernel/hotplug | ||||
|  | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
|  | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
| @@ -1,4 +1,4 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| 
 | ||||
| printf '\n' > /proc/sys/kernel/hotplug | ||||
| printf '\0' > /proc/sys/kernel/hotplug | ||||
							
								
								
									
										15
									
								
								hook/systemd-udev/systemd-udev
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								hook/systemd-udev/systemd-udev
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _bin in /lib/systemd/systemd-udevd udevadm; do | ||||
|     copy_exec "$_bin" | ||||
| done | ||||
|  | ||||
| mkdir -p "${tmpdir}/lib/udev/rules.d" | ||||
| cat > "${tmpdir}/lib/udev/rules.d/device.rules" << EOF | ||||
| SUBSYSTEMS=="block", ACTION=="add", RUN+="/sbin/helper" | ||||
| ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/sbin/helper" | ||||
| EOF | ||||
							
								
								
									
										10
									
								
								hook/systemd-udev/systemd-udev.init
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								hook/systemd-udev/systemd-udev.init
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| systemd-udevd -dN never | ||||
| udevadm trigger -c add -t subsystems | ||||
| udevadm trigger -c add -t devices | ||||
| udevadm settle | ||||
| @@ -1,19 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _binary in udevd udevadm; do | ||||
|     copy_binary "$_binary" | ||||
| done | ||||
|  | ||||
| mkdir -p "${tmpdir}/lib/udev/rules.d" | ||||
|  | ||||
| printf "%s\n" \ | ||||
|     'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \ | ||||
| > "${tmpdir}/lib/udev/rules.d/device-helper.rules" | ||||
|  | ||||
| [ "$monolith" = 1 ] || printf "%s\n" \ | ||||
|     'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \ | ||||
| >> "${tmpdir}/lib/udev/rules.d/device-helper.rules" | ||||
| @@ -1,8 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| copy_file "$keymap_path" "$keymap_path" 644 0 | ||||
| copy_binary loadkmap | ||||
| @@ -1,24 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://www.shellcheck.net/wiki/SC2068 | ||||
| # shellcheck disable=2154,2068 | ||||
|  | ||||
| [ "$break" = lvm ] && { print "break before lvm.init"; sh; } | ||||
|  | ||||
| export DM_DISABLE_UDEV=1 | ||||
| mkdir -p /run/lvm /run/lock/lvm | ||||
|  | ||||
| set -- \ | ||||
|     --sysinit -qq -aay "${lvm_discard:+--config=devices\{issue_discards=1\}}" | ||||
|  | ||||
| if [ "$lvm_group" ] && [ "$lvm_name" ]; then | ||||
|     lvm lvchange $@ "${lvm_group}/${lvm_name}" | ||||
| elif [ "$lvm_group" ]; then | ||||
|     lvm vgchange $@ "$lvm_group" | ||||
| elif [ "$lvm_tag" ]; then | ||||
|     lvm lvchange $@ "@${lvm_tag}" | ||||
| else | ||||
|     lvm vgchange $@ | ||||
| fi || panic "failed to trigger LVM" | ||||
| @@ -1,18 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://www.shellcheck.net/wiki/SC2016 | ||||
| # shellcheck disable=2154,2016 | ||||
|  | ||||
| for _binary in mdev find kill; do | ||||
|     copy_binary "$_binary" | ||||
| done | ||||
|  | ||||
| printf "%s\n" \ | ||||
|     'SUBSYSTEM=block;.* 0:0 660 @device-helper' \ | ||||
| > "${tmpdir}/etc/mdev.conf" | ||||
|  | ||||
| [ "$monolith" = 1 ] || printf "%s\n" \ | ||||
|     '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \ | ||||
| >> "${tmpdir}/etc/mdev.conf" | ||||
| @@ -1,17 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://www.shellcheck.net/wiki/SC2034 | ||||
| # shellcheck disable=2154,2034 | ||||
|  | ||||
| [ "$break" = mdev ] && { print "break before mdev.init"; sh; } | ||||
|  | ||||
| mdev -s | ||||
| mdev -df 2> /dev/null & mdev_pid="$!" | ||||
|  | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
| @@ -1,18 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://www.shellcheck.net/wiki/SC2016 | ||||
| # shellcheck disable=2154,2016 | ||||
|  | ||||
| for _binary in mdevd mdevd-coldplug kill; do | ||||
|     copy_binary "$_binary" | ||||
| done | ||||
|  | ||||
| printf "%s\n" \ | ||||
|     'SUBSYSTEM=block;.* 0:0 660 @device-helper' \ | ||||
| > "${tmpdir}/etc/mdev.conf" | ||||
|  | ||||
| [ "$monolith" = 1 ] || printf "%s\n" \ | ||||
|     '$MODALIAS=.* 0:0 660 @modprobe "$MODALIAS"' \ | ||||
| >> "${tmpdir}/etc/mdev.conf" | ||||
| @@ -1,11 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://www.shellcheck.net/wiki/SC2034 | ||||
| # shellcheck disable=2154,2034 | ||||
|  | ||||
| [ "$break" = mdevd ] && { print "break before mdevd.init"; sh; } | ||||
|  | ||||
| mdevd 2> /dev/null & mdevd_pid="$!" | ||||
| mdevd-coldplug | ||||
| @@ -1,16 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| [ "$break" = proc ] && { print "break before proc.init"; sh; } | ||||
|  | ||||
| command -v device-helper > /proc/sys/kernel/hotplug | ||||
|  | ||||
| # Prepare for fork bomb! | ||||
| find /sys/devices -name uevent | | ||||
|  | ||||
| while read -r uevent; do | ||||
|     printf add > "$uevent" | ||||
| done 2> /dev/null | ||||
| @@ -1,19 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| for _binary in /lib/systemd/systemd-udevd udevadm; do | ||||
|     copy_binary "$_binary" | ||||
| done | ||||
|  | ||||
| mkdir -p "${tmpdir}/lib/udev/rules.d" | ||||
|  | ||||
| printf "%s\n" \ | ||||
|     'SUBSYSTEMS=="block", ACTION=="add", RUN+="/bin/device-helper"' \ | ||||
| > "${tmpdir}/lib/udev/rules.d/device-helper.rules" | ||||
|  | ||||
| [ "$monolith" = 1 ] || printf "%s\n" \ | ||||
|     'ENV{MODALIAS}=="?*", ACTION=="add", RUN+="/bin/modprobe %E{MODALIAS}"' \ | ||||
| >> "${tmpdir}/lib/udev/rules.d/device-helper.rules" | ||||
| @@ -1,12 +0,0 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| [ "$break" = systemd-udevd ] && { print "break before systemd-udevd.init"; sh; } | ||||
|  | ||||
| /lib/systemd/systemd-udevd -dN never | ||||
| udevadm trigger -c add -t subsystems | ||||
| udevadm trigger -c add -t devices | ||||
| udevadm settle | ||||
							
								
								
									
										146
									
								
								init
									
									
									
									
									
								
							
							
						
						
									
										146
									
								
								init
									
									
									
									
									
								
							| @@ -1,146 +0,0 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # Tiny init | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| print() | ||||
| { | ||||
|     printf "%b %s\n" "${2:-"\033[1;37m>>\033[m"}" "$1" | ||||
| } | ||||
|  | ||||
| panic() | ||||
| { | ||||
|     print "${1:-unexpected error occurred}" \ | ||||
|           "\033[1;31m!!\033[m" >&2 | ||||
|  | ||||
|     sh | ||||
| } | ||||
|  | ||||
| resolve_device() | ||||
| { | ||||
|     count=0; device="$1" | ||||
|  | ||||
|     case "${device%%=*}" in | ||||
|         UUID)     device="/dev/disk/by-uuid/${device#*=}"     ;; | ||||
|         LABEL)    device="/dev/disk/by-label/${device#*=}"    ;; | ||||
|         PARTUUID) device="/dev/disk/by-partuuid/${device#*=}" ;; | ||||
|         /dev/*)            ;; | ||||
|         *)        return 0 ;; | ||||
|     esac | ||||
|  | ||||
|     # Race condition may occur if device manager is not yet initialized device. | ||||
|     # To fix this, we simply waiting until device is available. If device | ||||
|     # didn't appear in specified time, we panic. | ||||
|     while :; do | ||||
|         if [ -b "$device" ]; then | ||||
|             return 0 | ||||
|         elif [ "$((count += 1))" = "${rootdelay:=30}" ]; then | ||||
|             break | ||||
|         else | ||||
|             sleep 1 | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     panic "failed to lookup partition" | ||||
| } | ||||
|  | ||||
| run_hook() | ||||
| { | ||||
|     type="$1" | ||||
|  | ||||
|     # Run hooks if any exist. | ||||
|     # | ||||
|     # https://www.shellcheck.net/wiki/SC1090 | ||||
|     # shellcheck disable=1090 | ||||
|     for hook in $hooks; do | ||||
|         [ -f "/usr/share/tinyramfs/hooks/${hook}/${hook}.${type}" ] || continue | ||||
|            . "/usr/share/tinyramfs/hooks/${hook}/${hook}.${type}" | ||||
|     done | ||||
| } | ||||
|  | ||||
| prepare_environment() | ||||
| { | ||||
|     # https://www.shellcheck.net/wiki/SC1091 | ||||
|     # shellcheck disable=1091 | ||||
|     . /etc/tinyramfs/config | ||||
|  | ||||
|     export \ | ||||
|         PATH=/bin TERM=linux SHELL=/bin/sh \ | ||||
|         LANG=C LC_ALL=C PS1="# " HOME=/root | ||||
|  | ||||
|     mount -t proc     -o nosuid,noexec,nodev     proc /proc | ||||
|     mount -t sysfs    -o nosuid,noexec,nodev     sys  /sys | ||||
|     mount -t tmpfs    -o nosuid,nodev,mode=0755  run  /run | ||||
|     mount -t devtmpfs -o nosuid,noexec,mode=0755 dev  /dev | ||||
|  | ||||
|     ln -s /proc/self/fd /dev/fd | ||||
|     ln -s fd/0          /dev/stdin | ||||
|     ln -s fd/1          /dev/stdout | ||||
|     ln -s fd/2          /dev/stderr | ||||
| } | ||||
|  | ||||
| parse_cmdline() | ||||
| { | ||||
|     read -r cmdline < /proc/cmdline | ||||
|  | ||||
|     for line in $cmdline; do case "$line" in | ||||
|         rootfstype=*) root_type="${line#*=}" ;; | ||||
|         rootflags=*)  root_opts="${line#*=}" ;; | ||||
|         debug=1)      set -x ;; | ||||
|         ro | rw)      rorw="$line" ;; | ||||
|         --*)          init_args="${cmdline#*-- }"; break ;; | ||||
|         *=*)          command export "$line"     ;; | ||||
|         *)            command export "${line}=1" ;; | ||||
|     esac 2> /dev/null || :; done | ||||
| } | ||||
|  | ||||
| mount_root() | ||||
| { | ||||
|     [ "$break" = root ] && { print "break before mount_root()"; sh; } | ||||
|  | ||||
|     resolve_device "$root" | ||||
|  | ||||
|     # https://www.shellcheck.net/wiki/SC2086 | ||||
|     # shellcheck disable=2086 | ||||
|     mount \ | ||||
|         -o "${rorw:-ro}${root_opts:+,$root_opts}" ${root_type:+-t $root_type} \ | ||||
|         -- "$device" /mnt/root || panic "failed to mount root" | ||||
| } | ||||
|  | ||||
| boot_system() | ||||
| { | ||||
|     [ "$break" = boot ] && { print "break before boot_system()"; sh; } | ||||
|  | ||||
|     for dir in run dev sys proc; do | ||||
|         mount -o move "$dir" "/mnt/root/${dir}" | ||||
|     done | ||||
|  | ||||
|     # POSIX 'exec' has no '-c' flag to execute command with empty environment. | ||||
|     # Using 'env -i' instead to prevent leaking exported variables. | ||||
|     # | ||||
|     # Some implementations of 'switch_root' doesn't conform to POSIX utility | ||||
|     # guidelines and doesn't support '--'. This means that we can't guarantee | ||||
|     # safety of init_args. | ||||
|     # shellcheck disable=2086 | ||||
|     exec \ | ||||
|         env -i TERM=linux PATH=/bin:/sbin:/usr/bin:/usr/sbin \ | ||||
|         switch_root /mnt/root "${init-/sbin/init}" $init_args || | ||||
|         panic "failed to boot system" | ||||
| } | ||||
|  | ||||
| # Exit if command fails and disable globbing. | ||||
| set -ef | ||||
|  | ||||
| # Run emergency shell if init unexpectedly exiting due to error. | ||||
| trap panic EXIT | ||||
|  | ||||
| # TODO display fancy colored status info | ||||
|  | ||||
| prepare_environment | ||||
| parse_cmdline | ||||
| run_hook init | ||||
| mount_root | ||||
| run_hook init.late | ||||
| boot_system | ||||
							
								
								
									
										160
									
								
								lib/common.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										160
									
								
								lib/common.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| # vim: set ft=sh: | ||||
| # shellcheck shell=sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| print() | ||||
| { | ||||
|     printf "%s %s\n" "${2:-">>"}" "$1" | ||||
| } | ||||
|  | ||||
| panic() | ||||
| { | ||||
|     print "${1:-unexpected error occurred}" '!>' >&2 | ||||
|  | ||||
|     if [ "$$" = 1 ]; then | ||||
|         sh | ||||
|     else | ||||
|         exit 1 | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # random() | ||||
| # { | ||||
| #     _sum=$(cksum < /proc/uptime) | ||||
| #     printf '%s' "${sum% *}" | ||||
| # } | ||||
|  | ||||
| # TODO ensure correctness | ||||
| copy_file() | ||||
| ( | ||||
|     file=$1; dest=$2 | ||||
|  | ||||
|     [ -e "${tmpdir}/${dest}" ] && return | ||||
|  | ||||
|     while [ -h "$file" ]; do | ||||
|         mkdir -p "${tmpdir}/${file%/*}" | ||||
|         cp -P "$file" "${tmpdir}/${file}" | ||||
|         cd -P "${file%/*}" || exit | ||||
|  | ||||
|         symlink=$(ls -ld "$file") | ||||
|         symlink=${symlink##* -> } | ||||
|  | ||||
|         case $symlink in | ||||
|             /*) file=$symlink ;; | ||||
|             *)  file="${PWD}/${symlink##*/}" ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     [ -h "${tmpdir}/${dest}" ] && dest=$file | ||||
|  | ||||
|     mkdir -p "${tmpdir}/${dest%/*}" | ||||
|     cp "$file" "${tmpdir}/${dest}" | ||||
|  | ||||
|     [ "$3" ] && chmod "$3" "${tmpdir}/${dest}" | ||||
|  | ||||
|     # https://shellcheck.net/wiki/SC2015 | ||||
|     # shellcheck disable=2015 | ||||
|     [ "$4" ] && strip "${tmpdir}/${dest}" > /dev/null 2>&1 || : | ||||
| ) | ||||
|  | ||||
| copy_exec() | ||||
| { | ||||
|     _bin=$(command -v "$1") | ||||
|  | ||||
|     case $_bin in /*) ;; | ||||
|         '') | ||||
|             panic "unable to find command: $1" | ||||
|         ;; | ||||
|         *) | ||||
|             # https://shellcheck.net/wiki/SC2086 | ||||
|             # shellcheck disable=2086 | ||||
|             { IFS=:; set -- $PATH; unset IFS; } | ||||
|  | ||||
|             for _dir; do | ||||
|                 __bin="${_dir}/${_bin}" | ||||
|  | ||||
|                 [ -x "$__bin" ] && break | ||||
|             done | ||||
|  | ||||
|             # https://shellcheck.net/wiki/SC2015 | ||||
|             # shellcheck disable=2015 | ||||
|             [ -x "$__bin" ] && _bin=$__bin || panic "unable to find command: $_bin" | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     copy_file "$_bin" "/bin/${_bin##*/}" 0755 1 | ||||
|  | ||||
|     # TODO copy libs to the directory of interpreter. | ||||
|     ldd "$_bin" 2> /dev/null | | ||||
|  | ||||
|     while read -r _lib || [ "$_lib" ]; do | ||||
|         _lib=${_lib#* => } | ||||
|         _lib=${_lib% *} | ||||
|  | ||||
|         [ -e "$_lib" ] && copy_file "$_lib" "$_lib" 0755 1 | ||||
|     done | ||||
| } | ||||
|  | ||||
| copy_kmod() | ||||
| { | ||||
|     modprobe -S "$kernel" -D "$1" 2> /dev/null | | ||||
|  | ||||
|     while read -r _ _mod || [ "$_mod" ]; do | ||||
|         case $_mod in /*) copy_file "$_mod" "$_mod" 0644; esac | ||||
|     done | ||||
| } | ||||
|  | ||||
| # TODO allow full path to hook | ||||
| copy_hook() | ||||
| { | ||||
|     for _dir in "${local+./hook}" /etc/tinyramfs/hook.d /lib/tinyramfs/hook.d; do | ||||
|         _hook="${_dir}/${1}/${1}" | ||||
|         [ -f "$_hook" ] && break | ||||
|     done | ||||
|  | ||||
|     [ -f "$_hook" ] || panic "unable to find hook: $1" | ||||
|  | ||||
|     for _ext in init init.late; do | ||||
|         [ -f "${_hook}.${_ext}" ] || continue | ||||
|  | ||||
|         print "copying hook: ${1}.${_ext}" | ||||
|  | ||||
|         copy_file "${_hook}.${_ext}" "/lib/tinyramfs/hook.d/${1}/${1}.${_ext}" 0644 | ||||
|     done | ||||
|  | ||||
|     print "evaluating hook: $1" | ||||
|  | ||||
|     # https://shellcheck.net/wiki/SC1090 | ||||
|     # shellcheck disable=1090 | ||||
|     . "$_hook" | ||||
| } | ||||
|  | ||||
| resolve_device() | ||||
| { | ||||
|     device=$1; _count=${2:-30} | ||||
|  | ||||
|     case ${device%%=*} in | ||||
|         UUID)     device="/dev/disk/by-uuid/${device#*=}"     ;; | ||||
|         LABEL)    device="/dev/disk/by-label/${device#*=}"    ;; | ||||
|         PARTUUID) device="/dev/disk/by-partuuid/${device#*=}" ;; | ||||
|         /dev/*)          ;; | ||||
|         *)        return ;; | ||||
|     esac | ||||
|  | ||||
|     # Race condition may occur if device manager is not yet initialized device. | ||||
|     # To fix this, we simply waiting until device is available. If device | ||||
|     # didn't appear in specified time, we panic. | ||||
|     while :; do | ||||
|         if [ -b "$device" ]; then | ||||
|             return | ||||
|         elif [ "$((_count -= 1))" = 0 ]; then | ||||
|             break | ||||
|         else | ||||
|             sleep 1 | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     panic "failed to lookup partition: $device" | ||||
| } | ||||
| @@ -1,24 +1,25 @@ | ||||
| #!/bin/sh -f | ||||
| # | ||||
| # create /dev/disk/by-* and /dev/mapper/* symlinks | ||||
| # Load modules via $MODALIAS. | ||||
| # Create /dev/disk/by-* and /dev/mapper/* symlinks. | ||||
| 
 | ||||
| create_symlink() | ||||
| { | ||||
|     typ="$1"; sym="$2" | ||||
|     typ=$1; sym=$2 | ||||
| 
 | ||||
|     sym="${sym%\"}" | ||||
|     sym="${sym#\"}" | ||||
|     sym=${sym%\"} | ||||
|     sym=${sym#\"} | ||||
|     sym="/dev/disk/by-${typ}/${sym}" | ||||
| 
 | ||||
|     mkdir -p "${sym%/*}" | ||||
|     ln    -s "../../${dev_name}" "$sym" | ||||
| } | ||||
| 
 | ||||
| # DEVPATH is part of uevent which is exported to environment by device manager. | ||||
| [ -b "/dev/${dev_name=${DEVPATH##*/}}" ] || exit 1 | ||||
| 
 | ||||
| exec > /dev/null 2>&1 | ||||
| 
 | ||||
| [ "$MODALIAS" ] && modprobe "$MODALIAS" | ||||
| [ "$SUBSYSTEM" = block ] && [ -b "/dev/${dev_name=${DEVPATH##*/}}" ] || exit 1 | ||||
| 
 | ||||
| read -r dm_name < "/sys/block/${dev_name}/dm/name" && { | ||||
|     mkdir -p /dev/mapper | ||||
|     ln    -sf "../${dev_name}" "/dev/mapper/${dm_name:?}" | ||||
| @@ -37,8 +38,8 @@ while ! _blkid=$(blkid "/dev/${dev_name}"); do | ||||
|     fi | ||||
| done | ||||
| 
 | ||||
| for line in $_blkid; do case          "${line%%=*}" in | ||||
|     UUID)     create_symlink uuid     "${line##*=}" ;; | ||||
|     LABEL)    create_symlink label    "${line##*=}" ;; | ||||
|     PARTUUID) create_symlink partuuid "${line##*=}" ;; | ||||
| for line in $_blkid; do case           ${line%%=*} in | ||||
|     UUID)     create_symlink uuid     "${line#*=}" ;; | ||||
|     LABEL)    create_symlink label    "${line#*=}" ;; | ||||
|     PARTUUID) create_symlink partuuid "${line#*=}" ;; | ||||
| esac; done | ||||
							
								
								
									
										118
									
								
								lib/init.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										118
									
								
								lib/init.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,118 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2034 | ||||
| # shellcheck disable=2154,2034 | ||||
|  | ||||
| init_base() | ||||
| { | ||||
|     mount -t proc     -o nosuid,noexec,nodev     proc /proc | ||||
|     mount -t sysfs    -o nosuid,noexec,nodev     sys  /sys | ||||
|     mount -t tmpfs    -o nosuid,nodev,mode=0755  run  /run | ||||
|     mount -t devtmpfs -o nosuid,noexec,mode=0755 dev  /dev | ||||
|  | ||||
|     ln -s /proc/self/fd /dev/fd | ||||
|     ln -s fd/0          /dev/stdin | ||||
|     ln -s fd/1          /dev/stdout | ||||
|     ln -s fd/2          /dev/stderr | ||||
| } | ||||
|  | ||||
| eval_hooks() | ||||
| { | ||||
|     _type=$1 | ||||
|  | ||||
|     # https://shellcheck.net/wiki/SC2086 | ||||
|     # shellcheck disable=2086 | ||||
|     { IFS=,; set -- $hooks; unset IFS; } | ||||
|  | ||||
|     for _hook; do | ||||
|         [ -f "/lib/tinyramfs/hook.d/${_hook}/${_hook}.${_type}" ] || continue | ||||
|         [ "$rdbreak" = "$_hook" ] && panic "break before: ${_hook}.${_type}" | ||||
|  | ||||
|         # https://shellcheck.net/wiki/SC1090 | ||||
|         # shellcheck disable=1090 | ||||
|         . "/lib/tinyramfs/hook.d/${_hook}/${_hook}.${_type}" | ||||
|     done | ||||
| } | ||||
|  | ||||
| parse_cmdline() | ||||
| { | ||||
|     # XXX /proc/cmdline can contain multiline data? | ||||
|     read -r cmdline < /proc/cmdline | ||||
|  | ||||
|     # https://kernel.org/doc/html/latest/admin-guide/kernel-parameters.html | ||||
|     # ... parameters with '=' go into init's environment ... | ||||
|     for _param in $cmdline; do case $_param in | ||||
|         rdpanic) trap - EXIT ;; | ||||
|         rddebug) set -x ;; | ||||
|  | ||||
|         # Maintain backward compatibility with kernel parameters. | ||||
|         ro | rw)      rorw=$_param ;; | ||||
|         rootwait)     root_wait=-1 ;; | ||||
|         --)           init_args=${_param##*--}; break ;; | ||||
|         rootfstype=*) root_type=${_param#*=} ;; | ||||
|         rootflags=*)  root_opts=${_param#*=} ;; | ||||
|         rootdelay=*)  root_wait=${_param#*=} ;; | ||||
|     esac; done | ||||
| } | ||||
|  | ||||
| mount_root() | ||||
| { | ||||
|     [ "$rdbreak" = root ] && panic 'break before: mount_root()' | ||||
|  | ||||
|     resolve_device "$root" "$root_wait" | ||||
|  | ||||
|     # https://shellcheck.net/wiki/SC2086 | ||||
|     # shellcheck disable=2086 | ||||
|     mount \ | ||||
|         -o "${rorw:-ro}${root_opts:+,$root_opts}" ${root_type:+-t "$root_type"} \ | ||||
|         -- "$device" /mnt/root || panic "failed to mount rootfs: $device" | ||||
| } | ||||
|  | ||||
| boot_system() | ||||
| { | ||||
|     [ "$rdbreak" = boot ] && panic 'break before: boot_system()' | ||||
|  | ||||
|     for _dir in run dev sys proc; do | ||||
|         mount -o move "/${_dir}" "/mnt/root/${_dir}" || : | ||||
|     done | ||||
|  | ||||
|     # POSIX 'exec' has no '-c' flag to execute command with empty environment. | ||||
|     # Use 'env -i' instead to prevent leaking exported variables. | ||||
|     # | ||||
|     # Some implementations of 'switch_root' doesn't conform to POSIX utility | ||||
|     # guidelines and doesn't support '--'. This means that safety of init_args | ||||
|     # isn't guaranteed. | ||||
|     # | ||||
|     # https://shellcheck.net/wiki/SC2086 | ||||
|     # shellcheck disable=2086 | ||||
|     exec \ | ||||
|         env -i TERM=linux PATH=/bin:/sbin:/usr/bin:/usr/sbin \ | ||||
|         switch_root /mnt/root "${init:-/sbin/init}" $init_args || | ||||
|         panic "failed to boot system" | ||||
| } | ||||
|  | ||||
| # TODO add `quiet` support | ||||
|  | ||||
| # -e: Exit if command return status greater than 0 | ||||
| # -f: Disable globbing *?[] | ||||
| set -ef | ||||
|  | ||||
| # Run emergency shell if init unexpectedly exiting due to error. | ||||
| # TODO prompt to continue | ||||
| trap panic EXIT | ||||
|  | ||||
| # https://shellcheck.net/wiki/SC1091 | ||||
| # shellcheck disable=1091 | ||||
| . /lib/tinyramfs/common.sh | ||||
|  | ||||
| # https://shellcheck.net/wiki/SC1091 | ||||
| # shellcheck disable=1091 | ||||
| . /etc/tinyramfs/config | ||||
|  | ||||
| init_base | ||||
| parse_cmdline | ||||
| eval_hooks init | ||||
| mount_root | ||||
| eval_hooks init.late | ||||
| boot_system | ||||
							
								
								
									
										402
									
								
								tinyramfs
									
									
									
									
									
								
							
							
						
						
									
										402
									
								
								tinyramfs
									
									
									
									
									
								
							| @@ -1,256 +1,85 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # Tiny initramfs | ||||
| # | ||||
| # https://www.shellcheck.net/wiki/SC2154 | ||||
| # https://shellcheck.net/wiki/SC2154 | ||||
| # shellcheck disable=2154 | ||||
|  | ||||
| print() | ||||
| { | ||||
|     printf "%b %s\n" "${2:-"\033[1;37m>>\033[m"}" "$1" | ||||
| } | ||||
|  | ||||
| panic() | ||||
| { | ||||
|     print "${1:-unexpected error occurred}" \ | ||||
|           "\033[1;31m!!\033[m" | ||||
|  | ||||
|     exit 1 | ||||
| } >&2 | ||||
|  | ||||
| # TODO add version | ||||
| usage() | ||||
| { | ||||
|     cat << EOF | ||||
| usage: ${0##*/} [option]... | ||||
|        -o, --output <file>  set path to initramfs image | ||||
|        -c, --config <file>  set path to config | ||||
|        -k, --kernel  <ver>  set kernel version | ||||
|        -m, --modules <dir>  set path to modules | ||||
|        -H, --hooks   <dir>  set directory to hooks | ||||
|        -D, --helper <file>  set path to device helper | ||||
|        -I, --init   <file>  set path to init script | ||||
|        -d, --debug          enable debug mode | ||||
|        -f, --force          overwrite initramfs image | ||||
|     cat >&2 << EOF | ||||
| usage: ${0##*/} [option]... <output> | ||||
|     -c <file>  set path to config | ||||
|     -k <kern>  set kernel version | ||||
|     -m <path>  set path to modules | ||||
|     -l         enable local mode | ||||
|     -d         enable debug mode | ||||
|     -f         overwrite initramfs image | ||||
|     -h         display this message | ||||
| EOF | ||||
|  | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| parse_arguments() | ||||
| init_base() | ||||
| { | ||||
|     while [ "$1" ]; do case "$1" in | ||||
|         -o | --output) | ||||
|             output="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -c | --config) | ||||
|             config="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -k | --kernel) | ||||
|             kernel="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -m | --modules) | ||||
|             moddir="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -H | --hooks) | ||||
|             hksdir="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -D | --helper) | ||||
|             helper="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -I | --init) | ||||
|             init="${2:?}"; shift 2 | ||||
|         ;; | ||||
|         -d | --debug) | ||||
|             debug=1; shift 1 | ||||
|         ;; | ||||
|         -f | --force) | ||||
|             force=1; shift 1 | ||||
|         ;; | ||||
|         -h | --help) | ||||
|             usage; exit 0 | ||||
|         ;; | ||||
|         *) | ||||
|             printf "invalid option: %s\n" "$1" | ||||
|  | ||||
|             usage; exit 1 | ||||
|         ;; | ||||
|     esac; done | ||||
|  | ||||
|     # https://www.shellcheck.net/wiki/SC1090 | ||||
|     # shellcheck disable=1090 | ||||
|     . "${config:=/etc/tinyramfs/config}" | ||||
|  | ||||
|     : "${kernel:=$(uname -r)}" | ||||
|     : "${moddir:=/lib/modules}" | ||||
|     : "${init:=/usr/share/tinyramfs/init}" | ||||
|     : "${helper:=/usr/share/tinyramfs/device-helper}" | ||||
|     : "${output:=${TMPDIR:-/tmp}/tinyramfs-${kernel}}" | ||||
|     print 'creating ramfs structure' | ||||
|  | ||||
|     mkdir -p "${tmpdir:=${TMPDIR:-/tmp}/tinyramfs.$$}" | ||||
|  | ||||
|     # https://www.shellcheck.net/wiki/SC2015 | ||||
|     # https://shellcheck.net/wiki/SC2015 | ||||
|     # shellcheck disable=2015 | ||||
|     [ "$debug" = 1 ] && set -x || trap 'rm -rf $tmpdir' EXIT INT | ||||
| } | ||||
|     [ "$debug" ] && set -x || trap 'rm -rf $tmpdir' EXIT INT | ||||
|  | ||||
| prepare_initramfs() | ||||
| { | ||||
|     print "preparing initramfs" | ||||
|     ( | ||||
|         cd "$tmpdir" | ||||
|  | ||||
|     # https://wikipedia.org/wiki/Filesystem_Hierarchy_Standard | ||||
|     mkdir -p \ | ||||
|         "${tmpdir}/dev" \ | ||||
|         "${tmpdir}/sys" \ | ||||
|         "${tmpdir}/tmp" \ | ||||
|         "${tmpdir}/run" \ | ||||
|         "${tmpdir}/var" \ | ||||
|         "${tmpdir}/proc" \ | ||||
|         "${tmpdir}/root" \ | ||||
|         "${tmpdir}/usr/lib" \ | ||||
|         "${tmpdir}/usr/bin" \ | ||||
|         "${tmpdir}/mnt/root" \ | ||||
|         "${tmpdir}/etc/tinyramfs" | ||||
|         # https://wikipedia.org/wiki/Filesystem_Hierarchy_Standard | ||||
|         mkdir -p \ | ||||
|             dev sys tmp run var proc root \ | ||||
|             usr/lib usr/bin mnt/root etc/tinyramfs | ||||
|  | ||||
|     ln -s usr/lib "${tmpdir}/usr/lib64" | ||||
|     ln -s usr/lib "${tmpdir}/lib64" | ||||
|     ln -s usr/lib "${tmpdir}/lib" | ||||
|     ln -s usr/bin "${tmpdir}/bin" | ||||
|     ln -s usr/bin "${tmpdir}/sbin" | ||||
|     ln -s ../run  "${tmpdir}/var/run" | ||||
|     ln -s ../run/lock "${tmpdir}/var/lock" | ||||
|     ln -s bin     "${tmpdir}/usr/sbin" | ||||
|         ln -s usr/lib lib | ||||
|         ln -s usr/bin bin | ||||
|         ln -s usr/bin sbin | ||||
|         ln -s ../run  var/run | ||||
|         ln -s ../run/lock var/lock | ||||
|         ln -s bin     usr/sbin | ||||
|  | ||||
|     for _binary in \ | ||||
|         \[ sh ln env mkdir sleep mount \ | ||||
|         printf switch_root "$helper" | ||||
|         ln -s lib/tinyramfs/init.sh   init | ||||
|         ln -s ../lib/tinyramfs/helper.sh bin/helper | ||||
|     ) | ||||
|  | ||||
|     for _bin in \ | ||||
|         \[ sh ln env mkdir sleep \ | ||||
|         printf switch_root mount | ||||
|     do | ||||
|         copy_binary "$_binary" | ||||
|         copy_exec "$_bin" | ||||
|     done | ||||
|  | ||||
|     command -v blkid > /dev/null && copy_binary blkid | ||||
|     if ! command -v ldd > /dev/null; then | ||||
|         print 'unable to find ldd' '~>' | ||||
|     fi | ||||
|  | ||||
|     copy_file "$init"   /init                 755 0 | ||||
|     copy_file "$config" /etc/tinyramfs/config 644 0 | ||||
|     if ! command -v blkid > /dev/null; then | ||||
|         print 'unable to find blkid' '~>' | ||||
|     else | ||||
|         copy_exec blkid | ||||
|     fi | ||||
|  | ||||
|     copy_file "$config" /etc/tinyramfs/config    0644 | ||||
|     copy_file "$init"   /lib/tinyramfs/init.sh   0755 | ||||
|     copy_file "$devh"   /lib/tinyramfs/helper.sh 0755 | ||||
|     copy_file "$shrd"   /lib/tinyramfs/common.sh 0755 | ||||
| } | ||||
|  | ||||
| copy_file() | ||||
| ( | ||||
|     file="$1"; dest="$2"; mode="$3"; strip="$4" | ||||
|  | ||||
|     [ -e "${tmpdir}/${dest}" ] && return 0 | ||||
|  | ||||
|     mkdir -p "${tmpdir}/${dest%/*}" || panic | ||||
|  | ||||
|     # Iterate throught symlinks and copy them | ||||
|     while [ -h "$file" ]; do | ||||
|         cp -P "$file" "${tmpdir}/${dest%/*}/${file##*/}" | ||||
|         cd -P "${file%/*}" | ||||
|  | ||||
|         symlink=$(ls -ld "$file") | ||||
|         symlink="${symlink##* -> }" | ||||
|  | ||||
|         # TODO handle ../../.. | ||||
|         case "$symlink" in | ||||
|             /*) file="$symlink" ;; | ||||
|             *)  file="${PWD}/${symlink##*/}" ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     [ -h "${tmpdir}/${dest}" ] && dest="$file" | ||||
|  | ||||
|     { | ||||
|         cp    "$file" "${tmpdir}/${dest}" | ||||
|         chmod "$mode" "${tmpdir}/${dest}" | ||||
|     } || panic | ||||
|  | ||||
|     # https://www.shellcheck.net/wiki/SC2015 | ||||
|     # shellcheck disable=2015 | ||||
|     [ "$strip" = 1 ] && strip "${tmpdir}/${dest}" > /dev/null 2>&1 || : | ||||
| ) | ||||
|  | ||||
| copy_binary() | ||||
| copy_hooks() | ||||
| { | ||||
|     binary=$(command -v "$1") | ||||
|  | ||||
|     # If output is | ||||
|     # | ||||
|     # empty, do panic | ||||
|     # external command, do nothing | ||||
|     # builtin command, try to find external alternative. | ||||
|     # | ||||
|     # https://www.shellcheck.net/wiki/SC2086 | ||||
|     # https://shellcheck.net/wiki/SC2086 | ||||
|     # shellcheck disable=2086 | ||||
|     case "$binary" in */*) ;; | ||||
|         "") | ||||
|             panic "$1 does not exist" | ||||
|         ;; | ||||
|         *) | ||||
|             IFS=:; set -- $PATH; unset IFS | ||||
|     { IFS=,; set -- $hooks; unset IFS; } | ||||
|  | ||||
|             _binary="$binary" | ||||
|  | ||||
|             for _dir; do | ||||
|                 binary="${_dir}/${_binary}" | ||||
|  | ||||
|                 [ -x "$binary" ] && break | ||||
|             done || panic "$_binary does not exist" | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     copy_file "$binary" "/bin/${binary##*/}" 755 1 | ||||
|  | ||||
|     # Skip copying binary dependencies if ldd not available. | ||||
|     command -v ldd > /dev/null || return 0 | ||||
|  | ||||
|     # Copy binary dependencies if any exist. | ||||
|     ldd "$binary" 2> /dev/null | | ||||
|  | ||||
|     while read -r _library || [ "$_library" ]; do | ||||
|  | ||||
|         _library="${_library#* => }" | ||||
|         _library="${_library% *}" | ||||
|  | ||||
|         [ -e "$_library" ] || continue | ||||
|  | ||||
|         copy_file "$_library" "/lib/${_library##*/}" 755 1 | ||||
|     done | ||||
| } | ||||
|  | ||||
| copy_module() | ||||
| { | ||||
|     module="$1" | ||||
|  | ||||
|     modprobe -S "$kernel" -D "$module" 2> /dev/null | | ||||
|  | ||||
|     while read -r _ module || [ "$module" ]; do | ||||
|  | ||||
|         # Skip builtin modules. | ||||
|         case "$module" in */*) ;; *) continue; esac | ||||
|  | ||||
|         copy_file "$module" "$module" 644 0 | ||||
|     done | ||||
| } | ||||
|  | ||||
| copy_hook() | ||||
| { | ||||
|     hook="$1" | ||||
|  | ||||
|     for hook_dir in "$hksdir" /etc/tinyramfs/hooks /usr/share/tinyramfs/hooks; do | ||||
|         [ -f "${hook_dir}/${hook}/${hook}" ] && break | ||||
|     done || panic "could not find $hook hook" | ||||
|  | ||||
|     print "running $hook hook" | ||||
|  | ||||
|     # https://www.shellcheck.net/wiki/SC1090 | ||||
|     # shellcheck disable=1090 | ||||
|     . "${hook_dir}/${hook}/${hook}" | ||||
|  | ||||
|     for _type in init init.late; do | ||||
|         [ -f "${hook_dir}/${hook}/${hook}.${_type}" ] || continue | ||||
|  | ||||
|         print "copying ${hook}.${_type}" | ||||
|  | ||||
|         copy_file "${hook_dir}/${hook}/${hook}.${_type}" \ | ||||
|             "/usr/share/tinyramfs/hooks/${hook}/${hook}.${_type}" 644 0 | ||||
|     for _hook; do | ||||
|         copy_hook "$_hook" | ||||
|     done | ||||
| } | ||||
|  | ||||
| @@ -258,93 +87,118 @@ copy_modules() | ||||
| { | ||||
|     # Skip this function if kernel | ||||
|     # compiled with builtin modules. | ||||
|     if [ "$monolith" = 1 ]; then | ||||
|         return 0 | ||||
|     if [ "$monolith" ]; then | ||||
|         return | ||||
|  | ||||
|     elif [ "$hostonly" = 1 ]; then | ||||
|         print "copying hostonly modules" | ||||
|     elif [ "$hostonly" ]; then | ||||
|         print 'copying hostonly modules' | ||||
|  | ||||
|         # Perform autodetection of modules via /sys | ||||
|         # https://wiki.archlinux.org/index.php/Modalias | ||||
|         find /sys/devices -name modalias -exec sort -u {} + | | ||||
|  | ||||
|         while read -r _module || [ "$_module" ]; do | ||||
|  | ||||
|         while read -r _mod; do | ||||
|             # Skip unneeded modules and skip modules which | ||||
|             # depends on them as well. | ||||
|             case $(modprobe -S "$kernel" -D "$_module") in | ||||
|             case $(modprobe -S "$kernel" -D "$_mod") in | ||||
|                 *wmi* | *gpu* | *net*) continue ;; | ||||
|             esac 2> /dev/null | ||||
|  | ||||
|             copy_module "$_module" | ||||
|             copy_kmod "$_mod" | ||||
|         done | ||||
|  | ||||
|         if [ "$root_type" ]; then | ||||
|             copy_module "$root_type" | ||||
|             copy_kmod "$root_type" | ||||
|         else | ||||
|             while read -r _ _dir _type _; do | ||||
|                 [ "$_dir" = / ] && break | ||||
|             done < /proc/mounts || panic "failed to autodetect root fs module" | ||||
|             done < /proc/mounts || panic 'unable to detect rootfs module' | ||||
|  | ||||
|             copy_module "$_type" | ||||
|             copy_kmod "$_type" | ||||
|         fi | ||||
|     else | ||||
|         print "copying all modules" | ||||
|         print 'copying all modules' | ||||
|  | ||||
|         find \ | ||||
|             "${moddir}/${kernel}/kernel/fs" \ | ||||
|             "${moddir}/${kernel}/kernel/lib" \ | ||||
|             "${moddir}/${kernel}/kernel/arch" \ | ||||
|             "${moddir}/${kernel}/kernel/crypto" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/md" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/ata" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/scsi" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/block" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/virtio" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/usb/host" \ | ||||
|             "${moddir}/${kernel}/kernel/drivers/usb/storage" \ | ||||
|             -type f 2> /dev/null | | ||||
|         ( | ||||
|             cd "${moddir}/${kernel}/kernel" | ||||
|  | ||||
|         while read -r _module || [ "$_module" ]; do | ||||
|             copy_file "$_module" "/lib/modules/${_module#$moddir}" 644 0 | ||||
|         done | ||||
|             find \ | ||||
|                 fs lib arch crypto drivers/md drivers/ata drivers/scsi \ | ||||
|                 drivers/block drivers/virtio drivers/usb/host \ | ||||
|                 drivers/usb/storage -type f 2> /dev/null | | ||||
|  | ||||
|             while read -r _mod; do | ||||
|                 copy_file "$_mod" "/lib/modules/${kernel}/${_mod}" 0644 | ||||
|             done | ||||
|         ) | ||||
|     fi | ||||
|  | ||||
|     copy_binary modprobe | ||||
|     copy_exec modprobe | ||||
|  | ||||
|     copy_file "${moddir}/${kernel}/modules.order" \ | ||||
|               "/lib/modules/${kernel}/modules.order" 644 0 | ||||
|               "/lib/modules/${kernel}/modules.order" 0644 | ||||
|  | ||||
|     copy_file "${moddir}/${kernel}/modules.builtin" \ | ||||
|               "/lib/modules/${kernel}/modules.builtin" 644 0 | ||||
|               "/lib/modules/${kernel}/modules.builtin" 0644 | ||||
|  | ||||
|     depmod -b "$tmpdir" "$kernel" | ||||
| } | ||||
|  | ||||
| make_initramfs() | ||||
| ( | ||||
|     print "generating initramfs image" | ||||
| create_image() | ||||
| { | ||||
|     print 'generating initramfs image' | ||||
|  | ||||
|     [ "$force" != 1 ] && [ -e "$output" ] && | ||||
|         panic "initramfs image already exist" | ||||
|     [ -z "$force" ] && [ -e "$output" ] && | ||||
|         panic 'initramfs image already exist' | ||||
|  | ||||
|     cd "$tmpdir"; find . | | ||||
|     cpio -oH newc 2> /dev/null | | ||||
|     ${compress:-cat} > "$output" || | ||||
|     panic "failed to generate initramfs image" | ||||
|     (cd "$tmpdir" && find . | cpio -oH newc 2> /dev/null) | ${compress:-cat} > "$output" || | ||||
|         panic 'failed to generate initramfs image' | ||||
|  | ||||
|     print "done! check out $output" | ||||
| ) | ||||
|     print "done: $output" '+>' | ||||
| } | ||||
|  | ||||
| # Exit if command fails and disable globbing. | ||||
| while getopts c:k:m:ldfh opt; do case $opt in | ||||
|     c) config=$OPTARG ;; | ||||
|     k) kernel=$OPTARG ;; | ||||
|     m) moddir=$OPTARG ;; | ||||
|     l) local=1 ;; | ||||
|     d) debug=1 ;; | ||||
|     f) force=1 ;; | ||||
|     h) usage 0 ;; | ||||
|     ?) usage 2 ;; | ||||
| esac; done | ||||
|  | ||||
| shift "$((OPTIND - 1))" | ||||
|  | ||||
| # https://shellcheck.net/wiki/SC2015 | ||||
| # shellcheck disable=2015 | ||||
| [ "$1" ] && output=$1 || usage 2 | ||||
|  | ||||
| [ "$local" ] && { | ||||
|     init="${PWD}/lib/init.sh" | ||||
|     shrd="${PWD}/lib/common.sh" | ||||
|     devh="${PWD}/lib/helper.sh" | ||||
| } | ||||
|  | ||||
| : "${kernel:=$(uname -r)}" | ||||
| : "${moddir:=/lib/modules}" | ||||
| : "${init:=/lib/tinyramfs/init.sh}" | ||||
| : "${devh:=/lib/tinyramfs/helper.sh}" | ||||
| : "${shrd:=/lib/tinyramfs/common.sh}" | ||||
|  | ||||
| # -e: Exit if command return status greater than 0 | ||||
| # -f: Disable globbing *?[] | ||||
| set -ef | ||||
|  | ||||
| parse_arguments "$@" | ||||
| prepare_initramfs | ||||
| # https://shellcheck.net/wiki/SC1090 | ||||
| # shellcheck disable=1090 | ||||
| . "$shrd" | ||||
|  | ||||
| for _hook in $hooks; do | ||||
|     copy_hook "$_hook" | ||||
| done | ||||
| # https://shellcheck.net/wiki/SC1090 | ||||
| # shellcheck disable=1090 | ||||
| . "${config:=/etc/tinyramfs/config}" | ||||
|  | ||||
| init_base | ||||
| copy_hooks | ||||
| copy_modules | ||||
| make_initramfs | ||||
| create_image | ||||
|   | ||||
		Reference in New Issue
	
	Block a user