initial commit
This commit is contained in:
		
						commit
						a80e32c538
					
				
					 13 changed files with 1025 additions and 0 deletions
				
			
		
							
								
								
									
										37
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| # FedoraBook | ||||
| 
 | ||||
| WIP | ||||
| 
 | ||||
| ## Create | ||||
| 
 | ||||
| ```bash | ||||
| $ sudo ./prepare-root.sh \ | ||||
|   --pkglist pkglist.txt \ | ||||
|   --excludelist excludelist.txt \ | ||||
|   --logo logo.bmp --name FEDORABOOK \ | ||||
|   --outdir <IMGDIR> | ||||
| ``` | ||||
| 
 | ||||
| ## QEMU disk image | ||||
| ```bash | ||||
| $ sudo ./mkimage.sh <IMGDIR>  image.raw  | ||||
| ``` | ||||
| 
 | ||||
| ## USB stick | ||||
| ```bash | ||||
| $ sudo ./mkimage.sh <IMGDIR>  /dev/disk/by-path/pci-…-usb… | ||||
| ``` | ||||
| 
 | ||||
| ## Install from USB stick | ||||
| 
 | ||||
| - Enter BIOS | ||||
|   - turn on UEFI boot | ||||
|   - turn on TPM2 | ||||
| - Enter BIOS boot menu | ||||
| - Select USB stick | ||||
| - Login (user: admin, pw: admin) | ||||
| - Start gnome-terminal | ||||
| - sudo | ||||
| - ```clonedisk <usb stick device> <harddisk device>``` | ||||
| - reboot | ||||
| - remove stick | ||||
							
								
								
									
										78
									
								
								clonedisk.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										78
									
								
								clonedisk.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,78 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| set -ex | ||||
| 
 | ||||
| [[ $TMPDIR ]] || TMPDIR=/var/tmp | ||||
| readonly TMPDIR="$(realpath -e "$TMPDIR")" | ||||
| [ -d "$TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: Invalid tmpdir '$tmpdir'." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| readonly MY_TMPDIR="$(mktemp -p "$TMPDIR/" -d -t ${PROGNAME}.XXXXXX)" | ||||
| [ -d "$MY_TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: mktemp -p '$TMPDIR/' -d -t ${PROGNAME}.XXXXXX failed." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap ' | ||||
|     ret=$?; | ||||
|     [[ $MY_TMPDIR ]] && mountpoint "$MY_TMPDIR"/data && umount "$MY_TMPDIR"/data | ||||
|     [[ $MY_TMPDIR ]] && rm -rf --one-file-system -- "$MY_TMPDIR" | ||||
|     exit $ret; | ||||
|     ' EXIT | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap 'exit 1;' SIGINT | ||||
| 
 | ||||
| mem=$(cat /proc/meminfo | { read a b a; echo $b; } ) | ||||
| mem=$(((mem-1)/1024/1024 + 1)) | ||||
| mem=${3:-$mem} | ||||
| 
 | ||||
| IN=$(readlink -e "$1") | ||||
| OUT=$(readlink -e "$2") | ||||
| 
 | ||||
| [[ -b ${IN} ]] | ||||
| [[ -b ${OUT} ]] | ||||
| 
 | ||||
| for i in ${OUT}*; do | ||||
|     umount "$i" || : | ||||
| done | ||||
| 
 | ||||
| if [[ ${IN#/dev/loop} != $IN ]]; then | ||||
|     IN="${IN}p" | ||||
| fi | ||||
| 
 | ||||
| wipefs --all "$OUT" | ||||
| 
 | ||||
| sfdisk -W always -w always "$OUT" << EOF | ||||
| label: gpt | ||||
| 	    size=512MiB,  type=c12a7328-f81f-11d2-ba4b-00a0c93ec93b, name="ESP System Partition" | ||||
|             size=256M,    type=2c7357ed-ebd2-46d9-aec1-23d437ec2bf5, name="ver1",   uuid=$(blkid -o value -s PARTUUID ${IN}2) | ||||
|             size=4GiB,    type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, name="root1",  uuid=$(blkid -o value -s PARTUUID ${IN}3) | ||||
|             size=256M,    type=2c7357ed-ebd2-46d9-aec1-23d437ec2bf5, name="ver2" | ||||
|             size=4GiB,    type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, name="root2" | ||||
|             size=${mem}GiB,  type=0657fd6d-a4ab-43c4-84e5-0933c84b4f4f, name="swap" | ||||
|             type=3b8f8425-20e0-4f3b-907f-1a25a76f98e9, name="data" | ||||
| EOF | ||||
| 
 | ||||
| if [[ ${OUT#/dev/loop} != $OUT ]]; then | ||||
|     OUT="${OUT}p" | ||||
| fi | ||||
| if [[ ${OUT#/dev/nvme} != $OUT ]]; then | ||||
|     OUT="${OUT}p" | ||||
| fi | ||||
| 
 | ||||
| for i in 1 2 3; do  | ||||
|     dd if=${IN}${i} of=${OUT}${i} status=progress | ||||
| done | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # swap | ||||
| mkswap -L swap ${OUT}6 | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # data | ||||
| echo -n "zero key" \ | ||||
|     | cryptsetup luksFormat --type luks2 ${OUT}7 /dev/stdin | ||||
							
								
								
									
										10
									
								
								excludelist.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								excludelist.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| trousers | ||||
| systemd-bootchart | ||||
| grubby | ||||
| grub* | ||||
| plymouth | ||||
| device-mapper-multipath | ||||
| libvirt-daemon | ||||
| selinux-policy-targeted | ||||
| libselinux-utils | ||||
| 
 | ||||
							
								
								
									
										
											BIN
										
									
								
								logo.bmp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								logo.bmp
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										171
									
								
								mkimage.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										171
									
								
								mkimage.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,171 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| #=================================== | ||||
| FEDORA_VERSION=${FEDORA_VERSION:-28} | ||||
| #=================================== | ||||
| 
 | ||||
| set -ex | ||||
| 
 | ||||
| CURDIR=$(pwd) | ||||
| PROGNAME=${0##*/} | ||||
| 
 | ||||
| usage() { | ||||
|     cat << EOF | ||||
| Usage: $PROGNAME [OPTION] | ||||
| 
 | ||||
|   -h, --help             Display this help | ||||
|   --crypt                Use Luks2 to encrypt the data partition (default PW: 1) | ||||
|   --crypttpm2            as --crypt, but additionally auto-open with the use of a TPM2 | ||||
|   --simple               do not use dual-boot layout (e.g. for USB install media) | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| TEMP=$( | ||||
|     getopt -o '' \ | ||||
|         --long crypt \ | ||||
|         --long crypttpm2 \ | ||||
| 	--long help \ | ||||
|         -- "$@" | ||||
|     ) | ||||
| 
 | ||||
| if (( $? != 0 )); then | ||||
|     usage >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| eval set -- "$TEMP" | ||||
| unset TEMP | ||||
| . /etc/os-release | ||||
| 
 | ||||
| while true; do | ||||
|     case "$1" in | ||||
|         '--crypt') | ||||
| 	    USE_CRYPT="y" | ||||
|             shift 1; continue | ||||
|             ;; | ||||
|         '--crypttpm2') | ||||
| 	    USE_TPM="y" | ||||
|             shift 1; continue | ||||
|             ;; | ||||
|         '--help') | ||||
| 	    usage | ||||
| 	    exit 0 | ||||
|             ;; | ||||
|         '--') | ||||
|             shift | ||||
|             break | ||||
|             ;; | ||||
|         *) | ||||
|             echo 'Internal error!' >&2 | ||||
|             exit 1 | ||||
|             ;; | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| SOURCE=$(readlink -e "$1") | ||||
| IMAGE=$(readlink -e "$2") | ||||
| 
 | ||||
| if ! [[ -d $SOURCE ]] || ! [[ $IMAGE ]]; then | ||||
|     usage | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| 
 | ||||
| [[ $TMPDIR ]] || TMPDIR=/var/tmp | ||||
| readonly TMPDIR="$(realpath -e "$TMPDIR")" | ||||
| [ -d "$TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: Invalid tmpdir '$tmpdir'." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| readonly MY_TMPDIR="$(mktemp -p "$TMPDIR/" -d -t ${PROGNAME}.XXXXXX)" | ||||
| [ -d "$MY_TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: mktemp -p '$TMPDIR/' -d -t ${PROGNAME}.XXXXXX failed." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap ' | ||||
|     ret=$?; | ||||
|     for i in "$MY_TMPDIR"/boot "$MY_TMPDIR"/data; do | ||||
|        [[ -d "$i" ]] && mountpoint -q "$i" && umount "$i" | ||||
|     done | ||||
|     [[ $DEV ]] && losetup -d $DEV 2>/dev/null || : | ||||
|     [[ $MY_TMPDIR ]] && rm -rf --one-file-system -- "$MY_TMPDIR" | ||||
|     exit $ret; | ||||
|     ' EXIT | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap 'exit 1;' SIGINT | ||||
| 
 | ||||
| ROOT_HASH=$(<"$SOURCE"/root-hash.txt) | ||||
| 
 | ||||
| ROOT_UUID=${ROOT_HASH:32:8}-${ROOT_HASH:40:4}-${ROOT_HASH:44:4}-${ROOT_HASH:48:4}-${ROOT_HASH:52:12} | ||||
| HASH_UUID=${ROOT_HASH:0:8}-${ROOT_HASH:8:4}-${ROOT_HASH:12:4}-${ROOT_HASH:16:4}-${ROOT_HASH:20:12} | ||||
| 
 | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # Testdisk | ||||
| 
 | ||||
| # create GPT table with EFI System Partition | ||||
| if ! [[ -b "${IMAGE}" ]]; then | ||||
|     rm -f "${IMAGE}" | ||||
|     dd if=/dev/null of="${IMAGE}" bs=1MiB seek=$((15*1024)) count=1 | ||||
|     readonly DEV=$(losetup --show -f -P "${IMAGE}") | ||||
|     readonly DEV_PART=${DEV}p | ||||
| else | ||||
|     for i in ${IMAGE}*; do | ||||
| 	umount "$i" || : | ||||
|     done | ||||
| 
 | ||||
|     wipefs --force --all "${IMAGE}" | ||||
|     readonly DEV="${IMAGE}" | ||||
|     readonly DEV_PART="${IMAGE}" | ||||
| fi | ||||
| 
 | ||||
| udevadm settle | ||||
| sfdisk "${DEV}" << EOF | ||||
| label: gpt | ||||
| 	    size=512MiB,  type=c12a7328-f81f-11d2-ba4b-00a0c93ec93b, name="ESP System Partition" | ||||
|             size=64MiB,   type=2c7357ed-ebd2-46d9-aec1-23d437ec2bf5, name="ver1", uuid=$HASH_UUID | ||||
|             size=4GiB,    type=4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709, name="root1", uuid=$ROOT_UUID | ||||
|                           type=3b8f8425-20e0-4f3b-907f-1a25a76f98e9, name="data" | ||||
| EOF | ||||
| 
 | ||||
| udevadm settle | ||||
| for i in 1 2 3 4; do | ||||
|     wipefs --force --all ${DEV_PART}${i} | ||||
| done | ||||
| udevadm settle | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # ESP | ||||
| mkfs.fat -nEFI -F32 ${DEV_PART}1 | ||||
| mkdir "$MY_TMPDIR"/boot | ||||
| mount ${DEV_PART}1 "$MY_TMPDIR"/boot | ||||
| 
 | ||||
| mkdir -p "$MY_TMPDIR"/boot/EFI/Boot | ||||
| cp "$SOURCE"/bootx64.efi "$MY_TMPDIR"/boot/EFI/Boot/bootx64.efi | ||||
| umount "$MY_TMPDIR"/boot | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # ver1 | ||||
| dd if="$SOURCE"/root.verity.img of=${DEV_PART}2 status=progress | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # root1 | ||||
| dd if="$SOURCE"/root.squashfs.img of=${DEV_PART}3 status=progress | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # data | ||||
| echo -n "zero key" \ | ||||
|     | cryptsetup luksFormat --type luks2 ${DEV_PART}4 /dev/stdin | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # DONE | ||||
| 
 | ||||
| sync | ||||
| losetup -d $DEV || : | ||||
| eject "$DEV" || : | ||||
| sync | ||||
| 
 | ||||
							
								
								
									
										19
									
								
								pkglist-min.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								pkglist-min.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| dracut | ||||
| passwd | ||||
| rootfiles | ||||
| systemd | ||||
| systemd-udev | ||||
| kernel | ||||
| kernel-core | ||||
| bash | ||||
| sudo | ||||
| openssh-server | ||||
| strace | ||||
| xfsprogs | ||||
| pciutils | ||||
| microcode_ctl | ||||
| nss_db | ||||
| keyutils | ||||
| make | ||||
| less | ||||
| 
 | ||||
							
								
								
									
										76
									
								
								pkglist-sssd.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								pkglist-sssd.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,76 @@ | |||
| @GNOME | ||||
| @Fonts | ||||
| dracut | ||||
| passwd | ||||
| rootfiles | ||||
| systemd | ||||
| systemd-udev | ||||
| kernel | ||||
| kernel-core | ||||
| bash | ||||
| gnome-software | ||||
| gdm | ||||
| NetworkManager | ||||
| NetworkManager-openvpn | ||||
| NetworkManager-openvpn-gnome | ||||
| NetworkManager-ssh | ||||
| NetworkManager-ssh-gnome | ||||
| NetworkManager-vpnc | ||||
| NetworkManager-vpnc-gnome | ||||
| NetworkManager-wifi | ||||
| firefox | ||||
| emacs | ||||
| vim-enhanced | ||||
| pigz | ||||
| flatpak | ||||
| virt-manager | ||||
| gnome-desktop3 | ||||
| less | ||||
| bash-completion | ||||
| sudo | ||||
| openssh-server | ||||
| gnome-terminal | ||||
| strace | ||||
| libselinux-utils | ||||
| selinux-policy-targeted | ||||
| xfsprogs | ||||
| pciutils | ||||
| alsa-firmware | ||||
| alsa-tools-firmware.x86_64 | ||||
| atmel-firmware | ||||
| bfa-firmware | ||||
| ipw2100-firmware | ||||
| ipw2200-firmware | ||||
| iscan-firmware | ||||
| iwl1000-firmware | ||||
| iwl100-firmware | ||||
| iwl105-firmware | ||||
| iwl135-firmware | ||||
| iwl2000-firmware | ||||
| iwl2030-firmware | ||||
| iwl3160-firmware | ||||
| iwl3945-firmware | ||||
| iwl4965-firmware | ||||
| iwl5000-firmware | ||||
| iwl5150-firmware | ||||
| iwl6000-firmware | ||||
| iwl6000g2a-firmware | ||||
| iwl6000g2b-firmware | ||||
| iwl6050-firmware | ||||
| iwl7260-firmware | ||||
| libertas-sd8686-firmware | ||||
| libertas-sd8787-firmware | ||||
| libertas-usb8388-firmware | ||||
| linux-firmware | ||||
| midisport-firmware | ||||
| microcode_ctl | ||||
| nss_db | ||||
| psmisc | ||||
| authselect | ||||
| keyutils | ||||
| oddjob | ||||
| oddjob-mkhomedir | ||||
| sssd-client | ||||
| sssd-ldap | ||||
| sssd-krb5 | ||||
| sssd-tools | ||||
							
								
								
									
										65
									
								
								pkglist.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								pkglist.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| @GNOME | ||||
| gnome-initial-setup | ||||
| @Fonts | ||||
| NetworkManager | ||||
| NetworkManager-openvpn | ||||
| NetworkManager-openvpn-gnome | ||||
| NetworkManager-ssh | ||||
| NetworkManager-ssh-gnome | ||||
| NetworkManager-vpnc | ||||
| NetworkManager-vpnc-gnome | ||||
| NetworkManager-wifi | ||||
| firefox | ||||
| emacs | ||||
| vim-enhanced | ||||
| pigz | ||||
| flatpak | ||||
| virt-manager | ||||
| alsa-firmware | ||||
| alsa-tools-firmware.x86_64 | ||||
| atmel-firmware | ||||
| bfa-firmware | ||||
| ipw2100-firmware | ||||
| ipw2200-firmware | ||||
| iscan-firmware | ||||
| iwl1000-firmware | ||||
| iwl100-firmware | ||||
| iwl105-firmware | ||||
| iwl135-firmware | ||||
| iwl2000-firmware | ||||
| iwl2030-firmware | ||||
| iwl3160-firmware | ||||
| iwl3945-firmware | ||||
| iwl4965-firmware | ||||
| iwl5000-firmware | ||||
| iwl5150-firmware | ||||
| iwl6000-firmware | ||||
| iwl6000g2a-firmware | ||||
| iwl6000g2b-firmware | ||||
| iwl6050-firmware | ||||
| iwl7260-firmware | ||||
| libertas-sd8686-firmware | ||||
| libertas-sd8787-firmware | ||||
| libertas-usb8388-firmware | ||||
| linux-firmware | ||||
| midisport-firmware | ||||
| psmisc | ||||
| authselect | ||||
| openssh-server | ||||
| b43-openfwwf | ||||
| zd1211-firmware | ||||
| gnome-remote-desktop | ||||
| geolite2-country | ||||
| geolite2-city | ||||
| GeoIP-GeoLite-data | ||||
| adwaita-cursor-theme | ||||
| adwaita-icon-theme | ||||
| adwaita-gtk2-theme | ||||
| adwaita-qt5 | ||||
| adwaita-qt | ||||
| adwaita-qt4 | ||||
| ca-certificates | ||||
| fedora-gpg-keys | ||||
| bind-utils | ||||
| bash-completion | ||||
| 
 | ||||
							
								
								
									
										95
									
								
								pre-pivot.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								pre-pivot.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,95 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| root=$(getarg systemd.verity_root_hash) | ||||
| 
 | ||||
| case "$root" in | ||||
|     block:LABEL=*|LABEL=*) | ||||
|         root="${root#block:}" | ||||
|         root="$(echo $root | sed 's,/,\\x2f,g')" | ||||
|         root="/dev/disk/by-label/${root#LABEL=}" | ||||
|         rootok=1 ;; | ||||
|     block:UUID=*|UUID=*) | ||||
|         root="${root#block:}" | ||||
|         root="${root#UUID=}" | ||||
|         root="$(echo $root | tr "[:upper:]" "[:lower:]")" | ||||
|         root="/dev/disk/by-uuid/${root#UUID=}" | ||||
|         rootok=1 ;; | ||||
|     block:PARTUUID=*|PARTUUID=*) | ||||
|         root="${root#block:}" | ||||
|         root="${root#PARTUUID=}" | ||||
|         root="$(echo $root | tr "[:upper:]" "[:lower:]")" | ||||
|         root="/dev/disk/by-partuuid/${root}" | ||||
|         rootok=1 ;; | ||||
|     block:PARTLABEL=*|PARTLABEL=*) | ||||
|         root="${root#block:}" | ||||
|         root="/dev/disk/by-partlabel/${root#PARTLABEL=}" | ||||
|         rootok=1 ;; | ||||
|     /dev/*) | ||||
|         rootok=1 ;; | ||||
| esac | ||||
| 
 | ||||
| udevadm settle --exit-if-exists=/dev/tpmrm0 | ||||
| udevadm settle --exit-if-exists="$root" | ||||
| 
 | ||||
| unset FOUND | ||||
| for d in /dev/disk/by-path/*; do | ||||
|     [[ $d -ef $root ]] || continue | ||||
|     FOUND=1 | ||||
|     break | ||||
| done | ||||
| 
 | ||||
| [[ $FOUND ]] || die "No boot disk found" | ||||
| 
 | ||||
| disk=${d%-part*} | ||||
| 
 | ||||
| unset FOUND | ||||
| for datadev in $disk*; do | ||||
|     [[ $(blkid -o value -s PARTLABEL "$datadev") == "data" ]] || continue | ||||
|     FOUND=1 | ||||
|     break | ||||
| done | ||||
| 
 | ||||
| if cryptsetup isLuks --type luks2 "$datadev"; then | ||||
|     export TPM2TOOLS_TCTI_NAME=device | ||||
|     export TPM2TOOLS_DEVICE_FILE=/dev/tpmrm0 | ||||
|     luksname=luks-$(blkid -o value -s UUID "$datadev") | ||||
|     mapdev=/dev/mapper/$luksname | ||||
| 
 | ||||
|     if ! [[ -b $mapdev ]]; then | ||||
| 	if ! cryptsetup luksDump "$datadev" | grep -F -q clevis ; then | ||||
| 	    if echo -n "zero key" | clevis-luks-bind -f -k - -d "$datadev" tpm2 '{"pcr_ids":"7"}'; then | ||||
| 		echo -n "zero key" | cryptsetup luksRemoveKey "$datadev" /dev/stdin || die "Failed to remove key from LUKS" | ||||
| 		clevis-luks-unlock -d "$datadev" || die "Failed to unlock $datadev" | ||||
| 	    elif echo -n "zero key" | clevis-luks-bind -f -k - -d "$datadev" tpm2 '{"pcr_ids":"7","key":"rsa"}'; then | ||||
| 		echo -n "zero key" | cryptsetup luksRemoveKey "$datadev" /dev/stdin || die "Failed to remove key from LUKS" | ||||
| 		clevis-luks-unlock -d "$datadev" || die "Failed to unlock $datadev" | ||||
| 	    else | ||||
| 		warn "Failed to bind disk to TPM2" | ||||
| 		echo -n "zero key" | cryptsetup open --type luks2 "$datadev" $luksname --key-file /dev/stdin		 | ||||
| 	    fi | ||||
| 	else | ||||
| 	    clevis-luks-unlock -d "$datadev" || die "Failed to unlock $datadev" | ||||
| 	fi | ||||
|     fi | ||||
| else | ||||
|     mapdev="$datadev" | ||||
| fi | ||||
| 
 | ||||
| if [[ $(blkid -o value -s TYPE "$mapdev") != "xfs" ]]; then | ||||
|     mkfs.xfs -f -L data "$mapdev" | ||||
| fi | ||||
| 
 | ||||
| mount $mapdev /sysroot/data || die "Failed to mount $mapdev" | ||||
| 
 | ||||
| [[ -d /sysroot/data/var  ]] || mkdir /sysroot/data/var | ||||
| [[ -d /sysroot/data/home ]] || mkdir /sysroot/data/home | ||||
| 
 | ||||
| mount -o bind /sysroot/data/var /sysroot/var | ||||
| mount -o bind /sysroot/data/home /sysroot/home | ||||
| 
 | ||||
| for i in passwd shadow group gshadow subuid subgid; do | ||||
|     [[ -f /sysroot/data/var/$i ]] && continue | ||||
|     cp -a /sysroot/usr/share/factory/data/var/$i /sysroot/data/var/$i | ||||
| done | ||||
| 
 | ||||
| chroot /sysroot /usr/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev --exclude-prefix=/run --exclude-prefix=/tmp --exclude-prefix=/etc 2>&1 | vinfo  | ||||
							
								
								
									
										368
									
								
								prepare-root.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										368
									
								
								prepare-root.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,368 @@ | |||
| #!/bin/bash | ||||
| set -ex | ||||
| 
 | ||||
| usage() { | ||||
|     cat << EOF | ||||
| Usage: $PROGNAME [OPTION] | ||||
| 
 | ||||
| Creates a directory with a readonly root on squashfs, a dm_verity file and an EFI executable | ||||
| 
 | ||||
|   -h, --help             Display this help | ||||
|   -p, --pkglist FILE     The packages to install read from FILE (default: pkglist.txt) | ||||
|   -e, --excludelist FILE The packages to install read from FILE (default: excludelist.txt) | ||||
|   -r, --releasever NUM   Used Fedora release version NUM (default: $VERSION_ID) | ||||
|   -o, --outdir DIR       Creates DIR and puts all files in there (default: NAME-NUM-DATE) | ||||
|   -n, --name NAME        The NAME of the product (default: FedoraBook) | ||||
|   -l, --logo FILE        Uses the .bmp FILE to display as a splash screen (default: logo.bmp) | ||||
|   --noupdate             Do not install from Fedora Updates | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| CURDIR=$(pwd) | ||||
| 
 | ||||
| PROGNAME=${0##*/} | ||||
| BASEDIR=${0%/*} | ||||
| WITH_UPDATES=1 | ||||
| 
 | ||||
| TEMP=$( | ||||
|     getopt -o 'p:o:n:r:l:e:' \ | ||||
|         --long pkglist: \ | ||||
|         --long excludelist: \ | ||||
|         --long outdir: \ | ||||
|         --long name: \ | ||||
|         --long releasever: \ | ||||
|         --long logo: \ | ||||
|         --long noupdates \ | ||||
|         -- "$@" | ||||
|     ) | ||||
| 
 | ||||
| if (( $? != 0 )); then | ||||
|     usage >&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| eval set -- "$TEMP" | ||||
| unset TEMP | ||||
| . /etc/os-release | ||||
| 
 | ||||
| while true; do | ||||
|     case "$1" in | ||||
|         '-p'|'--pkglist') | ||||
|             if [[ -f $2 ]]; then | ||||
|                 PKGLIST=$(<$2) | ||||
|             else | ||||
|                 PKGLIST="$2" | ||||
|             fi | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '-e'|'--excludelist') | ||||
|             if [[ -f $2 ]]; then | ||||
|                 EXCLUDELIST=$(<$2) | ||||
|             else | ||||
|                 EXCLUDELIST="$2" | ||||
|             fi | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '-o'|'--outdir') | ||||
|             OUTDIR="$2" | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '-n'|'--name') | ||||
|             NAME="$2" | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '-r'|'--releasever') | ||||
|             RELEASEVER="$2" | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '-l'|'--logo') | ||||
|             LOGO="$2" | ||||
|             shift 2; continue | ||||
|             ;; | ||||
|         '--noupdates') | ||||
|             unset WITH_UPDATES | ||||
|             shift 1; continue | ||||
|             ;; | ||||
|         '--') | ||||
|             shift | ||||
|             break | ||||
|             ;; | ||||
|         *) | ||||
|             echo 'Internal error!' >&2 | ||||
|             exit 1 | ||||
|             ;; | ||||
|     esac | ||||
| done | ||||
| 
 | ||||
| [[ $EXCLUDELIST ]] || [[ -f excludelist.txt ]] && EXCLUDELIST=$(<excludelist.txt) | ||||
| NAME=${NAME:-"FedoraBook"} | ||||
| RELEASEVER=${RELEASEVER:-$VERSION_ID} | ||||
| OUTDIR=${OUTDIR:-"${CURDIR}/${NAME}-${VERSION_ID}"} | ||||
| VERSION_ID="${RELEASEVER}.$(date -u +'%Y%m%d%H%M%S')" | ||||
| 
 | ||||
| [[ $TMPDIR ]] || TMPDIR=/var/tmp | ||||
| readonly TMPDIR="$(realpath -e "$TMPDIR")" | ||||
| [ -d "$TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: Invalid tmpdir '$tmpdir'." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| readonly MY_TMPDIR="$(mktemp -p "$TMPDIR/" -d -t ${PROGNAME}.XXXXXX)" | ||||
| [ -d "$MY_TMPDIR" ] || { | ||||
|     printf "%s\n" "${PROGNAME}: mktemp -p '$TMPDIR/' -d -t ${PROGNAME}.XXXXXX failed." >&2 | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap ' | ||||
|     ret=$?; | ||||
|     mountpoint -q "$sysroot"/var/cache/dnf && umount "$sysroot"/var/cache/dnf | ||||
|     for i in "$sysroot"/{dev,sys,proc,run}; do | ||||
|        [[ -d "$i" ]] && mountpoint -q "$i" && umount "$i" | ||||
|     done | ||||
|     [[ $MY_TMPDIR ]] && rm -rf --one-file-system -- "$MY_TMPDIR" | ||||
|     exit $ret; | ||||
|     ' EXIT | ||||
| 
 | ||||
| # clean up after ourselves no matter how we die. | ||||
| trap 'exit 1;' SIGINT | ||||
| 
 | ||||
| readonly sysroot="${MY_TMPDIR}/sysroot" | ||||
| 
 | ||||
| mkdir -p "$sysroot"/{dev,proc,sys,run} | ||||
| mount --bind /proc "$sysroot/proc" | ||||
| #mount --bind /run "$sysroot/run" | ||||
| mount --bind /sys "$sysroot/sys" | ||||
| mount -t devtmpfs devtmpfs "$sysroot/dev" | ||||
| 
 | ||||
| mkdir -p "$sysroot"/var/cache/dnf | ||||
| mount --bind /var/cache/dnf "$sysroot"/var/cache/dnf | ||||
| 
 | ||||
| dnf -v --nogpgcheck --installroot "$sysroot"/ --releasever "$RELEASEVER" --disablerepo='*' \ | ||||
|     --enablerepo=fedora \ | ||||
|     ${WITH_UPDATES:+--enablerepo=updates} \ | ||||
|     --exclude="$EXCLUDELIST" \ | ||||
|     --setopt=keepcache=True \ | ||||
|     install -y \ | ||||
|     dracut \ | ||||
|     passwd \ | ||||
|     rootfiles \ | ||||
|     systemd \ | ||||
|     systemd-udev \ | ||||
|     kernel \ | ||||
|     bash \ | ||||
|     sudo \ | ||||
|     strace \ | ||||
|     xfsprogs \ | ||||
|     pciutils \ | ||||
|     microcode_ctl \ | ||||
|     nss_db \ | ||||
|     keyutils \ | ||||
|     make \ | ||||
|     less \ | ||||
|     polkit \ | ||||
|     util-linux \ | ||||
|     rng-tools \ | ||||
|     openssl \ | ||||
|     cryptsetup \ | ||||
|     clevis \ | ||||
|     clevis-luks \ | ||||
|     clevis-systemd \ | ||||
|     jose \ | ||||
|     tpm2-tools \ | ||||
|     coreutils \ | ||||
|     libpwquality \ | ||||
|     tpm2-tss \ | ||||
|     ncurses-base \ | ||||
|     dbus-broker \ | ||||
|     $PKGLIST | ||||
| 
 | ||||
| cp "$CURDIR/clonedisk.sh" "$sysroot"/usr/bin/clonedisk | ||||
| 
 | ||||
| rpm --root "$sysroot" -qa | sort > "$sysroot"/usr/rpm-list.txt | ||||
| mkdir -p "$sysroot"/overlay/efi | ||||
| 
 | ||||
| cp "${BASEDIR}"/pre-pivot.sh "$sysroot"/pre-pivot.sh | ||||
| chmod 0755 "$sysroot"/pre-pivot.sh | ||||
| 
 | ||||
| KVER=$(cd "$sysroot"/lib/modules/; ls -1d ??* | tail -1) | ||||
| 
 | ||||
| sed -ie 's#\(tpm2_[^ ]*\) #\1 -T device:${TPM2TOOLS_DEVICE_FILE[0]} #g' "$sysroot"/usr/bin/clevis-*-tpm2 | ||||
| 
 | ||||
| #--------------- | ||||
| # rngd | ||||
| ln -fsnr "$sysroot"/usr/lib/systemd/system/rngd.service "$sysroot"/usr/lib/systemd/system/basic.target.wants/rngd.service | ||||
| 
 | ||||
| chroot  "$sysroot" \ | ||||
| 	dracut -N --kver $KVER --force \ | ||||
| 	--filesystems "squashfs vfat xfs" \ | ||||
| 	--add-drivers "=drivers/char/tpm" \ | ||||
| 	-m "bash systemd systemd-initrd modsign crypt dm kernel-modules qemu rootfs-block udev-rules dracut-systemd base fs-lib shutdown terminfo" \ | ||||
| 	--install /usr/lib/systemd/systemd-veritysetup \ | ||||
| 	--install /usr/lib/systemd/system-generators/systemd-veritysetup-generator \ | ||||
| 	--install "clonedisk wipefs sfdisk dd mkfs.xfs mkswap chroot mountpoint mkdir stat openssl" \ | ||||
| 	--install "clevis clevis-luks-bind jose clevis-encrypt-tpm2 clevis-decrypt clevis-luks-unlock clevis-decrypt-tpm2"  \ | ||||
| 	--install "cryptsetup tail sort pwmake mktemp " \ | ||||
| 	--install "tpm2_createprimary tpm2_pcrlist tpm2_createpolicy tpm2_create tpm2_load tpm2_unseal tpm2_takeownership" \ | ||||
| 	--install "strace" \ | ||||
| 	--include /pre-pivot.sh /lib/dracut/hooks/pre-pivot/pre-pivot.sh \ | ||||
| 	--include /overlay / \ | ||||
| 	--install /usr/lib/systemd/system/clevis-luks-askpass.path \ | ||||
| 	--install /usr/lib/systemd/system/clevis-luks-askpass.service \ | ||||
| 	--install /usr/libexec/clevis-luks-askpass \ | ||||
| 	--include /usr/share/cracklib/ /usr/share/cracklib/ \ | ||||
| 	--install /usr/lib64/libtss2-esys.so.0 \ | ||||
| 	--install /usr/lib64/libtss2-tcti-device.so.0 \ | ||||
| 	--install /sbin/rngd \ | ||||
| 	--install /usr/lib/systemd/system/basic.target.wants/rngd.service | ||||
| 
 | ||||
| rm "$sysroot"/pre-pivot.sh | ||||
| #bash -i | ||||
| 
 | ||||
| umount "$sysroot"/var/cache/dnf | ||||
| 
 | ||||
| mkdir -p "$sysroot"/usr/share/factory/data/{var/etc,home} | ||||
| ln -sfnr "$sysroot"/usr/share/factory/data/var "$sysroot"/usr/share/factory/var | ||||
| ln -sfnr "$sysroot"/usr/share/factory/data/home "$sysroot"/usr/share/factory/home | ||||
| 
 | ||||
| #--------------- | ||||
| # timesync | ||||
| ln -fsnr "$sysroot"/usr/lib/systemd/system/systemd-timesyncd.service "$sysroot"/usr/lib/systemd/system/sysinit.target.wants/systemd-timesyncd.service | ||||
| 
 | ||||
| #--------------- | ||||
| # dbus-broker | ||||
| ln -fsnr "$sysroot"/usr/lib/systemd/system/dbus-broker.service "$sysroot"/etc/systemd/system/dbus.service | ||||
| 
 | ||||
| #--------------- | ||||
| # ssh | ||||
| if [[ -d "$sysroot"/etc/ssh ]]; then | ||||
|     mv "$sysroot"/etc/ssh "$sysroot"/usr/share/factory/var/etc/ssh | ||||
|     ln -sfnr "$sysroot"/var/etc/ssh "$sysroot"/etc/ssh | ||||
| fi | ||||
| 
 | ||||
| #--------------- | ||||
| # tpm2-tss  | ||||
| if [[ -f "$sysroot"/usr/lib/udev/rules.d/60-tpm-udev.rules ]]; then | ||||
|     echo 'tss:x:59:59:tpm user:/dev/null:/sbin/nologin' >> "$sysroot"/etc/passwd | ||||
|     echo 'tss:!!:15587::::::' >> "$sysroot"/etc/shadow | ||||
|     echo 'tss:x:59:' >> "$sysroot"/etc/group | ||||
|     echo 'tss:!::' >> "$sysroot"/etc/gshadow | ||||
| fi | ||||
| 
 | ||||
| #--------------- | ||||
| # NetworkManager | ||||
| if [[ -d "$sysroot"/etc/NetworkManager ]]; then | ||||
|     mv "$sysroot"/etc/NetworkManager "$sysroot"/usr/share/factory/var/etc/ | ||||
|     ln -fsnr "$sysroot"/var/etc/NetworkManager "$sysroot"/etc/NetworkManager | ||||
|     cat >> "$sysroot"/usr/lib/tmpfiles.d/NetworkManager.conf <<EOF | ||||
| d /var/lib/NetworkManager 0755 root root - - | ||||
| d /run/NetworkManager 0755 root root - - | ||||
| EOF | ||||
|     rm -fr "$sysroot"/etc/sysconfig/network-scripts | ||||
|     rm -fr "$sysroot"/usr/lib64/NetworkManager/*/libnm-settings-plugin-ifcfg-rh.so | ||||
| fi | ||||
| 
 | ||||
| . "${BASEDIR}"/quirks/nss_db.sh | ||||
| 
 | ||||
| #--------------- | ||||
| # resolv.conf | ||||
| ln -fsrn "$sysroot"/run/NetworkManager/resolv.conf "$sysroot"/etc/resolv.conf | ||||
| echo 'f /run/NetworkManager/resolv.conf 0755 root root - ' >> "$sysroot"/usr/lib/tmpfiles.d/resolv.conf | ||||
| ln -sfrn "$sysroot"/var/etc/hostname "$sysroot"/etc/hostname | ||||
| echo "FedoraBook" > "$sysroot"/usr/share/factory/var/etc/hostname | ||||
| 
 | ||||
| #--------------- | ||||
| # vconsole.conf | ||||
| ln -fsnr "$sysroot"/var/etc/vconsole.conf "$sysroot"/etc/vconsole.conf | ||||
| echo -e 'FONT=latarcyrheb-sun16\nKEYMAP=us' > "$sysroot"/usr/share/factory/var/etc/vconsole.conf | ||||
| 
 | ||||
| #--------------- | ||||
| # locale.conf | ||||
| ln -fsnr "$sysroot"/var/etc/locale.conf "$sysroot"/etc/locale.conf | ||||
| echo 'LANG=en_US.UTF-8' > "$sysroot"/usr/share/factory/var/etc/locale.conf | ||||
| 
 | ||||
| #--------------- | ||||
| # udev dri/card0 | ||||
| cp "${BASEDIR}"/systemd-udev-settle-dri.service "$sysroot"/usr/lib/systemd/system/ | ||||
| ln -fsnr "$sysroot"/usr/lib/systemd/system/systemd-udev-settle-dri.service \ | ||||
|    "$sysroot"/usr/lib/systemd/system/multi-user.target.wants/systemd-udev-settle-dri.service | ||||
| 
 | ||||
| #--------------- | ||||
| # Flathub | ||||
| if [[ -d "$sysroot"/usr/share/flatpak ]]; then | ||||
|     mkdir -p "$sysroot"/usr/share/factory/var/lib/ | ||||
|     curl https://flathub.org/repo/flathub.flatpakrepo -o "$sysroot"/usr/share/flatpak/flathub.flatpakrepo | ||||
|     chroot "$sysroot" bash -c '/usr/bin/flatpak remote-add --if-not-exists flathub /usr/share/flatpak/flathub.flatpakrepo' | ||||
| fi | ||||
| 
 | ||||
| #--------------- | ||||
| # var | ||||
| rm -fr "$sysroot"/var/lib/rpm | ||||
| rm -fr "$sysroot"/var/lib/selinux | ||||
| rm -fr "$sysroot"/var/log/dnf* | ||||
| rm -fr "$sysroot"/var/cache/*/* | ||||
| rm -fr "$sysroot"/var/tmp/* | ||||
| rm -fr "$sysroot"/etc/systemd/system/network-online.target.wants | ||||
| mv "$sysroot"/lib/tmpfiles.d/var.conf "$sysroot"/lib/tmpfiles.d-var.conf | ||||
| chroot "$sysroot" bash -c 'for i in $(find -H /var -xdev -type d); do grep " $i " -r -q /lib/tmpfiles.d && ! grep " $i " -q /lib/tmpfiles.d-var.conf && rm -vfr --one-file-system "$i" ; done; :' | ||||
| cp -avxr "$sysroot"/var/* "$sysroot"/usr/share/factory/data/var/ | ||||
| rm -fr "$sysroot"/usr/share/factory/var/{run,lock} | ||||
| 
 | ||||
| chroot "$sysroot" bash -c 'for i in $(find -H /var -xdev -type d); do echo "C /data$i - - - - -"; done > /usr/lib/tmpfiles.d/var-quirk.conf; :' | ||||
| mv "$sysroot"/lib/tmpfiles.d-var.conf "$sysroot"/lib/tmpfiles.d/var.conf | ||||
| 
 | ||||
| sed -i -e "s#VERSION_ID=.*#VERSION_ID=$VERSION_ID#" "$sysroot"/etc/os-release | ||||
| 
 | ||||
| mv -v "$sysroot"/boot/*/*/initrd "$MY_TMPDIR"/ | ||||
| mv -v "$sysroot"/lib/modules/*/vmlinuz "$MY_TMPDIR"/linux | ||||
| rm -fr "$sysroot"/{boot,root} | ||||
| ln -sfnr "$sysroot"/data/root "$sysroot"/root | ||||
| rm -fr "$sysroot"/etc/yum.repos.d/* | ||||
| mkdir "$sysroot"/efi | ||||
| rm -fr "$sysroot"/var/* | ||||
| rm -fr "$sysroot"/home/* | ||||
| rm -fr "$sysroot"/etc/selinux | ||||
| mkdir "$sysroot"/data | ||||
| 
 | ||||
| for i in "$sysroot"/{dev,sys,proc,run}; do | ||||
|     [[ -d "$i" ]] && mountpoint -q "$i" && umount "$i" | ||||
| done | ||||
| 
 | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # sysroot | ||||
| mksquashfs "$MY_TMPDIR"/sysroot "$MY_TMPDIR"/root.squashfs.img \ | ||||
| 	   -noDataCompression -noFragmentCompression -noXattrCompression -noInodeCompression | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # verity | ||||
| ROOT_HASH=$(veritysetup format "$MY_TMPDIR"/root.squashfs.img "$MY_TMPDIR"/root.verity.img |& tail -1 | { read a b c; echo $c; } ) | ||||
| 
 | ||||
| echo "$ROOT_HASH" > "$MY_TMPDIR"/root-hash.txt | ||||
| 
 | ||||
| ROOT_UUID=${ROOT_HASH:32:8}-${ROOT_HASH:40:4}-${ROOT_HASH:44:4}-${ROOT_HASH:48:4}-${ROOT_HASH:52:12} | ||||
| HASH_UUID=${ROOT_HASH:0:8}-${ROOT_HASH:8:4}-${ROOT_HASH:12:4}-${ROOT_HASH:16:4}-${ROOT_HASH:20:12} | ||||
| 
 | ||||
| # ------------------------------------------------------------------------------ | ||||
| # make bootx64.efi | ||||
| echo -n "rd.shell=0 quiet video=efifb:nobgrt audit=0 selinux=0 roothash=$ROOT_HASH systemd.verity_root_data=PARTUUID=$ROOT_UUID systemd.verity_root_hash=PARTUUID=$HASH_UUID resume=PARTLABEL=swap raid=noautodetect" > "$MY_TMPDIR"/options.txt | ||||
| echo -n "$NAME $VERSION_ID" > "$MY_TMPDIR"/release.txt | ||||
| objcopy \ | ||||
|     --add-section .release="$MY_TMPDIR"/release.txt --change-section-vma .release=0x20000 \ | ||||
|     --add-section .cmdline="$MY_TMPDIR"/options.txt --change-section-vma .cmdline=0x30000 \ | ||||
|     ${LOGO:+--add-section .splash="$LOGO" --change-section-vma .splash=0x40000} \ | ||||
|     --add-section .linux="$MY_TMPDIR"/linux --change-section-vma .linux=0x2000000 \ | ||||
|     --add-section .initrd="$MY_TMPDIR"/initrd --change-section-vma .initrd=0x3000000 \ | ||||
|     "${BASEDIR}"/linuxx64.efi.stub "$MY_TMPDIR"/bootx64.efi | ||||
| 
 | ||||
| 
 | ||||
| mkdir -p "$OUTDIR" | ||||
| mv "$MY_TMPDIR"/root-hash.txt \ | ||||
|    "$MY_TMPDIR"/bootx64.efi \ | ||||
|    "$MY_TMPDIR"/root.squashfs.img \ | ||||
|    "$MY_TMPDIR"/root.verity.img \ | ||||
|    "$MY_TMPDIR"/release.txt \ | ||||
|    "$MY_TMPDIR"/options.txt \ | ||||
|    "$MY_TMPDIR"/linux \ | ||||
|    "$MY_TMPDIR"/initrd \ | ||||
|    "$OUTDIR" | ||||
							
								
								
									
										51
									
								
								quirks/nss_db.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								quirks/nss_db.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| 
 | ||||
| sed -i -e 's#files#files db#g' "$sysroot"/etc/nsswitch.conf | ||||
| mkdir -p "$sysroot"/usr/db | ||||
| sed -i -e 's#/var/db#/usr/db#g' "$sysroot"/lib64/libnss_db-2*.so "$sysroot"/var/db/Makefile | ||||
| 
 | ||||
| chroot "$sysroot" bash -c 'useradd -G wheel admin' | ||||
| egrep -e '^(adm|wheel):.*' "$sysroot"/etc/group > "$sysroot"/etc/group.admin | ||||
| egrep -e '^(adm|wheel):.*' "$sysroot"/etc/gshadow > "$sysroot"/etc/gshadow.admin | ||||
| 
 | ||||
| sed -i -e '/^wheel:.*/d;/^adm:.*/d' "$sysroot"/etc/group "$sysroot"/etc/gshadow | ||||
| sed -i -e '/^admin:.*/d' "$sysroot"/etc/passwd "$sysroot"/etc/shadow "$sysroot"/etc/group "$sysroot"/etc/gshadow | ||||
| 
 | ||||
| chroot "$sysroot" bash -c 'make -C /var/db /usr/db/passwd.db /usr/db/shadow.db /usr/db/gshadow.db /usr/db/group.db && >/etc/passwd && > /etc/shadow && >/etc/group && >/etc/gshadow' | ||||
| mv "$sysroot"/etc/group.admin "$sysroot"/etc/group | ||||
| mv "$sysroot"/etc/gshadow.admin "$sysroot"/etc/gshadow | ||||
| chroot "$sysroot" bash -c 'useradd admin; usermod -a -G wheel admin; echo -n admin | passwd --stdin admin' | ||||
| #chroot "$sysroot" bash -c 'passwd -e admin' | ||||
| 
 | ||||
| mkdir -p "$sysroot"/usr/share/factory/var | ||||
| mv "$sysroot"/etc/passwd "$sysroot"/etc/sub{u,g}id "$sysroot"/etc/shadow "$sysroot"/etc/group "$sysroot"/etc/gshadow "$sysroot"/usr/share/factory/var | ||||
| 
 | ||||
| sed -i -e 's!^# directory = /etc!directory = /var!g' "$sysroot"/etc/libuser.conf | ||||
| 
 | ||||
| for i in passwd shadow group gshadow .pwd.lock subuid subgid; do  | ||||
|     ln -sfnr "$sysroot"/var/"$i" "$sysroot"/etc/"$i"  | ||||
| done | ||||
| 
 | ||||
| sed -i -e 's#/etc/passwd#/var/passwd#g;s#/etc/npasswd#/var/npasswd#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/shadow#/var/shadow#g;s#/etc/nshadow#/var/nshadow#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/.pwdXXXXXX#/var/.pwdXXXXXX#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/passwd#/var/passwd#g;s#/etc/shadow#/var/shadow#g;s#/etc/gshadow#/var/gshadow#g;s#/etc/group#/var/group#g;s#/etc/subuid#/var/subuid#g;s#/etc/subgid#/var/subgid#g' "$sysroot"/usr/sbin/user{add,mod,del} "$sysroot"/usr/sbin/group{add,mod,del} | ||||
| sed -i -e 's#/etc/.pwd.lock#/var/.pwd.lock#g' \ | ||||
|     "$sysroot"/lib*/{,*/*/}libc.so.* \ | ||||
|     "$sysroot"/usr/lib*/librpmostree-1.so.1 \ | ||||
|     "$sysroot"/usr/lib/systemd/libsystemd-shared*.so | ||||
| 
 | ||||
| 
 | ||||
| mkdir -p "$sysroot"/usr/share/factory/home | ||||
| cp -avxr "$sysroot"/etc/skel "$sysroot"/usr/share/factory/home/admin | ||||
| chown -R +1000.+1000 "$sysroot"/usr/share/factory/home/admin | ||||
| 
 | ||||
| cat > "$sysroot"/usr/lib/tmpfiles.d/home.conf <<EOF | ||||
| C /data/home/admin - - - - - | ||||
| C /data/var/passwd - - - - - | ||||
| C /data/var/shadow - - - - - | ||||
| C /data/var/group - - - - - | ||||
| C /data/var/gshadow - - - - - | ||||
| C /data/var/subuid - - - - - | ||||
| C /data/var/subgid - - - - - | ||||
| C /data/var/etc - - - - - | ||||
| EOF | ||||
							
								
								
									
										31
									
								
								quirks/passwd.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								quirks/passwd.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | |||
| chroot "$sysroot" bash -c 'useradd admin; usermod -a -G wheel admin; echo -n admin | passwd --stdin admin' | ||||
| #chroot "$sysroot" bash -c 'passwd -e admin' | ||||
| 
 | ||||
| mkdir -p "$sysroot"/usr/share/factory/var | ||||
| mv "$sysroot"/etc/passwd "$sysroot"/etc/sub{u,g}id "$sysroot"/etc/shadow "$sysroot"/etc/group "$sysroot"/etc/gshadow "$sysroot"/usr/share/factory/var | ||||
| 
 | ||||
| sed -i -e 's!^# directory = /etc!directory = /var!g' "$sysroot"/etc/libuser.conf | ||||
| 
 | ||||
| for i in passwd shadow group gshadow .pwd.lock subuid subgid; do  | ||||
|     ln -sfnr "$sysroot"/var/"$i" "$sysroot"/etc/"$i"  | ||||
| done | ||||
| 
 | ||||
| sed -i -e 's#/etc/passwd#/var/passwd#g;s#/etc/npasswd#/var/npasswd#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/shadow#/var/shadow#g;s#/etc/nshadow#/var/nshadow#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/.pwdXXXXXX#/var/.pwdXXXXXX#g' "$sysroot"/usr/lib64/security/pam_unix.so | ||||
| sed -i -e 's#/etc/passwd#/var/passwd#g;s#/etc/shadow#/var/shadow#g;s#/etc/gshadow#/var/gshadow#g;s#/etc/group#/var/group#g;s#/etc/subuid#/var/subuid#g;s#/etc/subgid#/var/subgid#g' "$sysroot"/usr/sbin/user{add,mod,del} "$sysroot"/usr/sbin/group{add,mod,del} | ||||
| 
 | ||||
| mkdir -p "$sysroot"/usr/share/factory/home | ||||
| cp -avxr "$sysroot"/etc/skel "$sysroot"/usr/share/factory/home/admin | ||||
| chown -R +1000.+1000 "$sysroot"/usr/share/factory/home/admin | ||||
| 
 | ||||
| cat > "$sysroot"/usr/lib/tmpfiles.d/home.conf <<EOF | ||||
| C /data/home/admin - - - - - | ||||
| C /data/var/passwd - - - - - | ||||
| C /data/var/shadow - - - - - | ||||
| C /data/var/group - - - - - | ||||
| C /data/var/gshadow - - - - - | ||||
| C /data/var/subuid - - - - - | ||||
| C /data/var/subgid - - - - - | ||||
| C /data/var/etc - - - - - | ||||
| EOF | ||||
							
								
								
									
										24
									
								
								quirks/sssd.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								quirks/sssd.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| #--------------- | ||||
| # admin user | ||||
| cat > "$sysroot"/etc/sssd/sssd.conf <<EOF | ||||
| [sssd] | ||||
| domains=local | ||||
| config_file_version=2 | ||||
| services=nss,pam | ||||
| [domain/local] | ||||
| id_provider=local | ||||
| EOF | ||||
| chmod 0600 "$sysroot"/etc/sssd/sssd.conf | ||||
| 
 | ||||
| chroot "$sysroot" | ||||
| 
 | ||||
| chroot "$sysroot" bash -c 'authselect select sssd with-sudo with-fingerprint with-mkhomedir -f ; sssd -i & sleep 2; sss_useradd admin ; echo -n admin | passwd --stdin admin; echo -n root | passwd --stdin root; usermod -a -G wheel admin; kill %1; wait; :' | ||||
| 
 | ||||
| systemctl --root="$sysroot" enable sssd.service oddjobd.service | ||||
| mkdir -p "$sysroot"/usr/share/factory/var/lib | ||||
| mv "$sysroot"/var/lib/sss "$sysroot"/usr/share/factory/var/lib/ | ||||
| 
 | ||||
| cat >> "$sysroot"/usr/lib/tmpfiles.d/sssd.conf <<EOF | ||||
| C /var/lib/sss -    -    -    - - | ||||
| d /var/log/sssd 0750 root root - - | ||||
| EOF | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Harald Hoyer
						Harald Hoyer