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
if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<HEREDOC 1>&2
Installation terminated.
HEREDOC
return 1
fi # if YES
# For sure ask ready to erase.
if [ ${ERASEALL} -eq 1 ] ; then
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}.
Installation terminated. Installation terminated.
HEREDOC HEREDOC
return 1 return 1
fi # if YES fi # if YES
fi # if erase all
# ----- Set Passphrase ----- # For sure ask ready to erase.
# Input passphrase if [ ${ERASEALL} -eq 1 ] ; then
echo "Type passphrase for the disk encryption." echo "Are you sure you want to erase entire ${DEV}? [Y/N]"
read -sr PASSPHRASE read YESNO
export PASSPHRASE if [ ${YESNO} != "Y" -a ${YESNO} != "y" ] ; then
cat <<-HEREDOC 1>&2
Check config.sh. The variable ERASEALL is ${ERASEALL}.
echo "Type passphrase again, to confirm." Installation terminated.
read -sr PASSPHRASE_C HEREDOC
return 1
fi # if YES
fi # if erase all
# Validate whether both are indentical or not # ----- Set Passphrase -----
if [ ${PASSPHRASE} != ${PASSPHRASE_C} ] ; then # Input passphrase
cat <<HEREDOC 1>&2 echo "Type passphrase for the disk encryption."
***** ERROR : Passphrase doesn't match ***** read -sr PASSPHRASE
export PASSPHRASE
Installation terminated. echo "Type passphrase again, to confirm."
HEREDOC read -sr PASSPHRASE_C
return 1
fi # passphrase validation
# succesfull return # Validate whether both are indentical or not
return 0 if [ ${PASSPHRASE} != ${PASSPHRASE_C} ] ; then
cat <<-HEREDOC 1>&2
***** ERROR : Passphrase doesn't match *****
Installation terminated.
HEREDOC
return 1
fi # passphrase validation
# succesfull return
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.
# Check if installer still exist
if ! ps $installer_pid > /dev/null ; then # If not exists
cat <<-HEREDOC 1>&2
The installer terminated unexpectedly.
Installation process terminated.
HEREDOC
return 1
fi
done # while
# Perhaps, too neuvous. Wait 1 more sectond to avoid the rece condition.
sleep 1 # 1sec. sleep 1 # 1sec.
# Check if installer still exist # Make target GRUB aware to the crypt partition
if ! ps $installer_pid > /dev/null ; then # If not exists # This must do it after start of the file copy by installer, but before the end of the file copy.
cat <<HEREDOC 1>&2 # If the environment is not GUI, keep quiet not to bother the TUI installer.
The installer terminated unexpectedly. if [ ${PARAINSTMSG} -eq 1 ]; then
echo "...Add GRUB_ENABLE_CRYPTODISK entry to ${TARGETMOUNTPOINT}/etc/default/grub "
Installation process terminated.
HEREDOC
return 1
fi fi
done # while echo "GRUB_ENABLE_CRYPTODISK=y" >> ${TARGETMOUNTPOINT}/etc/default/grub
# Perhaps, too neuvous. Wait 1 more sectond to avoid the rece condition.
sleep 1 # 1sec.
# 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.
# If the environment is not GUI, keep quiet not to bother the TUI installer.
if [ ${PARAINSTMSG} -eq 1 ]; then
echo "...Add GRUB_ENABLE_CRYPTODISK entry to ${TARGETMOUNTPOINT}/etc/default/grub "
fi
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,90 +6,90 @@
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
# Zap existing partition table and create new GPT # Zap existing partition table and create new GPT
echo "...Initialize ${DEV} with GPT." echo "...Initialize ${DEV} with GPT."
sgdisk --zap-all "${DEV}" sgdisk --zap-all "${DEV}"
# Create EFI partition and format it # Create EFI partition and format it
echo "...Create an EFI partition on ${DEV}." echo "...Create an EFI partition on ${DEV}."
sgdisk --new=${EFIPARTITION}:0:+${EFISIZE} --change-name=${EFIPARTITION}:"EFI System" --typecode=${EFIPARTITION}:ef00 "${DEV}" sgdisk --new=${EFIPARTITION}:0:+${EFISIZE} --change-name=${EFIPARTITION}:"EFI System" --typecode=${EFIPARTITION}:ef00 "${DEV}"
echo "...Format the EFI parttion." echo "...Format the EFI parttion."
mkfs.vfat -F 32 -n EFI-SP "${DEV}${EFIPARTITION}" mkfs.vfat -F 32 -n EFI-SP "${DEV}${EFIPARTITION}"
# Create Linux partition # Create Linux partition
echo "...Create a Linux partition on ${DEV}." echo "...Create a Linux partition on ${DEV}."
sgdisk --new=${CRYPTPARTITION}:0:0 --change-name=${CRYPTPARTITION}:"Linux LUKS" --typecode=${CRYPTPARTITION}:8309 "${DEV}" sgdisk --new=${CRYPTPARTITION}:0:0 --change-name=${CRYPTPARTITION}:"Linux LUKS" --typecode=${CRYPTPARTITION}:8309 "${DEV}"
# Then print them # Then print them
sgdisk --print "${DEV}" sgdisk --print "${DEV}"
else
# Zap existing partition table
echo "...Erase partition table of ${DEV}."
dd if=/dev/zero of=${DEV} bs=512 count=1
# Create MBR and allocate max storage for Linux partition
echo "...Create a Linux partition on ${DEV} with MBR."
sfdisk ${DEV} <<- HEREDOC
2M,,L
HEREDOC
fi # if EFI firmware
# Encrypt the partition to install Linux
echo "...Initialize ${DEV}${CRYPTPARTITION} as crypt partition"
printf %s "${PASSPHRASE}" | cryptsetup luksFormat --type=luks1 --key-file - --batch-mode "${DEV}${CRYPTPARTITION}"
fi # if erase all
# ----- Open the LUKS partition -----
# Open the crypt partition.
echo "...Open a crypt partition ${DEV}${CRYPTPARTITION} as \"${CRYPTPARTNAME}\""
printf %s "${PASSPHRASE}" | cryptsetup open -d - "${DEV}${CRYPTPARTITION}" ${CRYPTPARTNAME}
# Check whether successful open. If mapped, it is successful.
if [ ! -e /dev/mapper/${CRYPTPARTNAME} ] ; then
cat <<- HEREDOC 1>&2
***** ERROR : Cannot open LUKS volume "${CRYPTPARTNAME}" on ${DEV}${CRYPTPARTITION}. *****
Check passphrase and config.txt
Installation terminated.
HEREDOC
return 1
fi # if crypt volume is unable to open
# ----- Configure the LVM in LUKS volume -----
# Check volume group ${VGNAME} exist or not
if vgdisplay -s ${VGNAME} &> /dev/null ; then # if exist
echo "...Volume group ${VGNAME} already exist. Skipped to create. No problem."
else else
# Zap existing partition table echo "...Initialize a physical volume on \"${CRYPTPARTNAME}\""
echo "...Erase partition table of ${DEV}." pvcreate /dev/mapper/${CRYPTPARTNAME}
dd if=/dev/zero of=${DEV} bs=512 count=1 echo "...And then create Volume group \"${VGNAME}\"."
# Create MBR and allocate max storage for Linux partition vgcreate ${VGNAME} /dev/mapper/${CRYPTPARTNAME}
echo "...Create a Linux partition on ${DEV} with MBR." fi # if /dev/volume-groupt exist
sfdisk ${DEV} <<HEREDOC
2M,,L
HEREDOC
fi # if EFI firmware
# Encrypt the partition to install Linux # Create a SWAP Logical Volume on VG, if it doesn't exist
echo "...Initialize ${DEV}${CRYPTPARTITION} as crypt partition" if [ -e /dev/mapper/${VGNAME}-${LVSWAPNAME} ] ; then
printf %s "${PASSPHRASE}" | cryptsetup luksFormat --type=luks1 --key-file - --batch-mode "${DEV}${CRYPTPARTITION}" echo "...Swap volume already exist. Skipped to create. No problem."
else
echo "...Create logical volume \"${LVSWAPNAME}\" on \"${VGNAME}\"."
lvcreate -L ${LVSWAPSIZE} -n ${LVSWAPNAME} ${VGNAME}
fi # if /dev/mapper/swap volume already exit.
fi # if erase all # Create a ROOT Logical Volume on VG.
if [ -e /dev/mapper/${VGNAME}-${LVROOTNAME} ] ; then
cat <<- HEREDOC 1>&2
***** ERROR : Logical volume "${VGNAME}-${LVROOTNAME}" already exists. *****
Check LVROOTNAME environment variable in config.txt.
# ----- Open the LUKS partition ----- Installation terminated.
# Open the crypt partition. HEREDOC
echo "...Open a crypt partition ${DEV}${CRYPTPARTITION} as \"${CRYPTPARTNAME}\"" return 1
printf %s "${PASSPHRASE}" | cryptsetup open -d - "${DEV}${CRYPTPARTITION}" ${CRYPTPARTNAME} else
echo "...Create logical volume \"${LVROOTNAME}\" on \"${VGNAME}\"."
lvcreate -l ${LVROOTSIZE} -n ${LVROOTNAME} ${VGNAME}
fi # if the root volun already exist
# Check whether successful open. If mapped, it is successful. # successful return
if [ ! -e /dev/mapper/${CRYPTPARTNAME} ] ; then return 0
cat <<HEREDOC 1>&2
***** ERROR : Cannot open LUKS volume "${CRYPTPARTNAME}" on ${DEV}${CRYPTPARTITION}. *****
Check passphrase and config.txt
Installation terminated.
HEREDOC
return 1
fi # if crypt volume is unable to open
# ----- Configure the LVM in LUKS volume -----
# Check volume group ${VGNAME} exist or not
if vgdisplay -s ${VGNAME} &> /dev/null ; then # if exist
echo "...Volume group ${VGNAME} already exist. Skipped to create. No problem."
else
echo "...Initialize a physical volume on \"${CRYPTPARTNAME}\""
pvcreate /dev/mapper/${CRYPTPARTNAME}
echo "...And then create Volume group \"${VGNAME}\"."
vgcreate ${VGNAME} /dev/mapper/${CRYPTPARTNAME}
fi # if /dev/volume-groupt exist
# Create a SWAP Logical Volume on VG, if it doesn't exist
if [ -e /dev/mapper/${VGNAME}-${LVSWAPNAME} ] ; then
echo "...Swap volume already exist. Skipped to create. No problem."
else
echo "...Create logical volume \"${LVSWAPNAME}\" on \"${VGNAME}\"."
lvcreate -L ${LVSWAPSIZE} -n ${LVSWAPNAME} ${VGNAME}
fi # if /dev/mapper/swap volume already exit.
# Create a ROOT Logical Volume on VG.
if [ -e /dev/mapper/${VGNAME}-${LVROOTNAME} ] ; then
cat <<HEREDOC 1>&2
***** ERROR : Logical volume "${VGNAME}-${LVROOTNAME}" already exists. *****
Check LVROOTNAME environment variable in config.txt.
Installation terminated.
HEREDOC
return 1
else
echo "...Create logical volume \"${LVROOTNAME}\" on \"${VGNAME}\"."
lvcreate -l ${LVROOTSIZE} -n ${LVROOTNAME} ${VGNAME}
fi # if the root volun already exist
# successful return
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