Refactored.

All function body is indented.
kaiten-yaki-* has main function.
"sourced" style is not enforced.
This commit is contained in:
Suikan 2021-07-01 21:42:41 +09:00
parent a5ecca9860
commit f1a43e9c54
6 changed files with 475 additions and 460 deletions

View file

@ -5,91 +5,91 @@
function confirmation(){ function confirmation(){
# Sanity check for volume group name # Sanity check for volume group name
if echo ${VGNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume group name. if echo ${VGNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume group name.
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : VGNAME is "${VGNAME}" ***** ***** ERROR : VGNAME is "${VGNAME}" *****
THe "-" is not allowed in the volume name. THe "-" is not allowed in the volume name.
Check passphrase and config.txt Check passphrase and config.txt
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # "-" is found in the volume group name. fi # "-" is found in the volume group name.
# Sanity check for root volume name # Sanity check for root volume name
if echo ${LVROOTNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume name. if echo ${LVROOTNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume name.
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : LVROOTNAME is "${LVROOTNAME}" ***** ***** ERROR : LVROOTNAME is "${LVROOTNAME}" *****
THe "-" is not allowed in the volume name. THe "-" is not allowed in the volume name.
Check passphrase and config.txt Check passphrase and config.txt
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # "-" is found in the volume name. fi # "-" is found in the volume name.
# Sanity check for swap volume name # Sanity check for swap volume name
if echo ${LVSWAPNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume name. if echo ${LVSWAPNAME} | grep "-" -i > /dev/null ; then # "-" is found in the volume name.
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : LVSWAPNAME is "${LVSWAPNAME}" ***** ***** ERROR : LVSWAPNAME is "${LVSWAPNAME}" *****
THe "-" is not allowed in the volume name. THe "-" is not allowed in the volume name.
Check passphrase and config.txt Check passphrase and config.txt
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # "-" is found in the volume name. fi # "-" is found in the volume name.
# For surre ask the config.sh is edited # For surre ask the config.sh is edited
cat <<HEREDOC cat <<- HEREDOC
The destination logical volume label is "${LVROOTNAME}" The destination logical volume label is "${LVROOTNAME}"
"${LVROOTNAME}" uses ${LVROOTSIZE} of the LVM volume group. "${LVROOTNAME}" uses ${LVROOTSIZE} of the LVM volume group.
Are you ready to install? [Y/N] Are you ready to install? [Y/N]
HEREDOC HEREDOC
read YESNO read YESNO
if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # if YES fi # if YES
# For sure ask ready to erase. # For sure ask ready to erase.
if [ ${ERASEALL} -eq 1 ] ; then if [ ${ERASEALL} -eq 1 ] ; then
echo "Are you sure you want to erase entire ${DEV}? [Y/N]" echo "Are you sure you want to erase entire ${DEV}? [Y/N]"
read YESNO read YESNO
if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<HEREDOC 1>&2 cat <<-HEREDOC 1>&2
Check config.sh. The variable ERASEALL is ${ERASEALL}. Check config.sh. The variable ERASEALL is ${ERASEALL}.
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # if YES fi # if YES
fi # if erase all fi # if erase all
# ----- Set Passphrase ----- # ----- Set Passphrase -----
# Input passphrase # Input passphrase
echo "Type passphrase for the disk encryption." echo "Type passphrase for the disk encryption."
read -sr PASSPHRASE read -sr PASSPHRASE
export PASSPHRASE export PASSPHRASE
echo "Type passphrase again, to confirm." echo "Type passphrase again, to confirm."
read -sr PASSPHRASE_C read -sr PASSPHRASE_C
# Validate whether both are indentical or not # Validate whether both are indentical or not
if [ ${PASSPHRASE} != ${PASSPHRASE_C} ] ; then if [ ${PASSPHRASE} != ${PASSPHRASE_C} ] ; then
cat <<HEREDOC 1>&2 cat <<-HEREDOC 1>&2
***** ERROR : Passphrase doesn't match ***** ***** ERROR : Passphrase doesn't match *****
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # passphrase validation fi # passphrase validation
# succesfull return # succesfull return
return 0 return 0
} }

View file

@ -5,44 +5,43 @@
function parainstall() { function parainstall() {
# While the /etc/default/grub in the install target is NOT existing, keep sleeping. # While the /etc/default/grub in the install target is NOT existing, keep sleeping.
# If installer terminated without file copy, this script also terminates. # If installer terminated without file copy, this script also terminates.
while [ ! -e ${TARGETMOUNTPOINT}/etc/default/grub ] while [ ! -e ${TARGETMOUNTPOINT}/etc/default/grub ]
do do
sleep 1 # 1sec. sleep 1 # 1sec.
# Check if installer still exist # Check if installer still exist
if ! ps $installer_pid > /dev/null ; then # If not exists if ! ps $installer_pid > /dev/null ; then # If not exists
cat <<HEREDOC 1>&2 cat <<-HEREDOC 1>&2
The installer terminated unexpectedly. The installer terminated unexpectedly.
Installation process terminated. Installation process terminated.
HEREDOC HEREDOC
return 1 return 1
fi fi
done # while done # while
# Perhaps, too neuvous. Wait 1 more sectond to avoid the rece condition. # Perhaps, too neuvous. Wait 1 more sectond to avoid the rece condition.
sleep 1 # 1sec. sleep 1 # 1sec.
# Make target GRUB aware to the crypt partition # Make target GRUB aware to the crypt partition
# This must do it after start of the file copy by installer, but before the end of the file copy. # This must do it after start of the file copy by installer, but before the end of the file copy.
# If the environment is not GUI, keep quiet not to bother the TUI installer. # If the environment is not GUI, keep quiet not to bother the TUI installer.
if [ ${PARAINSTMSG} -eq 1 ]; then if [ ${PARAINSTMSG} -eq 1 ]; then
echo "...Add GRUB_ENABLE_CRYPTODISK entry to ${TARGETMOUNTPOINT}/etc/default/grub " echo "...Add GRUB_ENABLE_CRYPTODISK entry to ${TARGETMOUNTPOINT}/etc/default/grub "
fi fi
echo "GRUB_ENABLE_CRYPTODISK=y" >> ${TARGETMOUNTPOINT}/etc/default/grub echo "GRUB_ENABLE_CRYPTODISK=y" >> ${TARGETMOUNTPOINT}/etc/default/grub
# And then, wait for the end of installer process # And then, wait for the end of installer process
# If the environment is not GUI, keep quiet not to bother the TUI installer. # If the environment is not GUI, keep quiet not to bother the TUI installer.
if [ ${PARAINSTMSG} -eq 1 ]; then if [ ${PARAINSTMSG} -eq 1 ]; then
echo "...Waiting for the end of GUI/TUI installer." echo "...Waiting for the end of GUI/TUI installer."
fi fi
wait $installer_pid wait $installer_pid
# succesfull return # succesfull return
return 0 return 0
} # para install } # para install

View file

@ -2,29 +2,29 @@
function parainstall_msg() { function parainstall_msg() {
cat <<HEREDOC cat <<- HEREDOC
****************************************************************************** ******************************************************************************
The pre-install process is done. We are ready to install the Linux to the The pre-install process is done. We are ready to install the Linux to the
target storage device. By pressing return key, GUI/TUI installer starts. target storage device. By pressing return key, GUI/TUI installer starts.
Please pay attention to the partition/logical volume mapping configuration. Please pay attention to the partition/logical volume mapping configuration.
In this installation, you have to map the previously created partitions/logical In this installation, you have to map the previously created partitions/logical
volumes to the appropriate directories of the target system as followings : volumes to the appropriate directories of the target system as followings :
HEREDOC HEREDOC
# In the EFI system, add this mapping # In the EFI system, add this mapping
if [ ${ISEFI} -eq 1 ] ; then if [ ${ISEFI} -eq 1 ] ; then
echo "/boot/efi : ${DEV}${EFIPARTITION}" echo "/boot/efi : ${DEV}${EFIPARTITION}"
fi fi
# Root volume mapping # Root volume mapping
echo "/ : /dev/mapper/${VGNAME}-${LVROOTNAME}" echo "/ : /dev/mapper/${VGNAME}-${LVROOTNAME}"
# In case of erased storage, add this mapping # In case of erased storage, add this mapping
if [ ${ERASEALL} -eq 1 ] ; then if [ ${ERASEALL} -eq 1 ] ; then
echo "swap : /dev/mapper/${VGNAME}-${LVSWAPNAME}" echo "swap : /dev/mapper/${VGNAME}-${LVSWAPNAME}"
fi fi
return 0 return 0
} }

View file

@ -6,8 +6,8 @@
function pre_install() { function pre_install() {
# ----- Erase entire disk, create partitions, format them and encrypt the LUKS partition ----- # ----- Erase entire disk, create partitions, format them and encrypt the LUKS partition -----
if [ ${ERASEALL} -eq 1 ] ; then if [ ${ERASEALL} -eq 1 ] ; then
# Assign specified space and rest of disk to the EFI and LUKS partition, respectively. # Assign specified space and rest of disk to the EFI and LUKS partition, respectively.
if [ ${ISEFI} -eq 1 ] ; then if [ ${ISEFI} -eq 1 ] ; then
@ -30,66 +30,66 @@ if [ ${ERASEALL} -eq 1 ] ; then
dd if=/dev/zero of=${DEV} bs=512 count=1 dd if=/dev/zero of=${DEV} bs=512 count=1
# Create MBR and allocate max storage for Linux partition # Create MBR and allocate max storage for Linux partition
echo "...Create a Linux partition on ${DEV} with MBR." echo "...Create a Linux partition on ${DEV} with MBR."
sfdisk ${DEV} <<HEREDOC sfdisk ${DEV} <<- HEREDOC
2M,,L 2M,,L
HEREDOC HEREDOC
fi # if EFI firmware fi # if EFI firmware
# Encrypt the partition to install Linux # Encrypt the partition to install Linux
echo "...Initialize ${DEV}${CRYPTPARTITION} as crypt partition" echo "...Initialize ${DEV}${CRYPTPARTITION} as crypt partition"
printf %s "${PASSPHRASE}" | cryptsetup luksFormat --type=luks1 --key-file - --batch-mode "${DEV}${CRYPTPARTITION}" printf %s "${PASSPHRASE}" | cryptsetup luksFormat --type=luks1 --key-file - --batch-mode "${DEV}${CRYPTPARTITION}"
fi # if erase all fi # if erase all
# ----- Open the LUKS partition ----- # ----- Open the LUKS partition -----
# Open the crypt partition. # Open the crypt partition.
echo "...Open a crypt partition ${DEV}${CRYPTPARTITION} as \"${CRYPTPARTNAME}\"" echo "...Open a crypt partition ${DEV}${CRYPTPARTITION} as \"${CRYPTPARTNAME}\""
printf %s "${PASSPHRASE}" | cryptsetup open -d - "${DEV}${CRYPTPARTITION}" ${CRYPTPARTNAME} printf %s "${PASSPHRASE}" | cryptsetup open -d - "${DEV}${CRYPTPARTITION}" ${CRYPTPARTNAME}
# Check whether successful open. If mapped, it is successful. # Check whether successful open. If mapped, it is successful.
if [ ! -e /dev/mapper/${CRYPTPARTNAME} ] ; then if [ ! -e /dev/mapper/${CRYPTPARTNAME} ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : Cannot open LUKS volume "${CRYPTPARTNAME}" on ${DEV}${CRYPTPARTITION}. ***** ***** ERROR : Cannot open LUKS volume "${CRYPTPARTNAME}" on ${DEV}${CRYPTPARTITION}. *****
Check passphrase and config.txt Check passphrase and config.txt
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # if crypt volume is unable to open fi # if crypt volume is unable to open
# ----- Configure the LVM in LUKS volume ----- # ----- Configure the LVM in LUKS volume -----
# Check volume group ${VGNAME} exist or not # Check volume group ${VGNAME} exist or not
if vgdisplay -s ${VGNAME} &> /dev/null ; then # if exist if vgdisplay -s ${VGNAME} &> /dev/null ; then # if exist
echo "...Volume group ${VGNAME} already exist. Skipped to create. No problem." echo "...Volume group ${VGNAME} already exist. Skipped to create. No problem."
else else
echo "...Initialize a physical volume on \"${CRYPTPARTNAME}\"" echo "...Initialize a physical volume on \"${CRYPTPARTNAME}\""
pvcreate /dev/mapper/${CRYPTPARTNAME} pvcreate /dev/mapper/${CRYPTPARTNAME}
echo "...And then create Volume group \"${VGNAME}\"." echo "...And then create Volume group \"${VGNAME}\"."
vgcreate ${VGNAME} /dev/mapper/${CRYPTPARTNAME} vgcreate ${VGNAME} /dev/mapper/${CRYPTPARTNAME}
fi # if /dev/volume-groupt exist fi # if /dev/volume-groupt exist
# Create a SWAP Logical Volume on VG, if it doesn't exist # Create a SWAP Logical Volume on VG, if it doesn't exist
if [ -e /dev/mapper/${VGNAME}-${LVSWAPNAME} ] ; then if [ -e /dev/mapper/${VGNAME}-${LVSWAPNAME} ] ; then
echo "...Swap volume already exist. Skipped to create. No problem." echo "...Swap volume already exist. Skipped to create. No problem."
else else
echo "...Create logical volume \"${LVSWAPNAME}\" on \"${VGNAME}\"." echo "...Create logical volume \"${LVSWAPNAME}\" on \"${VGNAME}\"."
lvcreate -L ${LVSWAPSIZE} -n ${LVSWAPNAME} ${VGNAME} lvcreate -L ${LVSWAPSIZE} -n ${LVSWAPNAME} ${VGNAME}
fi # if /dev/mapper/swap volume already exit. fi # if /dev/mapper/swap volume already exit.
# Create a ROOT Logical Volume on VG. # Create a ROOT Logical Volume on VG.
if [ -e /dev/mapper/${VGNAME}-${LVROOTNAME} ] ; then if [ -e /dev/mapper/${VGNAME}-${LVROOTNAME} ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : Logical volume "${VGNAME}-${LVROOTNAME}" already exists. ***** ***** ERROR : Logical volume "${VGNAME}-${LVROOTNAME}" already exists. *****
Check LVROOTNAME environment variable in config.txt. Check LVROOTNAME environment variable in config.txt.
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
else else
echo "...Create logical volume \"${LVROOTNAME}\" on \"${VGNAME}\"." echo "...Create logical volume \"${LVROOTNAME}\" on \"${VGNAME}\"."
lvcreate -l ${LVROOTSIZE} -n ${LVROOTNAME} ${VGNAME} lvcreate -l ${LVROOTSIZE} -n ${LVROOTNAME} ${VGNAME}
fi # if the root volun already exist fi # if the root volun already exist
# successful return # successful return
return 0 return 0
} }

View file

@ -1,162 +1,170 @@
#!/bin/bash -u #!/bin/bash -u
# Load configuration parameter function main() {
source config.sh # Load configuration parameter
source config.sh
# Load functions # Load functions
source common/confirmation.sh source common/confirmation.sh
source common/preinstall.sh source common/preinstall.sh
source common/parainstall.sh source common/parainstall.sh
source common/parainstall_msg.sh source common/parainstall_msg.sh
# Varidate whether script is executed as sourced or not # Varidate whether script is executed as sourced or not
(return 0 2>/dev/null) && sourced=1 || sourced=0 (return 0 2>/dev/null) && sourced=1 || sourced=0
if [ $sourced -eq 0 ] ; then if [ $sourced -eq 0 ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : Must execute as "sourced" ***** ***** ERROR : Must execute as "sourced" *****
Execute as following : Execute as following :
source ubuntu-kaiten-yaki.sh source ubuntu-kaiten-yaki.sh
Installation terminated. Installation terminated.
HEREDOC HEREDOC
exit # use "exit" instead of "return", if not "sourced" execusion exit # use "exit" instead of "return", if not "sourced" execusion
fi # "sourced" validation fi # "sourced" validation
# This is the mount point of the install target. # This is the mount point of the install target.
export TARGETMOUNTPOINT="/target" export TARGETMOUNTPOINT="/target"
# 1 : Show message during GUI/TUI installer, 0 : Do not show. # 1 : Show message during GUI/TUI installer, 0 : Do not show.
export PARAINSTMSG=1 export PARAINSTMSG=1
# Distribution check # Distribution check
if ! uname -a | grep ubuntu -i > /dev/null ; then # "Ubuntu" is not found in the OS name. if ! uname -a | grep ubuntu -i > /dev/null ; then # "Ubuntu" is not found in the OS name.
echo "*******************************************************************************" echo "*******************************************************************************"
uname -a uname -a
cat <<HEREDOC cat <<- HEREDOC
******************************************************************************* *******************************************************************************
This system seems to be not Ubuntu, while this script is dediated to the Ubuntu. This system seems to be not Ubuntu, while this script is dediated to the Ubuntu.
Are you sure you want to run this script? [Y/N] Are you sure you want to run this script? [Y/N]
HEREDOC HEREDOC
read YESNO read YESNO
if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return return 1
fi # if YES fi # if YES
fi # "Ubuntu" is not found in the OS name. fi # "Ubuntu" is not found in the OS name.
# ******************************************************************************* # *******************************************************************************
# Confirmation before installation # Confirmation before installation
# ******************************************************************************* # *******************************************************************************
# Common part of the parameter confirmation # Common part of the parameter confirmation
if ! confirmation ; then if ! confirmation ; then
return 1 return 1
fi fi
# ******************************************************************************* # *******************************************************************************
# Pre-install stage # Pre-install stage
# ******************************************************************************* # *******************************************************************************
# Common part of the pre-install stage # Common part of the pre-install stage
if ! pre_install ; then if ! pre_install ; then
return 1 return 1
fi fi
# ******************************************************************************* # *******************************************************************************
# Para-install stage # Para-install stage
# ******************************************************************************* # *******************************************************************************
# Show common message to let the operator focus on the critical part # Show common message to let the operator focus on the critical part
parainstall_msg parainstall_msg
# Ubuntu dependent message # Ubuntu dependent message
cat <<HEREDOC cat <<- HEREDOC
************************ CAUTION! CAUTION! CAUTION! **************************** ************************ CAUTION! CAUTION! CAUTION! ****************************
Make sure to click "Continue Testing", at the end of the Ubiquity installer. Make sure to click "Continue Testing", at the end of the Ubiquity installer.
Just exit the installer without rebooting. Just exit the installer without rebooting.
Type return key to start Ubiquity. Type return key to start Ubiquity.
HEREDOC HEREDOC
# waitfor a console input # waitfor a console input
read dummy_var read dummy_var
# Start Ubiquity installer # Start Ubiquity installer
ubiquity & ubiquity &
# Record the PID of the installer. # Record the PID of the installer.
installer_pid=$! installer_pid=$!
# Common part of the para-install. # Common part of the para-install.
# Record the install PID, modify the /etc/default/grub of the target, # Record the install PID, modify the /etc/default/grub of the target,
# and then, wait for the end of sintaller. # and then, wait for the end of sintaller.
if ! parainstall ; then if ! parainstall ; then
return 1 return 1
fi fi
# ******************************************************************************* # *******************************************************************************
# Post-install stage # Post-install stage
# ******************************************************************************* # *******************************************************************************
## Mount the target file system ## Mount the target file system
# ${TARGETMOUNTPOINT} is created by the GUI/TUI installer # ${TARGETMOUNTPOINT} is created by the GUI/TUI installer
echo "...Mount /dev/mapper/${VGNAME}-${LVROOTNAME} on ${TARGETMOUNTPOINT}." echo "...Mount /dev/mapper/${VGNAME}-${LVROOTNAME} on ${TARGETMOUNTPOINT}."
mount /dev/mapper/${VGNAME}-${LVROOTNAME} ${TARGETMOUNTPOINT} mount /dev/mapper/${VGNAME}-${LVROOTNAME} ${TARGETMOUNTPOINT}
# And mount other directories # And mount other directories
echo "...Mount all other dirs." echo "...Mount all other dirs."
for n in proc sys dev etc/resolv.conf; do mount --rbind "/$n" "${TARGETMOUNTPOINT}/$n"; done for n in proc sys dev etc/resolv.conf; do mount --rbind "/$n" "${TARGETMOUNTPOINT}/$n"; done
# Change root and create the keyfile and ramfs image for Linux kernel. # Change root and create the keyfile and ramfs image for Linux kernel.
echo "...Chroot to ${TARGETMOUNTPOINT}." echo "...Chroot to ${TARGETMOUNTPOINT}."
cat <<HEREDOC | chroot ${TARGETMOUNTPOINT} /bin/bash cat <<- HEREDOC | chroot ${TARGETMOUNTPOINT} /bin/bash
# Mount the rest of partitions by target /etc/fstab # Mount the rest of partitions by target /etc/fstab
mount -a mount -a
# Set up the kernel hook of encryption # Set up the kernel hook of encryption
echo "...Install cryptsetup-initramfs package." echo "...Install cryptsetup-initramfs package."
apt -qq install -y cryptsetup-initramfs apt -qq install -y cryptsetup-initramfs
# Prepare a key file to embed in to the ramfs. # Prepare a key file to embed in to the ramfs.
echo "...Prepair key file." echo "...Prepair key file."
mkdir /etc/luks mkdir /etc/luks
dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=4096 count=1 status=none dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=4096 count=1 status=none
chmod u=rx,go-rwx /etc/luks chmod u=rx,go-rwx /etc/luks
chmod u=r,go-rwx /etc/luks/boot_os.keyfile chmod u=r,go-rwx /etc/luks/boot_os.keyfile
# Add a key to the key file. Use the passphrase in the environment variable. # Add a key to the key file. Use the passphrase in the environment variable.
echo "...Add a key to the key file." echo "...Add a key to the key file."
printf %s "${PASSPHRASE}" | cryptsetup luksAddKey -d - "${DEV}${CRYPTPARTITION}" /etc/luks/boot_os.keyfile printf %s "${PASSPHRASE}" | cryptsetup luksAddKey -d - "${DEV}${CRYPTPARTITION}" /etc/luks/boot_os.keyfile
# Add the LUKS volume information to /etc/crypttab to decrypt by kernel. # Add the LUKS volume information to /etc/crypttab to decrypt by kernel.
echo "...Add LUKS volume info to /etc/crypttab." echo "...Add LUKS volume info to /etc/crypttab."
echo "${CRYPTPARTNAME} UUID=$(blkid -s UUID -o value ${DEV}${CRYPTPARTITION}) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab echo "${CRYPTPARTNAME} UUID=$(blkid -s UUID -o value ${DEV}${CRYPTPARTITION}) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab
# Putting key file into the ramfs initial image # Putting key file into the ramfs initial image
echo "...Register key file to the ramfs" echo "...Register key file to the ramfs"
echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >> /etc/cryptsetup-initramfs/conf-hook echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >> /etc/cryptsetup-initramfs/conf-hook
echo "UMASK=0077" >> /etc/initramfs-tools/initramfs.conf echo "UMASK=0077" >> /etc/initramfs-tools/initramfs.conf
# Finally, update the ramfs initial image with the key file. # Finally, update the ramfs initial image with the key file.
echo "...Upadte initramfs." echo "...Upadte initramfs."
update-initramfs -uk all update-initramfs -uk all
# Leave chroot # Leave chroot
HEREDOC HEREDOC
# Unmount all # Unmount all
echo "...Unmount all." echo "...Unmount all."
umount -R ${TARGETMOUNTPOINT} umount -R ${TARGETMOUNTPOINT}
# Finishing message # Finishing message
cat <<HEREDOC cat <<- HEREDOC
****************** Post-install process finished ****************** ****************** Post-install process finished ******************
...Ready to reboot. ...Ready to reboot.
HEREDOC HEREDOC
# Normal end
return 0
}
# Execute
main

View file

@ -1,175 +1,183 @@
#!/bin/bash -u #!/bin/bash -u
# Load configuration parameter function main() {
source config.sh # Load configuration parameter
source config.sh
# Load functions # Load functions
source common/confirmation.sh source common/confirmation.sh
source common/preinstall.sh source common/preinstall.sh
source common/parainstall.sh source common/parainstall.sh
source common/parainstall_msg.sh source common/parainstall_msg.sh
# Varidate whether script is executed as sourced or not # Varidate whether script is executed as sourced or not
(return 0 2>/dev/null) && sourced=1 || sourced=0 (return 0 2>/dev/null) && sourced=1 || sourced=0
if [ $sourced -eq 0 ] ; then if [ $sourced -eq 0 ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
***** ERROR : Must execute as "sourced" ***** ***** ERROR : Must execute as "sourced" *****
Execute as following : Execute as following :
source void-kaiten-yaki.sh source void-kaiten-yaki.sh
Installation terminated. Installation terminated.
HEREDOC HEREDOC
exit # use "exit" instead of "return", if not "sourced" execusion exit # use "exit" instead of "return", if not "sourced" execusion
fi # "sourced" validation fi # "sourced" validation
# This is the mount point of the install target. # This is the mount point of the install target.
export TARGETMOUNTPOINT="/mnt/target" export TARGETMOUNTPOINT="/mnt/target"
# 1 : Show message during GUI/TUI installer, 0 : Do not show. # 1 : Show message during GUI/TUI installer, 0 : Do not show.
export PARAINSTMSG=0 export PARAINSTMSG=0
# Distribution check # Distribution check
if ! uname -a | grep void -i > /dev/null ; then # "Void" is not found in the OS name. if ! uname -a | grep void -i > /dev/null ; then # "Void" is not found in the OS name.
echo "*********************************************************************************" echo "*********************************************************************************"
uname -a uname -a
cat <<HEREDOC cat <<- HEREDOC
********************************************************************************* *********************************************************************************
This system seems to be not Void Linux, while this script is dediated to the Void Linux. This system seems to be not Void Linux, while this script is dediated to the Void Linux.
Are you sure you want to run this script for installation? [Y/N] Are you sure you want to run this script for installation? [Y/N]
HEREDOC HEREDOC
read YESNO read YESNO
if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<HEREDOC 1>&2 cat <<- HEREDOC 1>&2
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return return
fi # if YES fi # if YES
fi # "Void" is not found in the OS name. fi # "Void" is not found in the OS name.
# ******************************************************************************* # *******************************************************************************
# Confirmation before installation # Confirmation before installation
# ******************************************************************************* # *******************************************************************************
# Common part of the parameter confirmation # Common part of the parameter confirmation
if ! confirmation ; then if ! confirmation ; then
return 1 return 1
fi fi
# ******************************************************************************* # *******************************************************************************
# Pre-install stage # Pre-install stage
# ******************************************************************************* # *******************************************************************************
# Install essential packages. # Install essential packages.
xbps-install -y -Su xbps gptfdisk xbps-install -y -Su xbps gptfdisk
# Common part of the pre-install stage # Common part of the pre-install stage
if ! pre_install ; then if ! pre_install ; then
return 1 return 1
fi fi
# ADD "rd.auto=1 cryptdevice=/dev/sda2:${LUKS_NAME} root=/dev/mapper/${VGNAME}-${ROOTNAME}" to GRUB. # ADD "rd.auto=1 cryptdevice=/dev/sda2:${LUKS_NAME} root=/dev/mapper/${VGNAME}-${ROOTNAME}" to GRUB.
# This is magical part. I have not understood why this is required. # This is magical part. I have not understood why this is required.
# Anyway, without this modification, Void Linux doesn't boot. # Anyway, without this modification, Void Linux doesn't boot.
# Refer https://wiki.voidlinux.org/Install_LVM_LUKS#Installation_using_void-installer # Refer https://wiki.voidlinux.org/Install_LVM_LUKS#Installation_using_void-installer
echo "...Modify /etc/default/grub." echo "...Modify /etc/default/grub."
sed -i "s#loglevel=4#loglevel=4 rd.auto=1 cryptdevice=/dev/sda2:${LUKS_NAME} root=/dev/mapper/${VGNAME}-${LVROOTNAME}#" /etc/default/grub sed -i "s#loglevel=4#loglevel=4 rd.auto=1 cryptdevice=/dev/sda2:${LUKS_NAME} root=/dev/mapper/${VGNAME}-${LVROOTNAME}#" /etc/default/grub
# ******************************************************************************* # *******************************************************************************
# Para-install stage # Para-install stage
# ******************************************************************************* # *******************************************************************************
# Show common message to let the operator focus on the critical part # Show common message to let the operator focus on the critical part
parainstall_msg parainstall_msg
# Ubuntu dependent message # Ubuntu dependent message
cat <<HEREDOC cat <<- HEREDOC
************************ CAUTION! CAUTION! CAUTION! **************************** ************************ CAUTION! CAUTION! CAUTION! ****************************
Make sure to click "NO", if the void-installer ask you to reboot. Make sure to click "NO", if the void-installer ask you to reboot.
Just exit the installer without rebooting. Just exit the installer without rebooting.
Type return key to start void-installer. Type return key to start void-installer.
HEREDOC HEREDOC
# waitfor a console input # waitfor a console input
read dummy_var read dummy_var
# Start void-installer # Start void-installer
void-installer & void-installer &
# Record the PID of the installer. # Record the PID of the installer.
installer_pid=$! installer_pid=$!
# Common part of the para-install. # Common part of the para-install.
# Record the install PID, modify the /etc/default/grub of the target, # Record the install PID, modify the /etc/default/grub of the target,
# and then, wait for the end of sintaller. # and then, wait for the end of sintaller.
if ! parainstall ; then if ! parainstall ; then
return 1 return 1
fi fi
# ******************************************************************************* # *******************************************************************************
# Post-install stage # Post-install stage
# ******************************************************************************* # *******************************************************************************
## Mount the target file system ## Mount the target file system
# ${TARGETMOUNTPOINT} is created by the GUI/TUI installer # ${TARGETMOUNTPOINT} is created by the GUI/TUI installer
echo "...Mount /dev/mapper/${VGNAME}-${LVROOTNAME} on ${TARGETMOUNTPOINT}." echo "...Mount /dev/mapper/${VGNAME}-${LVROOTNAME} on ${TARGETMOUNTPOINT}."
mount /dev/mapper/${VGNAME}-${LVROOTNAME} ${TARGETMOUNTPOINT} mount /dev/mapper/${VGNAME}-${LVROOTNAME} ${TARGETMOUNTPOINT}
# And mount other directories # And mount other directories
echo "...Mount all other dirs." echo "...Mount all other dirs."
for n in proc sys dev etc/resolv.conf; do mount --rbind "/$n" "${TARGETMOUNTPOINT}/$n"; done for n in proc sys dev etc/resolv.conf; do mount --rbind "/$n" "${TARGETMOUNTPOINT}/$n"; done
# Change root and create the keyfile and ramfs image for Linux kernel. # Change root and create the keyfile and ramfs image for Linux kernel.
echo "...Chroot to ${TARGETMOUNTPOINT}." echo "...Chroot to ${TARGETMOUNTPOINT}."
cat <<HEREDOC | chroot ${TARGETMOUNTPOINT} /bin/bash cat <<- HEREDOC | chroot ${TARGETMOUNTPOINT} /bin/bash
# Mount the rest of partitions by target /etc/fstab # Mount the rest of partitions by target /etc/fstab
mount -a mount -a
# Set up the kernel hook of encryption # Set up the kernel hook of encryption
echo "...Install cryptsetup-initramfs package." echo "...Install cryptsetup-initramfs package."
xbps-install -y lvm2 cryptsetup xbps-install -y lvm2 cryptsetup
# Prepare a key file to embed in to the ramfs. # Prepare a key file to embed in to the ramfs.
echo "...Prepair key file." echo "...Prepair key file."
mkdir /etc/luks mkdir /etc/luks
dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=4096 count=1 status=none dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=4096 count=1 status=none
chmod u=rx,go-rwx /etc/luks chmod u=rx,go-rwx /etc/luks
chmod u=r,go-rwx /etc/luks/boot_os.keyfile chmod u=r,go-rwx /etc/luks/boot_os.keyfile
# Add a key to the key file. Use the passphrase in the environment variable. # Add a key to the key file. Use the passphrase in the environment variable.
echo "...Add a key to the key file." echo "...Add a key to the key file."
printf %s "${PASSPHRASE}" | cryptsetup luksAddKey -d - "${DEV}${CRYPTPARTITION}" /etc/luks/boot_os.keyfile printf %s "${PASSPHRASE}" | cryptsetup luksAddKey -d - "${DEV}${CRYPTPARTITION}" /etc/luks/boot_os.keyfile
# Add the LUKS volume information to /etc/crypttab to decrypt by kernel. # Add the LUKS volume information to /etc/crypttab to decrypt by kernel.
echo "...Add LUKS volume info to /etc/crypttab." echo "...Add LUKS volume info to /etc/crypttab."
echo "${CRYPTPARTNAME} UUID=$(blkid -s UUID -o value ${DEV}${CRYPTPARTITION}) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab echo "${CRYPTPARTNAME} UUID=$(blkid -s UUID -o value ${DEV}${CRYPTPARTITION}) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab
# Putting key file into the ramfs initial image # Putting key file into the ramfs initial image
echo "...Register key file to the ramfs" echo "...Register key file to the ramfs"
echo 'install_items+=" /etc/luks/boot_os.keyfile /etc/crypttab " ' > /etc/dracut.conf.d/10-crypt.conf echo 'install_items+=" /etc/luks/boot_os.keyfile /etc/crypttab " ' > /etc/dracut.conf.d/10-crypt.conf
# Finally, update the ramfs initial image with the key file. # Finally, update the ramfs initial image with the key file.
echo "...Upadte initramfs." echo "...Upadte initramfs."
xbps-reconfigure -fa xbps-reconfigure -fa
echo "...grub-mkconfig." echo "...grub-mkconfig."
grub-mkconfig -o /boot/grub/grub.cfg grub-mkconfig -o /boot/grub/grub.cfg
echo "...update-grub." echo "...update-grub."
update-grub update-grub
# Leave chroot # Leave chroot
HEREDOC HEREDOC
# Unmount all # Unmount all
echo "...Unmount all." echo "...Unmount all."
umount -R ${TARGETMOUNTPOINT} umount -R ${TARGETMOUNTPOINT}
# Finishing message # Finishing message
cat <<HEREDOC cat <<- HEREDOC
****************** Post-install process finished ****************** ****************** Post-install process finished ******************
...Ready to reboot. ...Ready to reboot.
HEREDOC HEREDOC
# Normal end
return 0
}
# Execute
main