diff --git a/Makefile b/Makefile index 0de9948..f439221 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -Version=0.15.0 +Version=0.16.0 PREFIX = /usr/local SYSCONFDIR = /etc @@ -18,6 +18,7 @@ LIBS_BASE = \ lib/util.sh \ lib/util-mount.sh \ lib/util-msg.sh \ + lib/util-chroot.sh \ lib/util-fstab.sh SHARED_BASE = \ diff --git a/lib/util-chroot.sh b/lib/util-chroot.sh new file mode 100644 index 0000000..531be8a --- /dev/null +++ b/lib/util-chroot.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +create_min_fs(){ + msg "Creating install root at %s" "$1" + mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,run,etc} + mkdir -m 1777 -p $1/tmp + mkdir -m 0555 -p $1/{sys,proc} +} + +check_root() { + (( EUID == 0 )) && return + if type -P sudo >/dev/null; then + exec sudo -- "${orig_argv[@]}" + else + exec su root -c "$(printf ' %q' "${orig_argv[@]}")" + fi +} + +is_btrfs() { + [[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] +} + +subvolume_delete_recursive() { + local subvol + + is_btrfs "$1" || return 0 + + while IFS= read -d $'\0' -r subvol; do + if ! btrfs subvolume delete "$subvol" &>/dev/null; then + error "Unable to delete subvolume %s" "$subvol" + return 1 + fi + done < <(find "$1" -xdev -depth -inum 256 -print0) + + return 0 +} diff --git a/lib/util-iso-boot.sh b/lib/util-iso-boot.sh deleted file mode 100644 index 6088a59..0000000 --- a/lib/util-iso-boot.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -prepare_initcpio(){ - msg2 "Copying initcpio ..." - cp /etc/initcpio/hooks/miso* $1/etc/initcpio/hooks - cp /etc/initcpio/install/miso* $1/etc/initcpio/install - cp /etc/initcpio/miso_shutdown $1/etc/initcpio -} - -prepare_initramfs(){ - cp ${DATADIR}/mkinitcpio.conf $1/etc/mkinitcpio-${iso_name}.conf - local _kernver=$(cat $1/usr/lib/modules/*/version) - if [[ -n ${gpgkey} ]]; then - su ${OWNER} -c "gpg --export ${gpgkey} >${MT_USERCONFDIR}/gpgkey" - exec 17<>${MT_USERCONFDIR}/gpgkey - fi - MISO_GNUPG_FD=${gpgkey:+17} chroot-run $1 \ - /usr/bin/mkinitcpio -k ${_kernver} \ - -c /etc/mkinitcpio-${iso_name}.conf \ - -g /boot/initramfs.img - - if [[ -n ${gpgkey} ]]; then - exec 17<&- - fi - if [[ -f ${MT_USERCONFDIR}/gpgkey ]]; then - rm ${MT_USERCONFDIR}/gpgkey - fi -} - -prepare_boot_extras(){ - cp $1/boot/intel-ucode.img $2/intel_ucode.img - cp $1/usr/share/licenses/intel-ucode/LICENSE $2/intel_ucode.LICENSE - cp $1/boot/memtest86+/memtest.bin $2/memtest - cp $1/usr/share/licenses/common/GPL2/license.txt $2/memtest.COPYING -} - -prepare_grub(){ - local platform=i386-pc img='core.img' grub=$3/boot/grub efi=$3/efi/boot \ - lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub data=$1/usr/share/grub - - prepare_dir ${grub}/${platform} - - cp ${theme}/cfg/*.cfg ${grub} - - cp ${lib}/${platform}/* ${grub}/${platform} - - msg2 "Building %s ..." "${img}" - - grub-mkimage -d ${grub}/${platform} -o ${grub}/${platform}/${img} -O ${platform} -p ${prefix} biosdisk iso9660 - - cat ${grub}/${platform}/cdboot.img ${grub}/${platform}/${img} > ${grub}/${platform}/eltorito.img - - case ${target_arch} in - 'i686') - platform=i386-efi - img=bootia32.efi - ;; - 'x86_64') - platform=x86_64-efi - img=bootx64.efi - ;; - esac - - prepare_dir ${efi} - prepare_dir ${grub}/${platform} - - cp ${lib}/${platform}/* ${grub}/${platform} - - msg2 "Building %s ..." "${img}" - - grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660 - - prepare_dir ${grub}/themes - cp -r ${theme}/themes/${iso_name}-live ${grub}/themes/ - cp ${data}/unicode.pf2 ${grub} - cp -r ${theme}/{locales,tz} ${grub} - - local size=4M mnt="${mnt_dir}/efiboot" efi_img="$3/efi.img" - msg2 "Creating fat image of %s ..." "${size}" - truncate -s ${size} "${efi_img}" - mkfs.fat -n MISO_EFI "${efi_img}" &>/dev/null - prepare_dir "${mnt}" - mount_img "${efi_img}" "${mnt}" - prepare_dir ${mnt}/efi/boot - msg2 "Building %s ..." "${img}" - grub-mkimage -d ${grub}/${platform} -o ${mnt}/efi/boot/${img} -O ${platform} -p ${prefix} iso9660 - umount_img "${mnt}" -} diff --git a/lib/util-iso-chroot.sh b/lib/util-iso-chroot.sh new file mode 100644 index 0000000..704a9b9 --- /dev/null +++ b/lib/util-iso-chroot.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +configure_hosts(){ + sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -i $1/etc/hosts +} + +copy_from_cache(){ + local list="${tmp_dir}"/mhwd-cache.list + chroot-run \ + -r "${bindmounts_ro[*]}" \ + -w "${bindmounts_rw[*]}" \ + -B "${build_mirror}/${target_branch}" \ + "$1" \ + pacman -v -Syw $2 --noconfirm || return 1 + chroot-run \ + -r "${bindmounts_ro[*]}" \ + -w "${bindmounts_rw[*]}" \ + -B "${build_mirror}/${target_branch}" \ + "$1" \ + pacman -v -Sp $2 --noconfirm > "$list" + sed -ni '/.pkg.tar.xz/p' "$list" + sed -i "s/.*\///" "$list" + + msg2 "Copying mhwd package cache ..." + rsync -v --files-from="$list" /var/cache/pacman/pkg "$1${mhwd_repo}" +} + +chroot_create(){ + [[ "${1##*/}" == "rootfs" ]] && local flag="-L" + setarch "${target_arch}" \ + mkchroot ${mkchroot_args[*]} ${flag} $@ +} + +chroot_clean(){ + msg "Cleaning up ..." + for image in "$1"/*fs; do + [[ -d ${image} ]] || continue + local name=${image##*/} + if [[ $name != "mhwdfs" ]];then + msg2 "Deleting chroot [%s] (%s) ..." "$name" "${1##*/}" + lock 9 "${image}.lock" "Locking chroot '${image}'" + if [[ "$(stat -f -c %T "${image}")" == btrfs ]]; then + { type -P btrfs && btrfs subvolume delete "${image}"; } #&> /dev/null + fi + rm -rf --one-file-system "${image}" + fi + done + exec 9>&- + rm -rf --one-file-system "$1" +} diff --git a/lib/util-iso-image.sh b/lib/util-iso-image.sh deleted file mode 100644 index f502438..0000000 --- a/lib/util-iso-image.sh +++ /dev/null @@ -1,313 +0,0 @@ -#!/bin/bash -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; version 2 of the License. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -copy_overlay(){ - if [[ -e $1 ]];then - msg2 "Copying [%s] ..." "${1##*/}" - if [[ -L $1 ]];then - cp -a --no-preserve=ownership $1/* $2 - else - cp -LR $1/* $2 - fi - fi -} - -add_svc_rc(){ - if [[ -f $1/etc/init.d/$2 ]];then - msg2 "Setting %s ..." "$2" - chroot $1 rc-update add $2 default &>/dev/null - fi -} - -add_svc_sd(){ - if [[ -f $1/etc/systemd/system/$2.service ]] || \ - [[ -f $1/usr/lib/systemd/system/$2.service ]];then - msg2 "Setting %s ..." "$2" - chroot $1 systemctl enable $2 &>/dev/null - fi -} - -set_xdm(){ - if [[ -f $1/etc/conf.d/xdm ]];then - local conf='DISPLAYMANAGER="'${displaymanager}'"' - sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm - fi -} - -configure_mhwd_drivers(){ - local path=$1${mhwd_repo}/ \ - drv_path=$1/var/lib/mhwd/db/pci/graphic_drivers - info "Configuring mwwd db ..." - if [ -z "$(ls $path | grep catalyst-utils 2> /dev/null)" ]; then - msg2 "Disabling Catalyst driver" - mkdir -p $drv_path/catalyst/ - touch $drv_path/catalyst/MHWDCONFIG - fi - if [ -z "$(ls $path | grep nvidia-utils 2> /dev/null)" ]; then - msg2 "Disabling Nvidia driver" - mkdir -p $drv_path/nvidia/ - touch $drv_path/nvidia/MHWDCONFIG - msg2 "Disabling Nvidia Bumblebee driver" - mkdir -p $drv_path/hybrid-intel-nvidia-bumblebee/ - touch $drv_path/hybrid-intel-nvidia-bumblebee/MHWDCONFIG - fi - if [ -z "$(ls $path | grep nvidia-304xx-utils 2> /dev/null)" ]; then - msg2 "Disabling Nvidia 304xx driver" - mkdir -p $drv_path/nvidia-304xx/ - touch $drv_path/nvidia-304xx/MHWDCONFIG - fi - if [ -z "$(ls $path | grep nvidia-340xx-utils 2> /dev/null)" ]; then - msg2 "Disabling Nvidia 340xx driver" - mkdir -p $drv_path/nvidia-340xx/ - touch $drv_path/nvidia-340xx/MHWDCONFIG - fi - if [ -z "$(ls $path | grep xf86-video-amdgpu 2> /dev/null)" ]; then - msg2 "Disabling AMD gpu driver" - mkdir -p $drv_path/xf86-video-amdgpu/ - touch $drv_path/xf86-video-amdgpu/MHWDCONFIG - fi -} - -configure_lsb(){ - if [ -e $1/etc/lsb-release ] ; then - msg2 "Configuring lsb-release" - sed -i -e "s/^.*DISTRIB_RELEASE.*/DISTRIB_RELEASE=${dist_release}/" $1/etc/lsb-release - sed -i -e "s/^.*DISTRIB_CODENAME.*/DISTRIB_CODENAME=${dist_codename}/" $1/etc/lsb-release - fi -} - -configure_logind(){ - msg2 "Configuring logind ..." - local conf=$1/etc/$2/logind.conf - sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf" - sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf" - sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf" -} - -configure_journald(){ - msg2 "Configuring journald ..." - local conf=$1/etc/systemd/journald.conf - sed -i 's/#\(Storage=\)auto/\1volatile/' "$conf" -} - -configure_services(){ - info "Configuring [%s]" "${initsys}" - case ${initsys} in - 'openrc') - for svc in ${enable_openrc[@]}; do - [[ $svc == "xdm" ]] && set_xdm "$1" - add_svc_rc "$1" "$svc" - done - for svc in ${enable_openrc_live[@]}; do - add_svc_rc "$1" "$svc" - done - ;; - 'systemd') - for svc in ${enable_systemd[@]}; do - add_svc_sd "$1" "$svc" - done - for svc in ${enable_systemd_live[@]}; do - add_svc_sd "$1" "$svc" - done - ;; - esac - info "Done configuring [%s]" "${initsys}" -} - -write_live_session_conf(){ - local path=$1${SYSCONFDIR} - [[ ! -d $path ]] && mkdir -p $path - local conf=$path/live.conf - msg2 "Writing %s" "${conf##*/}" - echo '# live session configuration' > ${conf} - echo '' >> ${conf} - echo '# autologin' >> ${conf} - echo "autologin=${autologin}" >> ${conf} - echo '' >> ${conf} - echo '# login shell' >> ${conf} - echo "login_shell=${login_shell}" >> ${conf} - echo '' >> ${conf} - echo '# live username' >> ${conf} - echo "username=${username}" >> ${conf} - echo '' >> ${conf} - echo '# live password' >> ${conf} - echo "password=${password}" >> ${conf} - echo '' >> ${conf} - echo '# live group membership' >> ${conf} - echo "addgroups='${addgroups}'" >> ${conf} - if [[ -n ${smb_workgroup} ]];then - echo '' >> ${conf} - echo '# samba workgroup' >> ${conf} - echo "smb_workgroup=${smb_workgroup}" >> ${conf} - fi -} - -configure_hosts(){ - sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -i $1/etc/hosts -} - -configure_system(){ - case ${initsys} in - 'systemd') - configure_logind "$1" "systemd" - configure_journald "$1" - - # Prevent some services to be started in the livecd - echo 'File created by manjaro-tools. See systemd-update-done.service(8).' \ - | tee "${path}/etc/.updated" >"${path}/var/.updated" - - msg2 "Disable systemd-gpt-auto-generator" - ln -sf /dev/null "${path}/usr/lib/systemd/system-generators/systemd-gpt-auto-generator" - ;; - 'openrc') - configure_logind "$1" "elogind" -# local hn='hostname="'${hostname}'"' -# sed -i -e "s|^.*hostname=.*|${hn}|" $1/etc/conf.d/hostname - ;; - esac - echo ${hostname} > $1/etc/hostname -} - -configure_thus(){ - msg2 "Configuring Thus ..." - source "$1/etc/mkinitcpio.d/${kernel}.preset" - local conf="$1/etc/thus.conf" - echo "[distribution]" > "$conf" - echo "DISTRIBUTION_NAME = \"${dist_name} Linux\"" >> "$conf" - echo "DISTRIBUTION_VERSION = \"${dist_release}\"" >> "$conf" - echo "SHORT_NAME = \"${dist_name}\"" >> "$conf" - echo "[install]" >> "$conf" - echo "LIVE_MEDIA_SOURCE = \"/run/miso/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf" - echo "LIVE_MEDIA_DESKTOP = \"/run/miso/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf" - echo "LIVE_MEDIA_TYPE = \"squashfs\"" >> "$conf" - echo "LIVE_USER_NAME = \"${username}\"" >> "$conf" - echo "KERNEL = \"${kernel}\"" >> "$conf" - echo "VMLINUZ = \"$(echo ${ALL_kver} | sed s'|/boot/||')\"" >> "$conf" - echo "INITRAMFS = \"$(echo ${default_image} | sed s'|/boot/||')\"" >> "$conf" - echo "FALLBACK = \"$(echo ${fallback_image} | sed s'|/boot/||')\"" >> "$conf" - - if [[ -f $1/usr/share/applications/thus.desktop && -f $1/usr/bin/kdesu ]];then - sed -i -e 's|sudo|kdesu|g' $1/usr/share/applications/thus.desktop - fi -} - -configure_live_image(){ - msg "Configuring [livefs]" - configure_hosts "$1" - configure_system "$1" - configure_services "$1" - configure_calamares "$1" - [[ ${edition} == "sonar" ]] && configure_thus "$1" - write_live_session_conf "$1" - msg "Done configuring [livefs]" -} - -make_repo(){ - repo-add $1${mhwd_repo}/mhwd.db.tar.gz $1${mhwd_repo}/*pkg*z -} - -copy_from_cache(){ - local list="${tmp_dir}"/mhwd-cache.list - chroot-run \ - -r "${mountargs_ro}" \ - -w "${mountargs_rw}" \ - -B "${build_mirror}/${target_branch}" \ - "$1" \ - pacman -v -Syw $2 --noconfirm || return 1 - chroot-run \ - -r "${mountargs_ro}" \ - -w "${mountargs_rw}" \ - -B "${build_mirror}/${target_branch}" \ - "$1" \ - pacman -v -Sp $2 --noconfirm > "$list" - sed -ni '/.pkg.tar.xz/p' "$list" - sed -i "s/.*\///" "$list" - - msg2 "Copying mhwd package cache ..." - rsync -v --files-from="$list" /var/cache/pacman/pkg "$1${mhwd_repo}" -} - -chroot_create(){ - [[ "${1##*/}" == "rootfs" ]] && local flag="-L" - setarch "${target_arch}" \ - mkchroot ${mkchroot_args[*]} ${flag} $@ -} - -clean_iso_root(){ - msg2 "Deleting isoroot [%s] ..." "${1##*/}" - rm -rf --one-file-system "$1" -} - -chroot_clean(){ - msg "Cleaning up ..." - for image in "$1"/*fs; do - [[ -d ${image} ]] || continue - local name=${image##*/} - if [[ $name != "mhwdfs" ]];then - msg2 "Deleting chroot [%s] (%s) ..." "$name" "${1##*/}" - lock 9 "${image}.lock" "Locking chroot '${image}'" - if [[ "$(stat -f -c %T "${image}")" == btrfs ]]; then - { type -P btrfs && btrfs subvolume delete "${image}"; } #&> /dev/null - fi - rm -rf --one-file-system "${image}" - fi - done - exec 9>&- - rm -rf --one-file-system "$1" -} - -clean_up_image(){ - msg2 "Cleaning [%s]" "${1##*/}" - - local path - if [[ ${1##*/} == 'mhwdfs' ]];then - path=$1/var - if [[ -d $path ]];then - find "$path" -mindepth 0 -delete &> /dev/null - fi - path=$1/etc - if [[ -d $path ]];then - find "$path" -mindepth 0 -delete &> /dev/null - fi - else - [[ -f "$1/etc/locale.gen.bak" ]] && mv "$1/etc/locale.gen.bak" "$1/etc/locale.gen" - [[ -f "$1/etc/locale.conf.bak" ]] && mv "$1/etc/locale.conf.bak" "$1/etc/locale.conf" - path=$1/boot - if [[ -d "$path" ]]; then - find "$path" -name 'initramfs*.img' -delete &> /dev/null - fi - path=$1/var/lib/pacman/sync - if [[ -d $path ]];then - find "$path" -type f -delete &> /dev/null - fi - path=$1/var/cache/pacman/pkg - if [[ -d $path ]]; then - find "$path" -type f -delete &> /dev/null - fi - path=$1/var/log - if [[ -d $path ]]; then - find "$path" -type f -delete &> /dev/null - fi - path=$1/var/tmp - if [[ -d $path ]];then - find "$path" -mindepth 1 -delete &> /dev/null - fi - path=$1/tmp - if [[ -d $path ]];then - find "$path" -mindepth 1 -delete &> /dev/null - fi - fi - find "$1" -name *.pacnew -name *.pacsave -name *.pacorig -delete - file=$1/boot/grub/grub.cfg - if [[ -f "$file" ]]; then - rm $file - fi -}