From 44423c370010af0c273bb0038ed04cc53fcda8cf Mon Sep 17 00:00:00 2001 From: Juan RP Date: Sun, 19 May 2013 09:39:56 +0200 Subject: Start integration of void-installer and start conversion to non-busybox utils. --- .gitignore | 4 +- COPYING | 2 - Makefile | 16 +- README | 7 +- installer.sh.in | 1311 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ mklive.sh.in | 41 +- mkrootfs.sh.in | 161 +++++++ void-mkrootfs.sh | 161 ------- 8 files changed, 1506 insertions(+), 197 deletions(-) create mode 100644 installer.sh.in create mode 100644 mkrootfs.sh.in delete mode 100755 void-mkrootfs.sh diff --git a/.gitignore b/.gitignore index 2c8db02..50ce03a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -void-mklive.sh +installer.sh +mklive.sh +mkrootfs.sh diff --git a/COPYING b/COPYING index 426f41f..8f7cf67 100644 --- a/COPYING +++ b/COPYING @@ -1,5 +1,3 @@ -Simplified BSD: - # Copyright (c) 2009-2013 Juan Romero Pardines. # All rights reserved. # diff --git a/Makefile b/Makefile index 56e6ba7..62c4f31 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,23 @@ GITVER := $(shell git rev-parse HEAD) -VERSION = 0.12 +VERSION = 0.13 PREFIX ?= /usr/local SBINDIR ?= $(PREFIX)/sbin SHAREDIR ?= $(PREFIX)/share DRACUTMODDIR ?= $(PREFIX)/lib/dracut/modules.d/01vmklive -all: - sed -e "s|@@MKLIVE_VERSION@@|$(VERSION) $(GITVER)|g" mklive.sh.in > mklive.sh +SHIN += $(shell find -type f -name '*.sh.in') +SCRIPTS += $(SHIN:.sh.in=.sh) + +%.sh: %.sh.in + sed -e "s|@@MKLIVE_VERSION@@|$(VERSION) $(GITVER)|g" $^ > $@ + +all: $(SCRIPTS) install: all install -d $(DESTDIR)$(SBINDIR) install -m755 mklive.sh $(DESTDIR)$(SBINDIR)/void-mklive - install -m755 void-mkrootfs.sh $(DESTDIR)$(SBINDIR)/void-mkrootfs + install -m755 mkrootfs.sh $(DESTDIR)$(SBINDIR)/void-mkrootfs + install -m755 installer.sh $(DESTDIR)$(SBINDIR)/void-installer install -d $(DESTDIR)$(DRACUTMODDIR) install -m755 dracut/*.sh $(DESTDIR)$(DRACUTMODDIR) install -d $(DESTDIR)$(SHAREDIR)/void-mklive @@ -19,7 +25,7 @@ install: all install -m644 isolinux/*.cfg* $(DESTDIR)$(SHAREDIR)/void-mklive clean: - -rm -f mklive.sh + -rm -f *.sh dist: @echo "Building distribution tarball for tag: v$(VERSION) ..." diff --git a/README b/README index 55c5445..12a8928 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ void-mklive - The Void Linux live image maker -This is a simple shell script to build a live image for the -Void linux distribution. The images contain the void-installer package +This is a simple shell script to build a live image for the Void +Linux distribution. The images contain a simple dialog-based installer to be able to install Void linux to storage disks. The generated image can be booted from BIOS and EFI systems (dual boot). @@ -34,4 +34,7 @@ Options: Take a look at the configuration file (~/mklive.conf) to tweak some default parameters in the generated image. +Additionally void-mkrootfs generates a rootfs tarball suitable for unpacking +on a directory ready to 'chroot'. + -- Juan RP diff --git a/installer.sh.in b/installer.sh.in new file mode 100644 index 0000000..6b0756f --- /dev/null +++ b/installer.sh.in @@ -0,0 +1,1311 @@ +#!/bin/sh +#- +# Copyright (c) 2012 Juan Romero Pardines . +# 2012 Dave Elusive . +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#- + +# Make sure we don't inherit these from env. +SOURCE_DONE= +HOSTNAME_DONE= +KEYBOARD_DONE= +LOCALE_DONE= +TIMEZONE_DONE= +ROOTPASSWORD_DONE= +BOOTLOADER_DONE= +PARTITIONS_DONE= +NETWORK_DONE= +FILESYSTEMS_DONE= + +TARGETDIR=/mnt/target +LOG=/dev/tty7 +CONF_FILE=/tmp/.void-installer.conf +if [ ! -f $CONF_FILE ]; then + touch -f $CONF_FILE +fi +ANSWER=$(mktemp -t vinstall-XXXXXXXX || exit 1) +TARGET_FSTAB=$(mktemp -t vinstall-fstab-XXXXXXXX || exit 1) + +trap "DIE" INT TERM QUIT + +# disable printk +if [ -w /proc/sys/kernel/printk ]; then + echo 0 >/proc/sys/kernel/printk +fi + +# Detect if this is an EFI system. +if [ -e /sys/firmware/efi/systab ]; then + EFI_SYSTEM=1 +fi + +# dialog colors +BLACK="\Z0" +RED="\Z1" +GREEN="\Z2" +YELLOW="\Z3" +BLUE="\Z4" +MAGENTA="\Z5" +CYAN="\Z6" +WHITE="\Z7" +BOLD="\Zb" +REVERSE="\Zr" +UNDERLINE="\Zu" +RESET="\Zn" + +# Properties shared per widget. +MENULABEL="${BOLD}Use UP and DOWN keys to navigate \ +menus. Use TAB to switch between buttons and ENTER to select.${RESET}" +MENUSIZE="14 60 0" +INPUTSIZE="8 60" +MSGBOXSIZE="8 70" +YESNOSIZE="$INPUTSIZE" +WIDGET_SIZE="10 70" + +# Hardcoded list of timezones; to not depend on tzdata. +TIMEZONES=" +Africa/Abidjan +Africa/Accra +Africa/Addis_Ababa +Africa/Algiers +Africa/Asmara +Africa/Bamako +Africa/Bangui +Africa/Banjul +Africa/Bissau +Africa/Blantyre +Africa/Brazzaville +Africa/Bujumbura +Africa/Cairo +Africa/Casablanca +Africa/Ceuta +Africa/Conakry +Africa/Dakar +Africa/Dar_es_Salaam +Africa/Djibouti +Africa/Douala +Africa/El_Aaiun +Africa/Freetown +Africa/Gaborone +Africa/Harare +Africa/Johannesburg +Africa/Juba +Africa/Kampala +Africa/Khartoum +Africa/Kigali +Africa/Kinshasa +Africa/Lagos +Africa/Libreville +Africa/Lome +Africa/Luanda +Africa/Lubumbashi +Africa/Lusaka +Africa/Malabo +Africa/Maputo +Africa/Maseru +Africa/Mbabane +Africa/Mogadishu +Africa/Monrovia +Africa/Nairobi +Africa/Ndjamena +Africa/Niamey +Africa/Nouakchott +Africa/Ouagadougou +Africa/Porto-Novo +Africa/Sao_Tome +Africa/Tripoli +Africa/Tunis +Africa/Windhoek +America/Adak +America/Anchorage +America/Anguilla +America/Antigua +America/Araguaina +America/Argentina/Buenos_Aires +America/Argentina/Catamarca +America/Argentina/Cordoba +America/Argentina/Jujuy +America/Argentina/La_Rioja +America/Argentina/Mendoza +America/Argentina/Rio_Gallegos +America/Argentina/Salta +America/Argentina/San_Juan +America/Argentina/San_Luis +America/Argentina/Tucuman +America/Argentina/Ushuaia +America/Aruba +America/Asuncion +America/Atikokan +America/Bahia +America/Bahia_Banderas +America/Barbados +America/Belem +America/Belize +America/Blanc-Sablon +America/Boa_Vista +America/Bogota +America/Boise +America/Cambridge_Bay +America/Campo_Grande +America/Cancun +America/Caracas +America/Cayenne +America/Cayman +America/Chicago +America/Chihuahua +America/Costa_Rica +America/Creston +America/Cuiaba +America/Curacao +America/Danmarkshavn +America/Dawson +America/Dawson_Creek +America/Denver +America/Detroit +America/Dominica +America/Edmonton +America/Eirunepe +America/El_Salvador +America/Fortaleza +America/Glace_Bay +America/Godthab +America/Goose_Bay +America/Grand_Turk +America/Grenada +America/Guadeloupe +America/Guatemala +America/Guayaquil +America/Guyana +America/Halifax +America/Havana +America/Hermosillo +America/Indiana/Indianapolis +America/Indiana/Knox +America/Indiana/Marengo +America/Indiana/Petersburg +America/Indiana/Tell_City +America/Indiana/Vevay +America/Indiana/Vincennes +America/Indiana/Winamac +America/Inuvik +America/Iqaluit +America/Jamaica +America/Juneau +America/Kentucky/Louisville +America/Kentucky/Monticello +America/Kralendijk +America/La_Paz +America/Lima +America/Los_Angeles +America/Lower_Princes +America/Maceio +America/Managua +America/Manaus +America/Marigot +America/Martinique +America/Matamoros +America/Mazatlan +America/Menominee +America/Merida +America/Metlakatla +America/Mexico_City +America/Miquelon +America/Moncton +America/Monterrey +America/Montevideo +America/Montreal +America/Montserrat +America/Nassau +America/New_York +America/Nipigon +America/Nome +America/Noronha +America/North_Dakota/Beulah +America/North_Dakota/Center +America/North_Dakota/New_Salem +America/Ojinaga +America/Panama +America/Pangnirtung +America/Paramaribo +America/Phoenix +America/Port-au-Prince +America/Port_of_Spain +America/Porto_Velho +America/Puerto_Rico +America/Rainy_River +America/Rankin_Inlet +America/Recife +America/Regina +America/Resolute +America/Rio_Branco +America/Santa_Isabel +America/Santarem +America/Santiago +America/Santo_Domingo +America/Sao_Paulo +America/Scoresbysund +America/Shiprock +America/Sitka +America/St_Barthelemy +America/St_Johns +America/St_Kitts +America/St_Lucia +America/St_Thomas +America/St_Vincent +America/Swift_Current +America/Tegucigalpa +America/Thule +America/Thunder_Bay +America/Tijuana +America/Toronto +America/Tortola +America/Vancouver +America/Whitehorse +America/Winnipeg +America/Yakutat +America/Yellowknife +Antarctica/Casey +Antarctica/Davis +Antarctica/DumontDUrville +Antarctica/Macquarie +Antarctica/Mawson +Antarctica/McMurdo +Antarctica/Palmer +Antarctica/Rothera +Antarctica/South_Pole +Antarctica/Syowa +Antarctica/Vostok +Arctic/Longyearbyen +Asia/Aden +Asia/Almaty +Asia/Amman +Asia/Anadyr +Asia/Aqtau +Asia/Aqtobe +Asia/Ashgabat +Asia/Baghdad +Asia/Bahrain +Asia/Baku +Asia/Bangkok +Asia/Beirut +Asia/Bishkek +Asia/Brunei +Asia/Choibalsan +Asia/Chongqing +Asia/Colombo +Asia/Damascus +Asia/Dhaka +Asia/Dili +Asia/Dubai +Asia/Dushanbe +Asia/Gaza +Asia/Harbin +Asia/Hebron +Asia/Ho_Chi_Minh +Asia/Hong_Kong +Asia/Hovd +Asia/Irkutsk +Asia/Jakarta +Asia/Jayapura +Asia/Jerusalem +Asia/Kabul +Asia/Kamchatka +Asia/Karachi +Asia/Kashgar +Asia/Kathmandu +Asia/Kolkata +Asia/Krasnoyarsk +Asia/Kuala_Lumpur +Asia/Kuching +Asia/Kuwait +Asia/Macau +Asia/Magadan +Asia/Makassar +Asia/Manila +Asia/Muscat +Asia/Nicosia +Asia/Novokuznetsk +Asia/Novosibirsk +Asia/Omsk +Asia/Oral +Asia/Phnom_Penh +Asia/Pontianak +Asia/Pyongyang +Asia/Qatar +Asia/Qyzylorda +Asia/Rangoon +Asia/Riyadh +Asia/Sakhalin +Asia/Samarkand +Asia/Seoul +Asia/Shanghai +Asia/Singapore +Asia/Taipei +Asia/Tashkent +Asia/Tbilisi +Asia/Tehran +Asia/Thimphu +Asia/Tokyo +Asia/Ulaanbaatar +Asia/Urumqi +Asia/Vientiane +Asia/Vladivostok +Asia/Yakutsk +Asia/Yekaterinburg +Asia/Yerevan +Atlantic/Azores +Atlantic/Bermuda +Atlantic/Canary +Atlantic/Cape_Verde +Atlantic/Faroe +Atlantic/Madeira +Atlantic/Reykjavik +Atlantic/South_Georgia +Atlantic/St_Helena +Atlantic/Stanley +Australia/Adelaide +Australia/Brisbane +Australia/Broken_Hill +Australia/Currie +Australia/Darwin +Australia/Eucla +Australia/Hobart +Australia/Lindeman +Australia/Lord_Howe +Australia/Melbourne +Australia/Perth +Australia/Sydney +Europe/Amsterdam +Europe/Andorra +Europe/Athens +Europe/Belgrade +Europe/Berlin +Europe/Bratislava +Europe/Brussels +Europe/Bucharest +Europe/Budapest +Europe/Chisinau +Europe/Copenhagen +Europe/Dublin +Europe/Gibraltar +Europe/Guernsey +Europe/Helsinki +Europe/Isle_of_Man +Europe/Istanbul +Europe/Jersey +Europe/Kaliningrad +Europe/Kiev +Europe/Lisbon +Europe/Ljubljana +Europe/London +Europe/Luxembourg +Europe/Madrid +Europe/Malta +Europe/Mariehamn +Europe/Minsk +Europe/Monaco +Europe/Moscow +Europe/Oslo +Europe/Paris +Europe/Podgorica +Europe/Prague +Europe/Riga +Europe/Rome +Europe/Samara +Europe/San_Marino +Europe/Sarajevo +Europe/Simferopol +Europe/Skopje +Europe/Sofia +Europe/Stockholm +Europe/Tallinn +Europe/Tirane +Europe/Uzhgorod +Europe/Vaduz +Europe/Vatican +Europe/Vienna +Europe/Vilnius +Europe/Volgograd +Europe/Warsaw +Europe/Zagreb +Europe/Zaporozhye +Europe/Zurich +Indian/Antananarivo +Indian/Chagos +Indian/Christmas +Indian/Cocos +Indian/Comoro +Indian/Kerguelen +Indian/Mahe +Indian/Maldives +Indian/Mauritius +Indian/Mayotte +Indian/Reunion +Pacific/Apia +Pacific/Auckland +Pacific/Chatham +Pacific/Chuuk +Pacific/Easter +Pacific/Efate +Pacific/Enderbury +Pacific/Fakaofo +Pacific/Fiji +Pacific/Funafuti +Pacific/Galapagos +Pacific/Gambier +Pacific/Guadalcanal +Pacific/Guam +Pacific/Honolulu +Pacific/Johnston +Pacific/Kiritimati +Pacific/Kosrae +Pacific/Kwajalein +Pacific/Majuro +Pacific/Marquesas +Pacific/Midway +Pacific/Nauru +Pacific/Niue +Pacific/Norfolk +Pacific/Noumea +Pacific/Pago_Pago +Pacific/Palau +Pacific/Pitcairn +Pacific/Pohnpei +Pacific/Port_Moresby +Pacific/Rarotonga +Pacific/Saipan +Pacific/Tahiti +Pacific/Tarawa +Pacific/Tongatapu +Pacific/Wake +Pacific/Wallis" + +DIALOG() { + rm -f $ANSWER + dialog --colors --keep-tite --no-shadow --no-mouse \ + --backtitle "${BOLD}${WHITE}Void Linux installation -- http://www.voidlinux.eu/${RESET}" \ + --cancel-label "Back" --aspect 20 "$@" 2>$ANSWER + return $? +} + +DIE() { + rval=$1 + [ -z "$rval" ] && rval=0 + clear + rm -f $ANSWER $TARGET_FSTAB + # reenable printk + if [ -w /proc/sys/kernel/printk ]; then + echo 4 >/proc/sys/kernel/printk + fi + umount_filesystems + exit $rval +} + +set_option() { + if grep -Eq "^${1}.*" $CONF_FILE; then + sed -i -e "/^${1}.*/d" $CONF_FILE + fi + echo "${1} ${2}" >>$CONF_FILE +} + +get_option() { + echo $(grep -E "^${1}.*" $CONF_FILE|sed -e "s|${1}||") +} + +show_disks() { + local dev size sectorsize gbytes + + # IDE + for dev in $(ls /sys/block|grep -E '^hd'); do + if [ "$(cat /sys/block/$dev/device/media)" = "disk" ]; then + # Find out nr sectors and bytes per sector; + echo "/dev/$dev" + size=$(cat /sys/block/$dev/size) + sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size) + gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))" + echo "size:${gbytes}GB;sector_size:$sectorsize" + fi + done + # SATA/SCSI and Virtual disks (virtio) + for dev in $(ls /sys/block|grep -E '^[sv]d'); do + if [ "$(cat /sys/block/$dev/device/type)" != "5" ]; then + echo "/dev/$dev" + size=$(cat /sys/block/$dev/size) + sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size) + gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))" + echo "size:${gbytes}GB;sector_size:$sectorsize" + fi + done +} + +show_partitions() { + local dev fstype fssize p part + + set -- $(show_disks) + while [ $# -ne 0 ]; do + disk=$(basename $1) + shift 2 + # ATA/SCSI/SATA + for p in /sys/block/$disk/$disk*; do + if [ -d $p ]; then + part=$(basename $p) + fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g') + [ "$fstype" = "iso9660" ] && continue + fssize=$(lsblk -r /dev/$part|awk '{print $4}'|grep -v SIZE) + echo "/dev/$part" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + fi + done + # LVM + for p in $(ls /dev/mapper 2>/dev/null|grep -v control); do + [ "$p" = "live-rw" ] && continue + fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g') + fssize=$(lsblk -r /dev/mapper/$p|awk '{print $4}'|grep -v SIZE) + echo "/dev/mapper/$p" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + done + # Software raid (md) + for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do + if cat /proc/mdstat|grep -qw $(echo $p|sed -e 's|/dev/||g'); then + fstype=$(blkid /dev/$part|awk '{print $3}'|sed -e 's/TYPE=\"\(.*\)\"/\1/g') + fssize=$(lsblk -r /dev/$p|awk '{print $4}'|grep -v SIZE) + echo "$p" + echo "size:${fssize:-unknown};fstype:${fstype:-none}" + fi + done + done +} + +menu_filesystems() { + local dev fstype fssize mntpoint reformat + + while true; do + DIALOG --title " Select the partition to edit " --menu "$MENULABEL" \ + ${MENUSIZE} $(show_partitions) + [ $? -ne 0 ] && return + + dev=$(cat $ANSWER) + DIALOG --title " Select the filesystem type for $dev " \ + --menu "$MENULABEL" ${MENUSIZE} \ + "vfat" "FAT32" \ + "btrfs" "Oracle's Btrfs" \ + "ext2" "Linux ext2 (no journaling)" \ + "ext3" "Linux ext3 (journal)" \ + "ext4" "Linux ext4 (journal)" \ + "swap" "Linux swap" \ + "xfs" "SGI's XFS" + if [ $? -eq 0 ]; then + fstype=$(cat $ANSWER) + else + continue + fi + if [ "$fstype" != "swap" ]; then + DIALOG --inputbox "Please specify the mount point for $dev:" ${INPUTSIZE} + if [ $? -eq 0 ]; then + mntpoint=$(cat $ANSWER) + elif [ $? -eq 1 ]; then + continue + fi + else + mntpoint=swap + fi + DIALOG --yesno "Do you want to create a new filesystem on $dev?" ${YESNOSIZE} + if [ $? -eq 0 ]; then + reformat=1 + elif [ $? -eq 1 ]; then + reformat=0 + else + continue + fi + fssize=$(lsblk -r $dev|awk '{print $4}'|grep -v SIZE) + set -- "$fstype" "$fssize" "$mntpoint" "$reformat" + if [ -n "$1" -a -n "$2" -a -n "$3" -a -n "$4" ]; then + local bdev=$(basename $dev) + if grep -Eq "^MOUNTPOINT \/dev\/${bdev}.*" $CONF_FILE; then + sed -i -e "/^MOUNTPOINT \/dev\/${bdev}.*/d" $CONF_FILE + fi + echo "MOUNTPOINT $dev $1 $2 $3 $4" >>$CONF_FILE + fi + done +} + +menu_partitions() { + DIALOG --title " Select the disk to partition " \ + --menu "$MENULABEL" ${MENUSIZE} $(show_disks) + if [ $? -eq 0 ]; then + local device=$(cat $ANSWER) + + DIALOG --title "Modify Partition Table on $device" --msgbox "\n +${BOLD}GNU parted will be executed in disk $device.${RESET}\n\n +For BIOS systems, MBR or GPT partition tables are supported.\n +To use GPT on PC BIOS systems an empty partition of 1MB must be added\n +at the first 2GB of the disk with the TOGGLE \`bios_grub' enabled.\n +${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n +For EFI systems GPT is mandatory and a FAT32 partition with at least\n +100MB must be created with the TOGGLE \`boot', this will be used as\n +EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n +At least 2 partitions are required: swap and rootfs (/).\n +For swap, RAM*2 must be really enough. For / 600MB are required.\n\n +${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n +${BOLD}WARNING: changes made by parted are destructive, you've been warned. +${RESET}\n" 18 80 + if [ $? -eq 0 ]; then + while true; do + clear; parted $device; PARTITIONS_DONE=1; partprobe $device + break + done + else + return + fi + fi +} + +menu_keymap() { + local KEYMAPS="de German fr French it Italian en English es Spanish ru Russia us American" + + while true; do + DIALOG --title " Select your keymap " --menu "$MENULABEL" 14 70 14 ${KEYMAPS} + if [ $? -eq 0 ]; then + set_option KEYMAP "$(cat $ANSWER)" + loadkeys "$(cat $ANSWER)" + KEYBOARD_DONE=1 + break + else + return + fi + done +} + +set_keymap() { + local KEYMAP=$(get_option KEYMAP) + sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf +} + +menu_locale() { + local _locales="$(localectl --no-pager list-locales)" + local _LOCALES= + + for f in ${_locales}; do + _LOCALES="${_LOCALES} ${f} -" + done + while true; do + DIALOG --title " Select your locale " --menu "$MENULABEL" 14 70 14 ${_LOCALES} + if [ $? -eq 0 ]; then + set_option LANG "$(cat $ANSWER)" + LOCALE_DONE=1 + break + else + return + fi + done +} + +set_locale() { + local LOCALE=$(get_option LOCALE) + sed -i -e "s|LANG=.*|LANG=$KEYMAP|g" $TARGETDIR/etc/locale.conf +} + +menu_timezone() { + local _tzones= + + for f in ${TIMEZONES}; do + _tzones="${_tzones} ${f} -" + done + while true; do + DIALOG --title " Select your timezone " --menu "$MENULABEL" 14 70 14 ${_tzones} + if [ $? -eq 0 ]; then + set_option TIMEZONE "$(cat $ANSWER)" + TIMEZONE_DONE=1 + break + else + return + fi + done +} + +set_timezone() { + local TIMEZONE="$(get_option TIMEZONE)" + ln -sf /usr/share/zoneinfo/${TIMEZONE} $TARGETDIR/etc/localtime +} + +menu_hostname() { + while true; do + DIALOG --inputbox "Set the machine hostname:" ${INPUTSIZE} + if [ $? -eq 0 ]; then + set_option HOSTNAME "$(cat $ANSWER)" + HOSTNAME_DONE=1 + break + else + return + fi + done +} + +set_hostname() { + echo $(get_option HOSTNAME) > $TARGETDIR/etc/hostname +} + +menu_rootpassword() { + local _firstpass= _secondpass= _desc= + + while true; do + if [ -n "${_firstpass}" ]; then + _desc="Enter the root password again (password won't be displayed)" + else + _desc="Enter the root password (password won't be displayed)" + fi + DIALOG --passwordbox "${_desc}" ${MSGBOXSIZE} + if [ $? -eq 0 ]; then + if [ -z "${_firstpass}" ]; then + _firstpass="$(cat $ANSWER)" + else + _secondpass="$(cat $ANSWER)" + fi + if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then + if [ "${_firstpass}" != "${_secondpass}" ]; then + DIALOG --infobox "Passwords do not match! please reenter it again" 6 80 + unset _firstpass _secondpass + sleep 2 && continue + fi + set_option ROOTPASSWORD "${_firstpass}" + ROOTPASSWORD_DONE=1 + break + fi + else + return + fi + done +} + +set_rootpassword() { + echo "root:$(get_option ROOTPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512 +} + +menu_bootloader() { + while true; do + DIALOG --title " Select the disk to install the bootloader" \ + --menu "$MENULABEL" ${MENUSIZE} $(show_disks) + if [ $? -eq 0 ]; then + set_option BOOTLOADER "$(cat $ANSWER)" + BOOTLOADER_DONE=1 + break + else + return + fi + done +} + +set_bootloader() { + local dev=$(get_option BOOTLOADER) grub_args= + + # Check if it's an EFI system via efivars module. + if [ -n "$EFI_SYSTEM" ]; then + grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void_grub --recheck" + fi + echo "Running grub-install $grub_args $dev..." >$LOG + chroot $TARGETDIR grub-install $grub_args $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ + failed to install GRUB to $dev!\nCheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + echo "Running grub-mkconfig on $TARGETDIR..." >$LOG + chroot $TARGETDIR grub-mkconfig -o /boot/grub/grub.cfg >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR${RESET}: \ + failed to run grub-mkconfig!\nCheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi +} + +test_network() { + rm -f xtraeme.asc && \ + wget http://xbps.nopcode.org/live/xtraeme.asc >$LOG 2>&1 + if [ $? -eq 0 ]; then + DIALOG --msgbox "Network is working properly!" ${MSGBOXSIZE} + NETWORK_DONE=1 + return 1 + fi + DIALOG --msgbox "Network is unaccessible, please setup it properly." ${MSGBOXSIZE} +} + +configure_wifi() { + local dev="$1" + + DIALOG --form "Wireless configuration for $dev:" 0 0 0 \ + "SSID:" 1 1 "add your AP name here" 1 21 20 0 \ + "Encryption:" 2 1 "Only supported: WEP or WPA-PSK" 2 21 20 0 \ + "Passphrase:" 3 1 "Enter the AP passphrase here" 3 21 20 0 || return 1 +} + +configure_eth() { + local dev="$1" + + DIALOG --yesno "Do you want to use DHCP for $dev?" ${YESNOSIZE} + if [ $? -eq 0 ]; then + configure_net_dhcp $dev + elif [ $? -eq 1 ]; then + configure_net_static $dev + fi +} + +iface_setup() { + ifconfig $1|grep -q 'inet addr:' + return $? +} + +configure_net_dhcp() { + local dev="$1" + + iface_setup $dev + if [ $? -eq 1 ]; then + udhcpc -q -t 10 -n -i $dev 2>&1 | tee $LOG | \ + DIALOG --progressbox "Initializing $dev via DHCP..." ${WIDGET_SIZE} + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to run udhcpc. See $LOG for details." ${MSGBOXSIZE} + return 1 + fi + iface_setup $dev + if [ $? -eq 1 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} DHCP request failed for $dev. Check $LOG for errors." ${MSGBOXSIZE} + return 1 + fi + fi + test_network + if [ $? -eq 1 ]; then + set_option NETWORK "${dev} dhcp" + fi +} + +configure_net_static() { + local ip gw dns1 dns2 dev=$1 + + DIALOG --form "Static IP configuration for $dev:" 0 0 0 \ + "IP address:" 1 1 "192.168.0.2" 1 21 20 0 \ + "Gateway:" 2 1 "192.168.0.1" 2 21 20 0 \ + "DNS Primary" 3 1 "8.8.8.8" 3 21 20 0 \ + "DNS Secondary" 4 1 "8.8.4.4" 4 21 20 0 || return 1 + + set -- $(cat $ANSWER) + ip=$1; gw=$2; dns1=$3; dns2=$4 + echo "running: ifconfig $dev $IPADDR up" >$LOG + ifconfig $dev $ip up >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to setup $dev interface." ${MSGBOXSIZE} + return 1 + fi + route add default gw $gw >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to setup your gateway." ${MSGBOXSIZE} + return 1 + fi + echo "nameserver $dns1" >/etc/resolv.conf + echo "nameserver $dns2" >>/etc/resolv.conf + test_network + if [ $? -eq 1 ]; then + set_option NETWORK "${dev} static $ip $gw $dns1 $dns2" + fi +} + +menu_network() { + local dev addr f DEVICES + + for f in $(ls /sys/class/net); do + [ "$f" = "lo" ] && continue + addr=$(cat /sys/class/net/$f/address) + DEVICES="$DEVICES $f $addr" + done + DIALOG --title " Select the network interface to configure " \ + --menu "$MENULABEL" ${MENUSIZE} ${DEVICES} + if [ $? -eq 0 ]; then + dev=$(cat $ANSWER) + if $(echo $dev|grep -q "wlan[0-9]" 2>/dev/null); then + configure_wifi $dev + else + configure_eth $dev + fi + fi +} + +validate_filesystems() { + local mnts dev size fstype mntpt mkfs rootfound swapfound fmt + local usrfound efi_system_partition + + unset TARGETFS + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; size=$4; mntpt="$5"; mkfs=$6 + shift 6 + + if [ "$mntpt" = "/" ]; then + rootfound=1 + elif [ "$mntpt" = "/usr" ]; then + usrfound=1 + elif [ "$fstype" = "vfat" -a "$mntpt" = "/boot/efi" ]; then + efi_system_partition=1 + fi + if [ "$mkfs" -eq 1 ]; then + fmt="NEW FILESYSTEM: " + fi + if [ -z "$TARGETFS" ]; then + TARGETFS="${fmt}$dev ($size) mounted on $mntpt as ${fstype}\n" + else + TARGETFS="${TARGETFS}${fmt}${dev} ($size) mounted on $mntpt as ${fstype}\n" + fi + done + if [ -z "$rootfound" ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +the mount point for the root filesystem (/) has not yet been configured." ${MSGBOXSIZE} + return 1 + elif [ -n "$usrfound" ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +/usr mount point has been configured but is not supported, please remove it to continue." ${MSGBOXSIZE} + return 1 + elif [ -n "$EFI_SYSTEM" -a -z "$efi_system_partition" ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +The EFI System Partition has not yet been configured, please create it\n +as FAT32, mountpoint /boot/efi and at least with 100MB of size." ${MSGBOXSIZE} + fi + FILESYSTEMS_DONE=1 +} + +create_filesystems() { + local mnts dev mntpt fstype mkfs size rv uuid + + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; mntpt="$5"; mkfs=$6 + shift 6 + + # swap partitions + if [ "$fstype" = "swap" ]; then + swapoff $dev >/dev/null 2>&1 + if [ "$mkfs" -eq 1 ]; then + mkswap $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to create swap on ${dev}!\ncheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + fi + swapon $dev >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to activate swap on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + # Add entry for target fstab + uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g') + echo "UUID=$uuid none swap sw 0 0" >>$TARGET_FSTAB + continue + fi + + if [ "$mkfs" -eq 1 ]; then + case "$fstype" in + vfat) MKFS="mkfs.vfat -F32"; modprobe vfat >$LOG 2>&1;; + xfs) MKFS="mkfs.xfs -f"; modprobe xfs >$LOG 2>&1;; + ext2) MKFS="mke2fs"; modprobe ext2 >$LOG 2>&1;; + ext3) MKFS="mke2fs -j"; modprobe ext3 >$LOG 2>&1;; + ext4) MKFS="mke2fs -t ext4"; modprobe ext4 >$LOG 2>&1;; + btrfs) MKFS="mkfs.btrfs"; modprobe btrfs >$LOG 2>&1;; + esac + DIALOG --infobox "Creating filesystem $fstype on $dev for $mntpt ..." 8 60 + echo "Running $MKFS $dev..." >$LOG + $MKFS $dev >$LOG 2>&1; rv=$? + if [ $rv -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to create filesystem $fstype on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + fi + # Mount rootfs the first one. + [ "$mntpt" != "/" ] && continue + mkdir -p $TARGETDIR + echo "Mounting $dev on $mntpt ($fstype)..." >$LOG + mount -t $fstype $dev $TARGETDIR >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to mount $dev on ${mntpt}! check $LOG for errors." ${MSGBOXSIZE} + DIE 1 + fi + # Add entry to target fstab + uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g') + echo "UUID=$uuid $mntpt $fstype defaults 0 1" >>$TARGET_FSTAB + done + + # mount all filesystems in target rootfs + mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + dev=$2; fstype=$3; mntpt="$5" + shift 6 + [ "$mntpt" = "/" -o "$fstype" = "swap" ] && continue + mkdir -p ${TARGETDIR}${mntpt} + echo "Mounting $dev on $mntpt ($fstype)..." >$LOG + mount -t $fstype $dev ${TARGETDIR}${mntpt} >$LOG 2>&1 + if [ $? -ne 0 ]; then + DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \ +failed to mount $dev on $mntpt! check $LOG for errors." ${MSGBOXSIZE} + DIE + fi + # Add entry to target fstab + uuid=$(blkid $dev|awk '{print $2}'|sed -e 's/UUID=\"\(.*\)\"/\1/g') + echo "UUID=$uuid $mntpt $fstype defaults 0 1" >>$TARGET_FSTAB + done +} + +mount_filesystems() { + for f in sys proc dev; do + [ ! -d $TARGETDIR/$f ] && mkdir $TARGETDIR/$f + echo "Mounting $TARGETDIR/$f..." >$LOG + mount --bind /$f $TARGETDIR/$f >$LOG 2>&1 + done +} + +umount_filesystems() { + local f + + for f in sys proc dev; do + echo "Unmounting $TARGETDIR/$f..." >$LOG + umount $TARGETDIR/$f >$LOG 2>&1 + done + local mnts=$(grep -E '^MOUNTPOINT.*$' $CONF_FILE) + set -- ${mnts} + while [ $# -ne 0 ]; do + local dev=$2; local fstype=$3; local mntpt=$5 + shift 6 + if [ "$fstype" = "swap" ]; then + echo "Disabling swap space on $dev..." >$LOG + swapoff $dev >$LOG 2>&1 + continue + fi + if [ "$mntpt" != "/" ]; then + echo "Unmounting $TARGETDIR/$mntpt..." >$LOG + umount $TARGETDIR/$mntpt >$LOG 2>&1 + fi + done + echo "Unmounting $TARGETDIR..." >$LOG + umount $TARGETDIR >$LOG 2>&1 +} + +install_packages() { + local _grub= + + if [ -n "$EFI_SYSTEM" ]; then + _grub="grub-x86_64-efi" + else + _grub="grub" + fi + + mkdir -p $TARGETDIR/boot/grub + stdbuf -oL xbps-install -C /tmp/xbps.conf \ + -r $TARGETDIR -Sy base-system ${_grub} 2>&1 | \ + DIALOG --title "Installing base system packages..." \ + --programbox 24 80 + if [ $? -ne 0 ]; then + DIE 1 + fi +} + +menu_install() { + # Don't continue if filesystems are not ready. + validate_filesystems || return 1 + + ROOTPASSWORD_DONE="$(get_option ROOTPASSWORD)" + BOOTLOADER_DONE="$(get_option BOOTLOADER)" + + if [ -z "$FILESYSTEMS_DONE" ]; then + DIALOG --msgbox "${BOLD}Required filesystems were not configured, \ +please do so before starting the installation.${RESET}" ${MSGBOXSIZE} + return 1 + elif [ -z "$ROOTPASSWORD_DONE" ]; then + DIALOG --msgbox "${BOLD}The root password has not been configured, \ +please do so before starting the installation.${RESET}" ${MSGBOXSIZE} + return 1 + elif [ -z "$BOOTLOADER_DONE" ]; then + DIALOG --msgbox "${BOLD}The disk to install the bootloader has not been \ +configured, please do so before starting the installation.${RESET}" ${MSGBOXSIZE} + return 1 + fi + + DIALOG --yesno "${BOLD}The following operations will be executed:${RESET}\n\n +${BOLD}${TARGETFS}${RESET}\n +${BOLD}${RED}WARNING: data on partitions will be COMPLETELY DESTROYED for new \ +filesystems.${RESET}\n\n +${BOLD}Do you want to continue?${RESET}" 20 80 || return + unset TARGETFS + + # Create and mount filesystems + create_filesystems + + # mount required fs + mount_filesystems + + # If source not set use defaults. + if [ -z "$SOURCE_DONE" ]; then + enable_localsrc + fi + # Install required packages. + install_packages + + DIALOG --infobox "Applying installer settings..." 4 60 + + # copy target fstab. + install -Dm644 $TARGET_FSTAB $TARGETDIR/etc/fstab + + # set up keymap, locale, timezone, hostname and root passwd. + set_keymap + set_locale + set_timezone + set_hostname + set_rootpassword + + # Copy /etc/skel files for root. + cp $TARGETDIR/etc/skel/.[bix]* $TARGETDIR/root + + # network settings for target + if [ -n "$NETWORK_DONE" ]; then + local net=$(grep -E '^NETWORK.*' $CONF_FILE) + set -- ${net} + local dev=$2; local type=$3; local ip=$4; local gw=$5 + local dns1=$6; local dns2=$7 + if [ "$type" = "dhcp" ]; then + # if user had dhcp enabled, enable dhcpcd service for that device. + chroot $TARGETDIR systemctl enable dhcpcd.service >$LOG 2>&1 + else + # static IP through dhcpcd. + mv $TARGETDIR/etc/dhcpcd.conf $TARGETDIR/etc/dhdpcd.conf.orig + echo "# Static IP configuration set by the void-installer for $dev." \ + >$TARGETDIR/etc/dhcpcd.conf + echo "interface $dev" >>$TARGETDIR/etc/dhcpcd.conf + echo "static ip_address=$ip" >>$TARGETDIR/etc/dhcpcd.conf + echo "static routers=$gw" >>$TARGETDIR/etc/dhcpcd.conf + echo "static domain_name_servers=$dns1 $dns2" >>$TARGETDIR/etc/dhcpcd.conf + chroot $TARGETDIR systemctl enable dhcpcd.service >$LOG 2>&1 + fi + fi + + # install bootloader. + set_bootloader + sync && sync && sync + + # unmount all filesystems. + umount_filesystems + + # installed successfully. + DIALOG --yesno "${BOLD}Void Linux has been installed successfully!${RESET}\n +Do you want to reboot the system?" ${YESNOSIZE} + if [ $? -eq 0 ]; then + shutdown -r now + else + return + fi +} + +enable_localsrc() { + # local and fallback to official remote. + echo "repositories = { /packages, http://xbps.nopcode.org/repos/current }" >/tmp/xbps.conf +} + +enable_netsrc() { + # only remote. + echo "repositories = { http://xbps.nopcode.org/repos/current }" > /tmp/xbps.conf +} + +menu_source() { + local src= + + DIALOG --title " Select installation source " \ + --menu "$MENULABEL" 8 70 0 \ + "Local" "Packages from ISO image" \ + "Network" "Packages from official remote reposity" + case "$(cat $ANSWER)" in + "Local") src="local"; enable_localsrc;; + "Network") src="net"; enable_netsrc; menu_network;; + *) return 1;; + esac + SOURCE_DONE=1 + set_option SOURCE $src +} + +menu() { + if [ -z "$DEFITEM" ]; then + DEFITEM="Keyboard" + fi + + DIALOG --default-item $DEFITEM \ + --extra-button --extra-label "Settings" \ + --title " Void Linux installation menu " \ + --menu "$MENULABEL" 10 70 0 \ + "Keyboard" "Set system keyboard" \ + "Source" "Set source installation" \ + "Hostname" "Set system hostname" \ + "Locale" "Set system locale" \ + "Timezone" "Set system time zone" \ + "RootPassword" "Set system root password" \ + "BootLoader" "Set disk to install bootloader" \ + "Partition" "Partition disk(s)" \ + "Filesystems" "Configure filesystems and mount points" \ + "Install" "Start installation with saved settings" \ + "Exit" "Exit installation" + + if [ $? -eq 3 ]; then + # Show settings + DIALOG --title "Saved settings for installation" --textbox $CONF_FILE 14 60 + return + fi + + case $(cat $ANSWER) in + "Keyboard") menu_keymap && [ -n "$KEYBOARD_DONE" ] && DEFITEM="Source";; + "Source") menu_source && [ -n "$SOURCE_DONE" ] && DEFITEM="Hostname";; + "Hostname") menu_hostname && [ -n "$HOSTNAME_DONE" ] && DEFITEM="Locale";; + "Locale") menu_locale && [ -n "$LOCALE_DONE" ] && DEFITEM="Timezone";; + "Timezone") menu_timezone && [ -n "$TIMEZONE_DONE" ] && DEFITEM="RootPassword";; + "RootPassword") menu_rootpassword && [ -n "$ROOTPASSWORD_DONE" ] && DEFITEM="BootLoader";; + "BootLoader") menu_bootloader && [ -n "$BOOTLOADER_DONE" ] && DEFITEM="Partition";; + "Partition") menu_partitions && [ -n "$PARTITIONS_DONE" ] && DEFITEM="Filesystems";; + "Filesystems") menu_filesystems && [ -n "$FILESYSTEMS_DONE" ] && DEFITEM="Install";; + "Install") menu_install;; + "Exit") DIE;; + *) DIALOG --yesno "Abort Installation?" ${YESNOSIZE} && DIE + esac +} + +# +# main() +# +DIALOG --title "${BOLD}${RED} Enter the void ... ${RESET}" --msgbox "\n +Welcome to the Void Linux installation. A simple and minimal \ +Linux distribution made from scratch and built from the source package tree \ +available for XBPS, a new alternative binary package system.\n\n +The installation should be pretty straightforward, if you are in trouble \ +please join us at ${BOLD}#xbps on irc.freenode.org${RESET}.\n\n +${BOLD}http://www.voidlinux.eu${RESET}\n\n" 16 80 + +while true; do + menu +done + +exit 0 +# vim: set ts=4 sw=4 et: diff --git a/mklive.sh.in b/mklive.sh.in index 6e7abbe..fa9b897 100644 --- a/mklive.sh.in +++ b/mklive.sh.in @@ -1,4 +1,7 @@ #!/bin/bash +# +# vim: set ts=4 sw=4 et: +# #- # Copyright (c) 2009-2013 Juan Romero Pardines. # All rights reserved. @@ -41,8 +44,8 @@ error_out() { write_etc_motd() { cat >> "$ROOTFS/etc/motd" <<_EOF ############################################################################### -Autogenerated by void-mklive "@@MKLIVE_VERSION@@" -------------------------------------------------------------------------------- + Autogenerated by void-mklive "@@MKLIVE_VERSION@@" +############################################################################### Welcome to the Void Linux Live system, you have been autologged in. This user has full sudo(8) permissions without any password, be careful @@ -50,9 +53,11 @@ executing commands through sudo(8). To start the installation please type: -$ sudo void-installer + $ sudo void-installer + +and follow the on-screen instructions. Thanks for using Void Linux. -and follow the on-screen instructions. Thanks for trying Void Linux. + http://www.voidlinux.eu ############################################################################### _EOF @@ -92,8 +97,7 @@ _EOF chmod 644 "$1" } -usage() -{ +usage() { cat <<_EOF Usage: $(basename $0) [options] @@ -137,6 +141,8 @@ install_packages() { if [ -f $ROOTFS/usr/lib/systemd/system/NetworkManager.service ]; then systemd-nspawn -D $ROOTFS systemctl enable NetworkManager.service >>$LOGFILE 2>&1 fi + + install -Dm755 /usr/sbin/void-installer $ROOTFS/usr/sbin/void-installer } generate_initramfs() { @@ -145,31 +151,16 @@ generate_initramfs() { $XBPS_INSTALL_CMD -r $ROOTFS/kernel_temp -y \ base-system void-mklive >>$LOGFILE 2>&1 - # Install some required utilities from util-linux. - install -Dm755 $ROOTFS/kernel_temp/usr/bin/mount "$ROOTFS/usr/bin/mount" - install -Dm755 $ROOTFS/kernel_temp/usr/sbin/agetty "$ROOTFS/usr/sbin/agetty" - install -Dm755 $ROOTFS/kernel_temp/usr/bin/lsblk "$ROOTFS/usr/bin/lsblk" - # Install stdbuf from coreutils, required by void-installer. - install -Dm755 $ROOTFS/kernel_temp/usr/bin/stdbuf "$ROOTFS/usr/bin/stdbuf" - install -Dm755 $ROOTFS/kernel_temp/usr/libexec/coreutils/libstdbuf.so \ - "$ROOTFS/usr/libexec/coreutils/libstdbuf.so" - chroot $ROOTFS/kernel_temp /usr/bin/dracut --no-hostonly \ - --add " dmsquash-live vmklive " --${COMPRESSTYPE} \ + --add "drm dmsquash-live vmklive" --omit "caps" \ + --add-drivers "xfs vfat ext2 ext3 ext4 btrfs" --${COMPRESSTYPE} \ "/boot/initrd.lz" $KERNELVERSION >>$LOGFILE 2>&1 mv $ROOTFS/kernel_temp/boot/initrd.lz $BOOT_DIR - # We rely on pam now, so let's install the host login config. - install -Dm644 $ROOTFS/kernel_temp/etc/pam.d/login \ - "$ROOTFS/etc/pam.d/login" - # Remove pam_motd.so; busybox login already prints it. - sed -e '/^.*pam_motd.so*/d' -i "$ROOTFS/etc/pam.d/login" } copy_kernel_and_modules() { cp -a $ROOTFS/kernel_temp/boot/vmlinuz-$KERNELVERSION $BOOT_DIR/vmlinuz - mkdir -p $ROOTFS/lib/modules - cp -a $ROOTFS/kernel_temp/lib/modules/$KERNELVERSION $ROOTFS/lib/modules # remove temporary rootfs. rm -rf $ROOTFS/kernel_temp @@ -341,7 +332,7 @@ fi if [ -z "$PACKAGE_LIST" ]; then PACKAGE_LIST="base-system-live" else - PACKAGE_LIST="base-system-live $PACKAGE_LIST" + PACKAGE_LIST="$PACKAGE_LIST" fi if [ ! -f $SYSLINUX_DATADIR/isolinux.bin ]; then echo "Missing required isolinux files in $SYSLINUX_DATADIR, exiting..." @@ -461,5 +452,3 @@ hsize=$(du -sh "$OUTPUT_FILE"|awk '{print $1}') info_msg "Created $(readlink -f $OUTPUT_FILE) ($hsize) successfully." exit 0 - -# vim: set ts=4 sw=4 et: diff --git a/mkrootfs.sh.in b/mkrootfs.sh.in new file mode 100644 index 0000000..b26a600 --- /dev/null +++ b/mkrootfs.sh.in @@ -0,0 +1,161 @@ +#!/bin/sh +#- +# Copyright (c) 2013 Juan Romero Pardines. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#- + +readonly PROGNAME=$(basename $0) +readonly ARCH=$(uname -m) +readonly PKGBASE="base-system" + +trap 'printf "\nInterrupted! exiting...\n"; exit $?' INT TERM HUP + +info_msg() { + printf "\033[1m$@\n\033[m" +} + +die() { + echo "FATAL: $@" + [ -d "$rootfs" ] && rm -rf $rootfs + exit 1 +} + +usage() { + echo "Usage: $PROGNAME [-a raspberrypi]" +} + +run_cmd() { + info_msg "Running $@ ..." + if [ -n "${_ARCH}" ]; then + eval XBPS_TARGET_ARCH=${_ARCH} "$@" >/dev/null 2>&1 + else + eval "$@" >/dev/null 2>&1 + fi + [ $? -ne 0 ] && die "Failed to run $@" +} + +register_binfmt() { + if [ "$ARCH" = "${_ARCH}" ]; then + return 0 + fi + case "${_ARCH}" in + armv6l) + echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register + cp -f $(which qemu-arm-static) $rootfs/usr/bin || die "failed to copy qemu-arm-static to the rootfs" + ;; + *) + die "Unknown target architecture!" + ;; + esac +} + +# +# main() +# +while getopts "a:h" opt; do + case $opt in + a) TARGET_ARCH="$OPTARG";; + h) usage; exit 0;; + esac +done +shift $(($OPTIND - 1)) + +if [ "$(id -u)" -ne 0 ]; then + die "need root perms to continue, exiting." +fi + +# +# Check for required binaries. +# +for f in systemd-nspawn xbps-install xbps-reconfigure xbps-query; do + if ! $f --version >/dev/null 2>&1; then + die "$f binary is missing in your system, exiting." + fi +done + +# +# Sanitize target arch. +# +case "$TARGET_ARCH" in + raspberrypi) _ARCH=armv6l; QEMU_BIN=qemu-arm-static;; + *) ;; +esac + +# +# Check if package base-system is available. +# +run_cmd "xbps-query -R -ppkgver $PKGBASE" + +rootfs=$(mktemp -d || die "FATAL: failed to create tempdir, exiting...") +chmod 755 $rootfs + +# +# Install base-system to the rootfs directory. +# +run_cmd "xbps-install -S -r $rootfs -y $PKGBASE" + +# +# Reconfigure packages for target architecture: must be reconfigured +# thru the qemu user mode binary. +# +if [ -n "$TARGET_ARCH" ]; then + info_msg "Reconfiguring packages for $TARGET_ARCH ..." + register_binfmt + xbps-reconfigure -r $rootfs base-directories + run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure shadow" + run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure systemd" + run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure -a" + (rm -f $rootfs/lib32; rm -f $rootfs/lib64) >/dev/null 2>&1 +else + run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure -f systemd" +fi + +# +# Setup default root password. +# +chroot $rootfs sh -c 'echo "root:voidlinux" | chpasswd -c SHA512' + +# +# Cleanup rootfs. +# +rm -rf $rootfs/dev/* $rootfs/run/* $rootfs/tmp/* $rootfs/tmp/.* 2>/dev/null +rm -f $rootfs/etc/.pwd.lock 2>/dev/null +rm -rf $rootfs/var/cache/xbps 2>/dev/null + +# +# Generate final tarball. +# +arch=$ARCH +if [ -n "$TARGET_ARCH" ]; then + rm -f $rootfs/usr/bin/qemu-*-static + arch=$TARGET_ARCH +fi + +tarball=void-${arch}-rootfs-$(date '+%Y%m%d').tar.xz + +run_cmd "tar cp -C $rootfs . | xz -9 > $tarball" +rm -rf $rootfs + +info_msg "Successfully created $tarball" + +# vim: set ts=4 sw=4 et: diff --git a/void-mkrootfs.sh b/void-mkrootfs.sh deleted file mode 100755 index b26a600..0000000 --- a/void-mkrootfs.sh +++ /dev/null @@ -1,161 +0,0 @@ -#!/bin/sh -#- -# Copyright (c) 2013 Juan Romero Pardines. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#- - -readonly PROGNAME=$(basename $0) -readonly ARCH=$(uname -m) -readonly PKGBASE="base-system" - -trap 'printf "\nInterrupted! exiting...\n"; exit $?' INT TERM HUP - -info_msg() { - printf "\033[1m$@\n\033[m" -} - -die() { - echo "FATAL: $@" - [ -d "$rootfs" ] && rm -rf $rootfs - exit 1 -} - -usage() { - echo "Usage: $PROGNAME [-a raspberrypi]" -} - -run_cmd() { - info_msg "Running $@ ..." - if [ -n "${_ARCH}" ]; then - eval XBPS_TARGET_ARCH=${_ARCH} "$@" >/dev/null 2>&1 - else - eval "$@" >/dev/null 2>&1 - fi - [ $? -ne 0 ] && die "Failed to run $@" -} - -register_binfmt() { - if [ "$ARCH" = "${_ARCH}" ]; then - return 0 - fi - case "${_ARCH}" in - armv6l) - echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register - cp -f $(which qemu-arm-static) $rootfs/usr/bin || die "failed to copy qemu-arm-static to the rootfs" - ;; - *) - die "Unknown target architecture!" - ;; - esac -} - -# -# main() -# -while getopts "a:h" opt; do - case $opt in - a) TARGET_ARCH="$OPTARG";; - h) usage; exit 0;; - esac -done -shift $(($OPTIND - 1)) - -if [ "$(id -u)" -ne 0 ]; then - die "need root perms to continue, exiting." -fi - -# -# Check for required binaries. -# -for f in systemd-nspawn xbps-install xbps-reconfigure xbps-query; do - if ! $f --version >/dev/null 2>&1; then - die "$f binary is missing in your system, exiting." - fi -done - -# -# Sanitize target arch. -# -case "$TARGET_ARCH" in - raspberrypi) _ARCH=armv6l; QEMU_BIN=qemu-arm-static;; - *) ;; -esac - -# -# Check if package base-system is available. -# -run_cmd "xbps-query -R -ppkgver $PKGBASE" - -rootfs=$(mktemp -d || die "FATAL: failed to create tempdir, exiting...") -chmod 755 $rootfs - -# -# Install base-system to the rootfs directory. -# -run_cmd "xbps-install -S -r $rootfs -y $PKGBASE" - -# -# Reconfigure packages for target architecture: must be reconfigured -# thru the qemu user mode binary. -# -if [ -n "$TARGET_ARCH" ]; then - info_msg "Reconfiguring packages for $TARGET_ARCH ..." - register_binfmt - xbps-reconfigure -r $rootfs base-directories - run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure shadow" - run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure systemd" - run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure -a" - (rm -f $rootfs/lib32; rm -f $rootfs/lib64) >/dev/null 2>&1 -else - run_cmd "systemd-nspawn -D $rootfs xbps-reconfigure -f systemd" -fi - -# -# Setup default root password. -# -chroot $rootfs sh -c 'echo "root:voidlinux" | chpasswd -c SHA512' - -# -# Cleanup rootfs. -# -rm -rf $rootfs/dev/* $rootfs/run/* $rootfs/tmp/* $rootfs/tmp/.* 2>/dev/null -rm -f $rootfs/etc/.pwd.lock 2>/dev/null -rm -rf $rootfs/var/cache/xbps 2>/dev/null - -# -# Generate final tarball. -# -arch=$ARCH -if [ -n "$TARGET_ARCH" ]; then - rm -f $rootfs/usr/bin/qemu-*-static - arch=$TARGET_ARCH -fi - -tarball=void-${arch}-rootfs-$(date '+%Y%m%d').tar.xz - -run_cmd "tar cp -C $rootfs . | xz -9 > $tarball" -rm -rf $rootfs - -info_msg "Successfully created $tarball" - -# vim: set ts=4 sw=4 et: -- cgit 1.4.1