installer.sh.in 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. #!/bin/bash
  2. #-
  3. # Copyright (c) 2012-2015 Juan Romero Pardines <[email protected]>.
  4. # 2012 Dave Elusive <[email protected]>.
  5. # All rights reserved.
  6. #
  7. # Redistribution and use in source and binary forms, with or without
  8. # modification, are permitted provided that the following conditions
  9. # are met:
  10. # 1. Redistributions of source code must retain the above copyright
  11. # notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. # notice, this list of conditions and the following disclaimer in the
  14. # documentation and/or other materials provided with the distribution.
  15. #
  16. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  17. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  18. # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  19. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  20. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  21. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  22. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  23. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. #-
  27. # Make sure we don't inherit these from env.
  28. SOURCE_DONE=
  29. HOSTNAME_DONE=
  30. KEYBOARD_DONE=
  31. LOCALE_DONE=
  32. TIMEZONE_DONE=
  33. ROOTPASSWORD_DONE=
  34. USERLOGIN_DONE=
  35. USERPASSWORD_DONE=
  36. USERNAME_DONE=
  37. USERGROUPS_DONE=
  38. BOOTLOADER_DONE=
  39. PARTITIONS_DONE=
  40. NETWORK_DONE=
  41. FILESYSTEMS_DONE=
  42. TARGETDIR=/mnt/target
  43. LOG=/dev/tty8
  44. CONF_FILE=/tmp/.void-installer.conf
  45. if [ ! -f $CONF_FILE ]; then
  46. touch -f $CONF_FILE
  47. fi
  48. ANSWER=$(mktemp -t vinstall-XXXXXXXX || exit 1)
  49. TARGET_FSTAB=$(mktemp -t vinstall-fstab-XXXXXXXX || exit 1)
  50. trap "DIE" INT TERM QUIT
  51. # disable printk
  52. if [ -w /proc/sys/kernel/printk ]; then
  53. echo 0 >/proc/sys/kernel/printk
  54. fi
  55. # Detect if this is an EFI system.
  56. if [ -e /sys/firmware/efi/systab ]; then
  57. EFI_SYSTEM=1
  58. fi
  59. # dialog colors
  60. BLACK="\Z0"
  61. RED="\Z1"
  62. GREEN="\Z2"
  63. YELLOW="\Z3"
  64. BLUE="\Z4"
  65. MAGENTA="\Z5"
  66. CYAN="\Z6"
  67. WHITE="\Z7"
  68. BOLD="\Zb"
  69. REVERSE="\Zr"
  70. UNDERLINE="\Zu"
  71. RESET="\Zn"
  72. # Properties shared per widget.
  73. MENULABEL="${BOLD}Use UP and DOWN keys to navigate \
  74. menus. Use TAB to switch between buttons and ENTER to select.${RESET}"
  75. MENUSIZE="14 60 0"
  76. INPUTSIZE="8 60"
  77. MSGBOXSIZE="8 70"
  78. YESNOSIZE="$INPUTSIZE"
  79. WIDGET_SIZE="10 70"
  80. DIALOG() {
  81. rm -f $ANSWER
  82. dialog --colors --keep-tite --no-shadow --no-mouse \
  83. --backtitle "${BOLD}${WHITE}Void Linux installation -- http://www.voidlinux.eu/ (@@MKLIVE_VERSION@@)${RESET}" \
  84. --cancel-label "Back" --aspect 20 "$@" 2>$ANSWER
  85. return $?
  86. }
  87. DIE() {
  88. rval=$1
  89. [ -z "$rval" ] && rval=0
  90. clear
  91. rm -f $ANSWER $TARGET_FSTAB
  92. # reenable printk
  93. if [ -w /proc/sys/kernel/printk ]; then
  94. echo 4 >/proc/sys/kernel/printk
  95. fi
  96. umount_filesystems
  97. exit $rval
  98. }
  99. set_option() {
  100. if grep -Eq "^${1}.*" $CONF_FILE; then
  101. sed -i -e "/^${1}.*/d" $CONF_FILE
  102. fi
  103. echo "${1} ${2}" >>$CONF_FILE
  104. }
  105. get_option() {
  106. echo $(grep -E "^${1}.*" $CONF_FILE|sed -e "s|${1}||")
  107. }
  108. # ISO-639 language names for locales
  109. iso639_language() {
  110. case "$1" in
  111. aa) echo "Afar" ;;
  112. af) echo "Afrikaans" ;;
  113. an) echo "Aragonese" ;;
  114. ar) echo "Arabic" ;;
  115. ast) echo "Asturian" ;;
  116. be) echo "Belgian" ;;
  117. bg) echo "Bulgarian" ;;
  118. bhb) echo "Bhili" ;;
  119. br) echo "Breton" ;;
  120. bs) echo "Bosnian" ;;
  121. ca) echo "Catalan" ;;
  122. cs) echo "Czech" ;;
  123. cy) echo "Welsh" ;;
  124. da) echo "Danish" ;;
  125. de) echo "German" ;;
  126. el) echo "Greek" ;;
  127. en) echo "English" ;;
  128. es) echo "Spanish" ;;
  129. et) echo "Estonian" ;;
  130. eu) echo "Basque" ;;
  131. fi) echo "Finnish" ;;
  132. fo) echo "Faroese" ;;
  133. fr) echo "French" ;;
  134. ga) echo "Irish" ;;
  135. gd) echo "Scottish Gaelic" ;;
  136. gl) echo "Galician" ;;
  137. gv) echo "Manx" ;;
  138. he) echo "Hebrew" ;;
  139. hr) echo "Croatian" ;;
  140. hsb) echo "Upper Sorbian" ;;
  141. hu) echo "Hungarian" ;;
  142. id) echo "Indonesian" ;;
  143. is) echo "Icelandic" ;;
  144. it) echo "Italian" ;;
  145. iw) echo "Hebrew" ;;
  146. ja) echo "Japanese" ;;
  147. ka) echo "Georgian" ;;
  148. kk) echo "Kazakh" ;;
  149. kl) echo "Kalaallisut" ;;
  150. ko) echo "Korean" ;;
  151. ku) echo "Kurdish" ;;
  152. kw) echo "Cornish" ;;
  153. lg) echo "Ganda" ;;
  154. lt) echo "Lithuanian" ;;
  155. lv) echo "Latvian" ;;
  156. mg) echo "Malagasy" ;;
  157. mi) echo "Maori" ;;
  158. mk) echo "Macedonian" ;;
  159. ms) echo "Malay" ;;
  160. mt) echo "Maltese" ;;
  161. nb) echo "Norwegian Bokmål" ;;
  162. nl) echo "Dutch" ;;
  163. nn) echo "Norwegian Nynorsk" ;;
  164. oc) echo "Occitan" ;;
  165. om) echo "Oromo" ;;
  166. pl) echo "Polish" ;;
  167. pt) echo "Portugese" ;;
  168. ro) echo "Romanian" ;;
  169. ru) echo "Russian" ;;
  170. sk) echo "Slovak" ;;
  171. sl) echo "Slovenian" ;;
  172. so) echo "Somali" ;;
  173. sq) echo "Albanian" ;;
  174. st) echo "Southern Sotho" ;;
  175. sv) echo "Swedish" ;;
  176. tcy) echo "Tulu" ;;
  177. tg) echo "Tajik" ;;
  178. th) echo "Thai" ;;
  179. tl) echo "Tagalog" ;;
  180. tr) echo "Turkish" ;;
  181. uk) echo "Ukrainian" ;;
  182. uz) echo "Uzbek" ;;
  183. wa) echo "Walloon" ;;
  184. xh) echo "Xhosa" ;;
  185. yi) echo "Yiddish" ;;
  186. zh) echo "Chinese" ;;
  187. zu) echo "Zulu" ;;
  188. *) echo "$1" ;;
  189. esac
  190. }
  191. # ISO-3166 country codes for locales
  192. iso3166_country() {
  193. case "$1" in
  194. AD) echo "Andorra" ;;
  195. AE) echo "United Arab Emirates" ;;
  196. AL) echo "Albania" ;;
  197. AR) echo "Argentina" ;;
  198. AT) echo "Austria" ;;
  199. AU) echo "Australia" ;;
  200. BA) echo "Bonsia and Herzegovina" ;;
  201. BE) echo "Belgium" ;;
  202. BG) echo "Bulgaria" ;;
  203. BH) echo "Bahrain" ;;
  204. BO) echo "Bolivia" ;;
  205. BR) echo "Brazil" ;;
  206. BW) echo "Botswana" ;;
  207. BY) echo "Belarus" ;;
  208. CA) echo "Canada" ;;
  209. CH) echo "Switzerland" ;;
  210. CL) echo "Chile" ;;
  211. CN) echo "China" ;;
  212. CO) echo "Colombia" ;;
  213. CR) echo "Costa Rica" ;;
  214. CY) echo "Cyprus" ;;
  215. CZ) echo "Czech Republic" ;;
  216. DE) echo "Germany" ;;
  217. DJ) echo "Djibouti" ;;
  218. DK) echo "Denmark" ;;
  219. DO) echo "Dominican Republic" ;;
  220. DZ) echo "Algeria" ;;
  221. EC) echo "Ecuador" ;;
  222. EE) echo "Estonia" ;;
  223. EG) echo "Egypt" ;;
  224. ES) echo "Spain" ;;
  225. FI) echo "Finland" ;;
  226. FO) echo "Faroe Islands" ;;
  227. FR) echo "France" ;;
  228. GB) echo "Great Britain" ;;
  229. GE) echo "Georgia" ;;
  230. GL) echo "Greenland" ;;
  231. GR) echo "Greece" ;;
  232. GT) echo "Guatemala" ;;
  233. HK) echo "Hong Kong" ;;
  234. HN) echo "Honduras" ;;
  235. HR) echo "Croatia" ;;
  236. HU) echo "Hungary" ;;
  237. ID) echo "Indonesia" ;;
  238. IE) echo "Ireland" ;;
  239. IL) echo "Israel" ;;
  240. IN) echo "India" ;;
  241. IQ) echo "Iraq" ;;
  242. IS) echo "Iceland" ;;
  243. IT) echo "Italy" ;;
  244. JO) echo "Jordan" ;;
  245. JP) echo "Japan" ;;
  246. KE) echo "Kenya" ;;
  247. KR) echo "Korea, Republic of" ;;
  248. KW) echo "Kuwait" ;;
  249. KZ) echo "Kazakhstan" ;;
  250. LB) echo "Lebanon" ;;
  251. LT) echo "Lithuania" ;;
  252. LU) echo "Luxembourg" ;;
  253. LV) echo "Latvia" ;;
  254. LY) echo "Libya" ;;
  255. MA) echo "Morocco" ;;
  256. MG) echo "Madagascar" ;;
  257. MK) echo "Macedonia" ;;
  258. MT) echo "Malta" ;;
  259. MX) echo "Mexico" ;;
  260. MY) echo "Malaysia" ;;
  261. NI) echo "Nicaragua" ;;
  262. NL) echo "Netherlands" ;;
  263. NO) echo "Norway" ;;
  264. NZ) echo "New Zealand" ;;
  265. OM) echo "Oman" ;;
  266. PA) echo "Panama" ;;
  267. PE) echo "Peru" ;;
  268. PH) echo "Philippines" ;;
  269. PL) echo "Poland" ;;
  270. PR) echo "Puerto Rico" ;;
  271. PT) echo "Portugal" ;;
  272. PY) echo "Paraguay" ;;
  273. QA) echo "Qatar" ;;
  274. RO) echo "Romania" ;;
  275. RU) echo "Russian Federation" ;;
  276. SA) echo "Saudi Arabia" ;;
  277. SD) echo "Sudan" ;;
  278. SE) echo "Sweden" ;;
  279. SG) echo "Singapore" ;;
  280. SI) echo "Slovenia" ;;
  281. SK) echo "Slovakia" ;;
  282. SO) echo "Somalia" ;;
  283. SV) echo "El Salvador" ;;
  284. SY) echo "Syria" ;;
  285. TH) echo "Thailand" ;;
  286. TJ) echo "Tajikistan" ;;
  287. TN) echo "Tunisia" ;;
  288. TR) echo "Turkey" ;;
  289. TW) echo "Taiwan" ;;
  290. UA) echo "Ukraine" ;;
  291. UG) echo "Uganda" ;;
  292. US) echo "United States of America" ;;
  293. UY) echo "Uruguay" ;;
  294. UZ) echo "Uzbekistan" ;;
  295. VE) echo "Venezuela" ;;
  296. YE) echo "Yemen" ;;
  297. ZA) echo "South Africa" ;;
  298. ZW) echo "Zimbabwe" ;;
  299. *) echo "$1" ;;
  300. esac
  301. }
  302. show_disks() {
  303. local dev size sectorsize gbytes
  304. # IDE
  305. for dev in $(ls /sys/block|grep -E '^hd'); do
  306. if [ "$(cat /sys/block/$dev/device/media)" = "disk" ]; then
  307. # Find out nr sectors and bytes per sector;
  308. echo "/dev/$dev"
  309. size=$(cat /sys/block/$dev/size)
  310. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  311. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  312. echo "size:${gbytes}GB;sector_size:$sectorsize"
  313. fi
  314. done
  315. # SATA/SCSI and Virtual disks (virtio)
  316. for dev in $(ls /sys/block|grep -E '^([sv]|xv)d|mmcblk'); do
  317. echo "/dev/$dev"
  318. size=$(cat /sys/block/$dev/size)
  319. sectorsize=$(cat /sys/block/$dev/queue/hw_sector_size)
  320. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  321. echo "size:${gbytes}GB;sector_size:$sectorsize"
  322. done
  323. # cciss(4) devices
  324. for dev in $(ls /dev/cciss 2>/dev/null|grep -E 'c[0-9]d[0-9]$'); do
  325. echo "/dev/cciss/$dev"
  326. size=$(cat /sys/block/cciss\!$dev/size)
  327. sectorsize=$(cat /sys/block/cciss\!$dev/queue/hw_sector_size)
  328. gbytes="$(($size * $sectorsize / 1024 / 1024 / 1024))"
  329. echo "size:${gbytes}GB;sector_size:$sectorsize"
  330. done
  331. }
  332. show_partitions() {
  333. local dev fstype fssize p part
  334. set -- $(show_disks)
  335. while [ $# -ne 0 ]; do
  336. disk=$(basename $1)
  337. shift 2
  338. # ATA/SCSI/SATA
  339. for p in /sys/block/$disk/$disk*; do
  340. if [ -d $p ]; then
  341. part=$(basename $p)
  342. fstype=$(lsblk -nfr /dev/$part|awk '{print $2}'|head -1)
  343. [ "$fstype" = "iso9660" ] && continue
  344. [ "$fstype" = "crypto_LUKS" ] && continue
  345. [ "$fstype" = "LVM2_member" ] && continue
  346. fssize=$(lsblk -nr /dev/$part|awk '{print $4}'|head -1)
  347. echo "/dev/$part"
  348. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  349. fi
  350. done
  351. done
  352. # Software raid (md)
  353. for p in $(ls -d /dev/md* 2>/dev/null|grep '[0-9]'); do
  354. part=$(basename $p)
  355. if cat /proc/mdstat|grep -qw $part; then
  356. fstype=$(lsblk -nfr /dev/$part|awk '{print $2}')
  357. [ "$fstype" = "crypto_LUKS" ] && continue
  358. [ "$fstype" = "LVM2_member" ] && continue
  359. fssize=$(lsblk -nr /dev/$part|awk '{print $4}')
  360. echo "$p"
  361. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  362. fi
  363. done
  364. # cciss(4) devices
  365. for part in $(ls /dev/cciss 2>/dev/null|grep -E 'c[0-9]d[0-9]p[0-9]+'); do
  366. fstype=$(lsblk -nfr /dev/cciss/$part|awk '{print $2}')
  367. [ "$fstype" = "crypto_LUKS" ] && continue
  368. [ "$fstype" = "LVM2_member" ] && continue
  369. fssize=$(lsblk -nr /dev/cciss/$part|awk '{print $4}')
  370. echo "/dev/cciss/$part"
  371. echo "size:${fssize:-unknown};fstype:${fstype:-none}"
  372. done
  373. if [ -e /sbin/lvs ]; then
  374. # LVM
  375. lvs --noheadings|while read lvname vgname perms size; do
  376. echo "/dev/mapper/${vgname}-${lvname}"
  377. echo "size:${size};fstype:lvm"
  378. done
  379. fi
  380. }
  381. menu_filesystems() {
  382. local dev fstype fssize mntpoint reformat
  383. while true; do
  384. DIALOG --title " Select the partition to edit " --menu "$MENULABEL" \
  385. ${MENUSIZE} $(show_partitions)
  386. [ $? -ne 0 ] && return
  387. dev=$(cat $ANSWER)
  388. DIALOG --title " Select the filesystem type for $dev " \
  389. --menu "$MENULABEL" ${MENUSIZE} \
  390. "btrfs" "Oracle's Btrfs" \
  391. "ext2" "Linux ext2 (no journaling)" \
  392. "ext3" "Linux ext3 (journal)" \
  393. "ext4" "Linux ext4 (journal)" \
  394. "f2fs" "Flash-Friendly Filesystem" \
  395. "swap" "Linux swap" \
  396. "vfat" "FAT32" \
  397. "xfs" "SGI's XFS"
  398. if [ $? -eq 0 ]; then
  399. fstype=$(cat $ANSWER)
  400. else
  401. continue
  402. fi
  403. if [ "$fstype" != "swap" ]; then
  404. DIALOG --inputbox "Please specify the mount point for $dev:" ${INPUTSIZE}
  405. if [ $? -eq 0 ]; then
  406. mntpoint=$(cat $ANSWER)
  407. elif [ $? -eq 1 ]; then
  408. continue
  409. fi
  410. else
  411. mntpoint=swap
  412. fi
  413. DIALOG --yesno "Do you want to create a new filesystem on $dev?" ${YESNOSIZE}
  414. if [ $? -eq 0 ]; then
  415. reformat=1
  416. elif [ $? -eq 1 ]; then
  417. reformat=0
  418. else
  419. continue
  420. fi
  421. fssize=$(lsblk -nr $dev|awk '{print $4}')
  422. set -- "$fstype" "$fssize" "$mntpoint" "$reformat"
  423. if [ -n "$1" -a -n "$2" -a -n "$3" -a -n "$4" ]; then
  424. local bdev=$(basename $dev)
  425. local ddev=$(basename $(dirname $dev))
  426. if [ "$ddev" != "dev" ]; then
  427. sed -i -e "/^MOUNTPOINT \/dev\/${ddev}\/${bdev}.*/d" $CONF_FILE
  428. else
  429. sed -i -e "/^MOUNTPOINT \/dev\/${bdev}.*/d" $CONF_FILE
  430. fi
  431. echo "MOUNTPOINT $dev $1 $2 $3 $4" >>$CONF_FILE
  432. fi
  433. done
  434. }
  435. menu_partitions() {
  436. DIALOG --title " Select the disk to partition " \
  437. --menu "$MENULABEL" ${MENUSIZE} $(show_disks)
  438. if [ $? -eq 0 ]; then
  439. local device=$(cat $ANSWER)
  440. DIALOG --title "Modify Partition Table on $device" --msgbox "\n
  441. ${BOLD}cfdisk will be executed in disk $device.${RESET}\n\n
  442. For BIOS systems, MBR or GPT partition tables are supported.\n
  443. To use GPT on PC BIOS systems an empty partition of 1MB must be added\n
  444. at the first 2GB of the disk with the TOGGLE \`bios_grub' enabled.\n
  445. ${BOLD}NOTE: you don't need this on EFI systems.${RESET}\n\n
  446. For EFI systems GPT is mandatory and a FAT32 partition with at least\n
  447. 100MB must be created with the TOGGLE \`boot', this will be used as\n
  448. EFI System Partition. This partition must have mountpoint as \`/boot/efi'.\n\n
  449. At least 1 partitions is required for the rootfs (/).\n
  450. For swap, RAM*2 must be really enough. For / 600MB are required.\n\n
  451. ${BOLD}WARNING: /usr is not supported as a separate partition.${RESET}\n
  452. ${RESET}\n" 18 80
  453. if [ $? -eq 0 ]; then
  454. while true; do
  455. clear; cfdisk $device; PARTITIONS_DONE=1
  456. break
  457. done
  458. else
  459. return
  460. fi
  461. fi
  462. }
  463. menu_keymap() {
  464. local _keymaps="$(find /usr/share/kbd/keymaps/ -type f -iname "*.map.gz" -printf "%f\n" | sed 's|.map.gz||g' | sort)"
  465. local _KEYMAPS=
  466. for f in ${_keymaps}; do
  467. _KEYMAPS="${_KEYMAPS} ${f} -"
  468. done
  469. while true; do
  470. DIALOG --title " Select your keymap " --menu "$MENULABEL" 14 70 14 ${_KEYMAPS}
  471. if [ $? -eq 0 ]; then
  472. set_option KEYMAP "$(cat $ANSWER)"
  473. loadkeys "$(cat $ANSWER)"
  474. KEYBOARD_DONE=1
  475. break
  476. else
  477. return
  478. fi
  479. done
  480. }
  481. set_keymap() {
  482. local KEYMAP=$(get_option KEYMAP)
  483. if [ -f /etc/vconsole.conf ]; then
  484. sed -i -e "s|KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/vconsole.conf
  485. else
  486. sed -i -e "s|#\?KEYMAP=.*|KEYMAP=$KEYMAP|g" $TARGETDIR/etc/rc.conf
  487. fi
  488. }
  489. menu_locale() {
  490. local _locales="$(grep -E '\.UTF-8' /etc/default/libc-locales|awk '{print $1}'|sed -e 's/^#//')"
  491. local LOCALES ISO639 ISO3166
  492. local TMPFILE=$(mktemp -t vinstall-XXXXXXXX || exit 1)
  493. echo "Scanning locales..."
  494. for f in ${_locales}; do
  495. eval $(echo $f | awk 'BEGIN { FS="." } \
  496. { FS="_"; split($1, a); printf "ISO639=%s ISO3166=%s\n", a[1], a[2] }')
  497. echo "$f|$(iso639_language $ISO639) ($(iso3166_country $ISO3166))|" >> $TMPFILE
  498. done
  499. # Sort by ISO-639 language names
  500. LOCALES=$(sort -t '|' -k 2 < $TMPFILE | xargs | sed -e's/| /|/g')
  501. rm -f $TMPFILE
  502. while true; do
  503. (IFS="|"; DIALOG --title " Select your locale " --menu "$MENULABEL" 18 70 18 ${LOCALES})
  504. if [ $? -eq 0 ]; then
  505. set_option LOCALE "$(cat $ANSWER)"
  506. LOCALE_DONE=1
  507. break
  508. else
  509. return
  510. fi
  511. done
  512. }
  513. set_locale() {
  514. if [ -f $TARGETDIR/etc/default/libc-locales ]; then
  515. local LOCALE=$(get_option LOCALE)
  516. sed -i -e "s|LANG=.*|LANG=$LOCALE|g" $TARGETDIR/etc/locale.conf
  517. # Uncomment locale from /etc/default/libc-locales and regenerate it.
  518. sed -e "/${LOCALE}/s/^\#//" -i $TARGETDIR/etc/default/libc-locales
  519. echo "Running xbps-reconfigure -f glibc-locales ..." >$LOG
  520. chroot $TARGETDIR xbps-reconfigure -f glibc-locales >$LOG 2>&1
  521. fi
  522. }
  523. menu_timezone() {
  524. local _tzones="$(cd /usr/share/zoneinfo; find Africa/ America/ Antarctica/ Arctic/ Asia/ Atlantic/ Australia/ Europe/ Indian/ Pacific/ posix/ -type f | sort)"
  525. local _TIMEZONES=
  526. for f in ${_tzones}; do
  527. _TIMEZONES="${_TIMEZONES} ${f} -"
  528. done
  529. while true; do
  530. DIALOG --title " Select your timezone " --menu "$MENULABEL" 14 70 14 ${_TIMEZONES}
  531. if [ $? -eq 0 ]; then
  532. set_option TIMEZONE "$(cat $ANSWER)"
  533. TIMEZONE_DONE=1
  534. break
  535. else
  536. return
  537. fi
  538. done
  539. }
  540. set_timezone() {
  541. local TIMEZONE="$(get_option TIMEZONE)"
  542. sed -i -e "s|#TIMEZONE=.*|TIMEZONE=$TIMEZONE|g" $TARGETDIR/etc/rc.conf
  543. }
  544. menu_hostname() {
  545. while true; do
  546. DIALOG --inputbox "Set the machine hostname:" ${INPUTSIZE}
  547. if [ $? -eq 0 ]; then
  548. set_option HOSTNAME "$(cat $ANSWER)"
  549. HOSTNAME_DONE=1
  550. break
  551. else
  552. return
  553. fi
  554. done
  555. }
  556. set_hostname() {
  557. echo $(get_option HOSTNAME) > $TARGETDIR/etc/hostname
  558. }
  559. menu_rootpassword() {
  560. local _firstpass _secondpass _desc
  561. while true; do
  562. if [ -n "${_firstpass}" ]; then
  563. _desc="Enter the root password again"
  564. else
  565. _desc="Enter the root password"
  566. fi
  567. DIALOG --insecure --passwordbox "${_desc}" ${INPUTSIZE}
  568. if [ $? -eq 0 ]; then
  569. if [ -z "${_firstpass}" ]; then
  570. _firstpass="$(cat $ANSWER)"
  571. else
  572. _secondpass="$(cat $ANSWER)"
  573. fi
  574. if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then
  575. if [ "${_firstpass}" != "${_secondpass}" ]; then
  576. DIALOG --infobox "Passwords do not match! Please enter again." 6 80
  577. unset _firstpass _secondpass
  578. sleep 2 && continue
  579. fi
  580. set_option ROOTPASSWORD "${_firstpass}"
  581. ROOTPASSWORD_DONE=1
  582. break
  583. fi
  584. else
  585. return
  586. fi
  587. done
  588. }
  589. set_rootpassword() {
  590. echo "root:$(get_option ROOTPASSWORD)" | chpasswd -R $TARGETDIR -c SHA512
  591. }
  592. menu_useraccount() {
  593. local _firstpass _secondpass _desc
  594. local _groups _status _group _checklist
  595. while true; do
  596. DIALOG --inputbox "Enter a primary login name:" ${INPUTSIZE} "void"
  597. if [ $? -eq 0 ]; then
  598. set_option USERLOGIN "$(cat $ANSWER)"
  599. USERLOGIN_DONE=1
  600. break
  601. else
  602. return
  603. fi
  604. done
  605. while true; do
  606. DIALOG --inputbox "Enter a user name for login '$(get_option USERLOGIN)' :" \
  607. ${INPUTSIZE} "$(get_option USERLOGIN)"
  608. if [ $? -eq 0 ]; then
  609. set_option USERNAME "$(cat $ANSWER)"
  610. USERNAME_DONE=1
  611. break
  612. else
  613. return
  614. fi
  615. done
  616. while true; do
  617. if [ -n "${_firstpass}" ]; then
  618. _desc="Enter the password for login '$(get_option USERLOGIN)' again"
  619. else
  620. _desc="Enter the password for login '$(get_option USERLOGIN)'"
  621. fi
  622. DIALOG --insecure --passwordbox "${_desc}" ${INPUTSIZE}
  623. if [ $? -eq 0 ]; then
  624. if [ -z "${_firstpass}" ]; then
  625. _firstpass="$(cat $ANSWER)"
  626. else
  627. _secondpass="$(cat $ANSWER)"
  628. fi
  629. if [ -n "${_firstpass}" -a -n "${_secondpass}" ]; then
  630. if [ "${_firstpass}" != "${_secondpass}" ]; then
  631. DIALOG --infobox "Passwords do not match! Please enter again." 6 80
  632. unset _firstpass _secondpass
  633. sleep 2 && continue
  634. fi
  635. set_option USERPASSWORD "${_firstpass}"
  636. USERPASSWORD_DONE=1
  637. break
  638. fi
  639. else
  640. return
  641. fi
  642. done
  643. _groups="wheel,audio,video,floppy,cdrom,optical,kvm,xbuilder"
  644. while true; do
  645. _desc="Select group membership for login '$(get_option USERLOGIN)':"
  646. for _group in $(cat /etc/group); do
  647. _gid="$(echo ${_group} | cut -d: -f3)"
  648. _group="$(echo ${_group} | cut -d: -f1)"
  649. _status="$(echo ${_groups} | grep -w ${_group})"
  650. if [ -z "${_status}" ]; then
  651. _status=off
  652. else
  653. _status=on
  654. fi
  655. if [ -z "${_checklist}" ]; then
  656. _checklist="${_group} ${_group}:${_gid} ${_status}"
  657. else
  658. _checklist="${_checklist} ${_group} ${_group}:${_gid} ${_status}"
  659. fi
  660. done
  661. DIALOG --no-tags --checklist "${_desc}" 20 60 18 ${_checklist}
  662. if [ $? -eq 0 ]; then
  663. set_option USERGROUPS $(cat $ANSWER | sed -e's| |,|g')
  664. USERGROUPS_DONE=1
  665. break
  666. else
  667. return
  668. fi
  669. done
  670. }
  671. set_useraccount() {
  672. [ -z "$USERLOGIN_DONE" ] && return
  673. [ -z "$USERPASSWORD_DONE" ] && return
  674. [ -z "$USERNAME_DONE" ] && return
  675. [ -z "$USERGROUPS_DONE" ] && return
  676. useradd -R $TARGETDIR -m -G $(get_option USERGROUPS) \
  677. -c "$(get_option USERNAME)" $(get_option USERLOGIN)
  678. echo "$(get_option USERLOGIN):$(get_option USERPASSWORD)" | \
  679. chpasswd -R $TARGETDIR -c SHA512
  680. }
  681. menu_bootloader() {
  682. while true; do
  683. DIALOG --title " Select the disk to install the bootloader" \
  684. --menu "$MENULABEL" ${MENUSIZE} $(show_disks) none "Manage bootloader otherwise"
  685. if [ $? -eq 0 ]; then
  686. set_option BOOTLOADER "$(cat $ANSWER)"
  687. BOOTLOADER_DONE=1
  688. break
  689. else
  690. return
  691. fi
  692. done
  693. while true; do
  694. DIALOG --yesno "Use a graphical terminal for the boot loader?" ${YESNOSIZE}
  695. if [ $? -eq 0 ]; then
  696. set_option TEXTCONSOLE 0
  697. break
  698. elif [ $? -eq 1 ]; then
  699. set_option TEXTCONSOLE 1
  700. break
  701. else
  702. return
  703. fi
  704. done
  705. }
  706. set_bootloader() {
  707. local dev=$(get_option BOOTLOADER) grub_args=
  708. if [ "$dev" = "none" ]; then return; fi
  709. # Check if it's an EFI system via efivars module.
  710. if [ -n "$EFI_SYSTEM" ]; then
  711. grub_args="--target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=void_grub --recheck"
  712. fi
  713. echo "Running grub-install $grub_args $dev..." >$LOG
  714. chroot $TARGETDIR grub-install $grub_args $dev >$LOG 2>&1
  715. if [ $? -ne 0 ]; then
  716. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  717. failed to install GRUB to $dev!\nCheck $LOG for errors." ${MSGBOXSIZE}
  718. DIE 1
  719. fi
  720. echo "Running grub-mkconfig on $TARGETDIR..." >$LOG
  721. chroot $TARGETDIR grub-mkconfig -o /boot/grub/grub.cfg >$LOG 2>&1
  722. if [ $? -ne 0 ]; then
  723. DIALOG --msgbox "${BOLD}${RED}ERROR${RESET}: \
  724. failed to run grub-mkconfig!\nCheck $LOG for errors." ${MSGBOXSIZE}
  725. DIE 1
  726. fi
  727. }
  728. test_network() {
  729. rm -f xtraeme.asc && \
  730. xbps-uhelper fetch http://repo.voidlinux.eu/live/xtraeme.asc >$LOG 2>&1
  731. if [ $? -eq 0 ]; then
  732. DIALOG --msgbox "Network is working properly!" ${MSGBOXSIZE}
  733. NETWORK_DONE=1
  734. return 1
  735. fi
  736. DIALOG --msgbox "Network is unaccessible, please setup it properly." ${MSGBOXSIZE}
  737. }
  738. configure_wifi() {
  739. local dev="$1" ssid enc pass _wpasupconf=/etc/wpa_supplicant/wpa_supplicant.conf
  740. DIALOG --form "Wireless configuration for ${dev}\n(encryption type: wep or wpa)" 0 0 0 \
  741. "SSID:" 1 1 "" 1 16 30 0 \
  742. "Encryption:" 2 1 "" 2 16 4 3 \
  743. "Password:" 3 1 "" 3 16 50 0 || return 1
  744. set -- $(cat $ANSWER)
  745. ssid="$1"; enc="$2"; pass="$3";
  746. if [ -z "$ssid" ]; then
  747. DIALOG --msgbox "Invalid SSID." ${MSGBOXSIZE}
  748. return 1
  749. elif [ -z "$enc" -o "$enc" != "wep" -a "$enc" != "wpa" ]; then
  750. DIALOG --msgbox "Invalid encryption type (possible values: wep or wpa)." ${MSXBOXSIZE}
  751. return 1
  752. elif [ -z "$pass" ]; then
  753. DIALOG --msgbox "Invalid AP password." ${MSGBOXSIZE}
  754. fi
  755. rm -f ${_wpasupconf%.conf}-${dev}.conf
  756. cp -f ${_wpasupconf} ${_wpasupconf%.conf}-${dev}.conf
  757. if [ "$enc" = "wep" ]; then
  758. echo "network={" >> ${_wpasupconf%.conf}-${dev}.conf
  759. echo " ssid=\"$ssid\"" >> ${_wpasupconf%.conf}-${dev}.conf
  760. echo " wep_key0=\"$pass\"" >> ${_wpasupconf%.conf}-${dev}.conf
  761. echo " wep_tx_keyidx=0" >> ${_wpasupconf%.conf}-${dev}.conf
  762. echo " auth_alg=SHARED" >> ${_wpasupconf%.conf}-${dev}.conf
  763. echo "}" >> ${_wpasupconf%.conf}-${dev}.conf
  764. else
  765. wpa_passphrase "$ssid" "$pass" >> ${_wpasupconf%.conf}-${dev}.conf
  766. fi
  767. configure_net_dhcp $dev
  768. return $?
  769. }
  770. configure_net() {
  771. local dev="$1" rval
  772. DIALOG --yesno "Do you want to use DHCP for $dev?" ${YESNOSIZE}
  773. rval=$?
  774. if [ $rval -eq 0 ]; then
  775. configure_net_dhcp $dev
  776. elif [ $rval -eq 1 ]; then
  777. configure_net_static $dev
  778. fi
  779. }
  780. iface_setup() {
  781. ip addr show dev $1|grep -q 'inet '
  782. return $?
  783. }
  784. configure_net_dhcp() {
  785. local dev="$1"
  786. iface_setup $dev
  787. if [ $? -eq 1 ]; then
  788. dhcpcd -t 10 -w -4 -L $dev -e "wpa_supplicant_conf=/etc/wpa_supplicant/wpa_supplicant-${dev}.conf" 2>&1 | tee $LOG | \
  789. DIALOG --progressbox "Initializing $dev via DHCP..." ${WIDGET_SIZE}
  790. if [ $? -ne 0 ]; then
  791. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to run dhcpcd. See $LOG for details." ${MSGBOXSIZE}
  792. return 1
  793. fi
  794. iface_setup $dev
  795. if [ $? -eq 1 ]; then
  796. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} DHCP request failed for $dev. Check $LOG for errors." ${MSGBOXSIZE}
  797. return 1
  798. fi
  799. fi
  800. test_network
  801. if [ $? -eq 1 ]; then
  802. set_option NETWORK "${dev} dhcp"
  803. fi
  804. }
  805. configure_net_static() {
  806. local ip gw dns1 dns2 dev=$1
  807. DIALOG --form "Static IP configuration for $dev:" 0 0 0 \
  808. "IP address:" 1 1 "192.168.0.2" 1 21 20 0 \
  809. "Gateway:" 2 1 "192.168.0.1" 2 21 20 0 \
  810. "DNS Primary" 3 1 "8.8.8.8" 3 21 20 0 \
  811. "DNS Secondary" 4 1 "8.8.4.4" 4 21 20 0 || return 1
  812. set -- $(cat $ANSWER)
  813. ip=$1; gw=$2; dns1=$3; dns2=$4
  814. echo "running: ip link set dev $dev up" >$LOG
  815. ip link set dev $dev up >$LOG 2>&1
  816. if [ $? -ne 0 ]; then
  817. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to bring $dev interface." ${MSGBOXSIZE}
  818. return 1
  819. fi
  820. echo "running: ip addr add $ip dev $dev"
  821. ip addr add $ip dev $dev >$LOG 2>&1
  822. if [ $? -ne 0 ]; then
  823. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} Failed to set ip to the $dev interface." ${MSGBOXSIZE}
  824. return 1
  825. fi
  826. ip route add $gw dev $dev >$LOG 2>&1
  827. if [ $? -ne 0 ]; then
  828. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} failed to setup your gateway." ${MSGBOXSIZE}
  829. return 1
  830. fi
  831. echo "nameserver $dns1" >/etc/resolv.conf
  832. echo "nameserver $dns2" >>/etc/resolv.conf
  833. test_network
  834. if [ $? -eq 1 ]; then
  835. set_option NETWORK "${dev} static $ip $gw $dns1 $dns2"
  836. fi
  837. }
  838. menu_network() {
  839. local dev addr f DEVICES
  840. for f in $(ls /sys/class/net); do
  841. [ "$f" = "lo" ] && continue
  842. addr=$(cat /sys/class/net/$f/address)
  843. DEVICES="$DEVICES $f $addr"
  844. done
  845. DIALOG --title " Select the network interface to configure " \
  846. --menu "$MENULABEL" ${MENUSIZE} ${DEVICES}
  847. if [ $? -eq 0 ]; then
  848. dev=$(cat $ANSWER)
  849. if $(echo $dev|egrep -q "^wl.*" 2>/dev/null); then
  850. configure_wifi $dev
  851. else
  852. configure_net $dev
  853. fi
  854. fi
  855. }
  856. validate_filesystems() {
  857. local mnts dev size fstype mntpt mkfs rootfound fmt
  858. local usrfound efi_system_partition
  859. unset TARGETFS
  860. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  861. set -- ${mnts}
  862. while [ $# -ne 0 ]; do
  863. dev=$2; fstype=$3; size=$4; mntpt="$5"; mkfs=$6
  864. shift 6
  865. if [ "$mntpt" = "/" ]; then
  866. rootfound=1
  867. elif [ "$mntpt" = "/usr" ]; then
  868. usrfound=1
  869. elif [ "$fstype" = "vfat" -a "$mntpt" = "/boot/efi" ]; then
  870. efi_system_partition=1
  871. fi
  872. if [ "$mkfs" -eq 1 ]; then
  873. fmt="NEW FILESYSTEM: "
  874. fi
  875. if [ -z "$TARGETFS" ]; then
  876. TARGETFS="${fmt}$dev ($size) mounted on $mntpt as ${fstype}\n"
  877. else
  878. TARGETFS="${TARGETFS}${fmt}${dev} ($size) mounted on $mntpt as ${fstype}\n"
  879. fi
  880. done
  881. if [ -z "$rootfound" ]; then
  882. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  883. the mount point for the root filesystem (/) has not yet been configured." ${MSGBOXSIZE}
  884. return 1
  885. elif [ -n "$usrfound" ]; then
  886. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  887. /usr mount point has been configured but is not supported, please remove it to continue." ${MSGBOXSIZE}
  888. return 1
  889. elif [ -n "$EFI_SYSTEM" -a -z "$efi_system_partition" ]; then
  890. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  891. The EFI System Partition has not yet been configured, please create it\n
  892. as FAT32, mountpoint /boot/efi and at least with 100MB of size." ${MSGBOXSIZE}
  893. fi
  894. FILESYSTEMS_DONE=1
  895. }
  896. create_filesystems() {
  897. local mnts dev mntpt fstype fspassno mkfs size rv uuid
  898. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  899. set -- ${mnts}
  900. while [ $# -ne 0 ]; do
  901. dev=$2; fstype=$3; mntpt="$5"; mkfs=$6
  902. shift 6
  903. # swap partitions
  904. if [ "$fstype" = "swap" ]; then
  905. swapoff $dev >/dev/null 2>&1
  906. if [ "$mkfs" -eq 1 ]; then
  907. mkswap $dev >$LOG 2>&1
  908. if [ $? -ne 0 ]; then
  909. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  910. failed to create swap on ${dev}!\ncheck $LOG for errors." ${MSGBOXSIZE}
  911. DIE 1
  912. fi
  913. fi
  914. swapon $dev >$LOG 2>&1
  915. if [ $? -ne 0 ]; then
  916. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  917. failed to activate swap on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  918. DIE 1
  919. fi
  920. # Add entry for target fstab
  921. uuid=$(blkid -o value -s UUID "$dev")
  922. echo "UUID=$uuid none swap sw 0 0" >>$TARGET_FSTAB
  923. continue
  924. fi
  925. if [ "$mkfs" -eq 1 ]; then
  926. case "$fstype" in
  927. btrfs) MKFS="mkfs.btrfs -f"; modprobe btrfs >$LOG 2>&1;;
  928. ext2) MKFS="mke2fs -F"; modprobe ext2 >$LOG 2>&1;;
  929. ext3) MKFS="mke2fs -F -j"; modprobe ext3 >$LOG 2>&1;;
  930. ext4) MKFS="mke2fs -F -t ext4"; modprobe ext4 >$LOG 2>&1;;
  931. f2fs) MKFS="mkfs.f2fs"; modprobe f2fs >$LOG 2>&1;;
  932. vfat) MKFS="mkfs.vfat -F32"; modprobe vfat >$LOG 2>&1;;
  933. xfs) MKFS="mkfs.xfs -f"; modprobe xfs >$LOG 2>&1;;
  934. esac
  935. DIALOG --infobox "Creating filesystem $fstype on $dev for $mntpt ..." 8 60
  936. echo "Running $MKFS $dev..." >$LOG
  937. $MKFS $dev >$LOG 2>&1; rv=$?
  938. if [ $rv -ne 0 ]; then
  939. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  940. failed to create filesystem $fstype on $dev!\ncheck $LOG for errors." ${MSGBOXSIZE}
  941. DIE 1
  942. fi
  943. fi
  944. # Mount rootfs the first one.
  945. [ "$mntpt" != "/" ] && continue
  946. mkdir -p $TARGETDIR
  947. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  948. mount -t $fstype $dev $TARGETDIR >$LOG 2>&1
  949. if [ $? -ne 0 ]; then
  950. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  951. failed to mount $dev on ${mntpt}! check $LOG for errors." ${MSGBOXSIZE}
  952. DIE 1
  953. fi
  954. # Add entry to target fstab
  955. uuid=$(blkid -o value -s UUID "$dev")
  956. if [ "$fstype" = "f2fs" ]; then
  957. fspassno=0
  958. else
  959. fspassno=1
  960. fi
  961. echo "UUID=$uuid $mntpt $fstype defaults 0 $fspassno" >>$TARGET_FSTAB
  962. done
  963. # mount all filesystems in target rootfs
  964. mnts=$(grep -E '^MOUNTPOINT.*' $CONF_FILE)
  965. set -- ${mnts}
  966. while [ $# -ne 0 ]; do
  967. dev=$2; fstype=$3; mntpt="$5"
  968. shift 6
  969. [ "$mntpt" = "/" -o "$fstype" = "swap" ] && continue
  970. mkdir -p ${TARGETDIR}${mntpt}
  971. echo "Mounting $dev on $mntpt ($fstype)..." >$LOG
  972. mount -t $fstype $dev ${TARGETDIR}${mntpt} >$LOG 2>&1
  973. if [ $? -ne 0 ]; then
  974. DIALOG --msgbox "${BOLD}${RED}ERROR:${RESET} \
  975. failed to mount $dev on $mntpt! check $LOG for errors." ${MSGBOXSIZE}
  976. DIE
  977. fi
  978. # Add entry to target fstab
  979. uuid=$(blkid -o value -s UUID "$dev")
  980. echo "UUID=$uuid $mntpt $fstype defaults 0 2" >>$TARGET_FSTAB
  981. done
  982. }
  983. mount_filesystems() {
  984. for f in sys proc dev; do
  985. [ ! -d $TARGETDIR/$f ] && mkdir $TARGETDIR/$f
  986. echo "Mounting $TARGETDIR/$f..." >$LOG
  987. mount --bind /$f $TARGETDIR/$f >$LOG 2>&1
  988. done
  989. }
  990. umount_filesystems() {
  991. local f
  992. for f in sys/fs/fuse/connections sys proc dev; do
  993. echo "Unmounting $TARGETDIR/$f..." >$LOG
  994. umount $TARGETDIR/$f >$LOG 2>&1
  995. done
  996. local mnts="$(grep -E '^MOUNTPOINT.*$' $CONF_FILE)"
  997. set -- ${mnts}
  998. while [ $# -ne 0 ]; do
  999. local dev=$2; local fstype=$3; local mntpt=$5
  1000. shift 6
  1001. if [ "$fstype" = "swap" ]; then
  1002. echo "Disabling swap space on $dev..." >$LOG
  1003. swapoff $dev >$LOG 2>&1
  1004. continue
  1005. fi
  1006. if [ "$mntpt" != "/" ]; then
  1007. echo "Unmounting $TARGETDIR/$mntpt..." >$LOG
  1008. umount $TARGETDIR/$mntpt >$LOG 2>&1
  1009. fi
  1010. done
  1011. echo "Unmounting $TARGETDIR..." >$LOG
  1012. umount $TARGETDIR >$LOG 2>&1
  1013. }
  1014. copy_rootfs() {
  1015. DIALOG --title "Check $LOG for details" \
  1016. --infobox "Copying live image to target rootfs, please wait ..." 4 60
  1017. LANG=C cp -axvnu / $TARGETDIR >$LOG 2>&1
  1018. if [ $? -ne 0 ]; then
  1019. DIE 1
  1020. fi
  1021. }
  1022. install_packages() {
  1023. local _grub= _syspkg=
  1024. if [ -n "$EFI_SYSTEM" ]; then
  1025. _grub="grub-x86_64-efi"
  1026. else
  1027. _grub="grub"
  1028. fi
  1029. _syspkg="base-system"
  1030. mkdir -p $TARGETDIR/var/db/xbps/keys $TARGETDIR/usr/share
  1031. cp -a /usr/share/xbps.d $TARGETDIR/usr/share/
  1032. cp /var/db/xbps/keys/*.plist $TARGETDIR/var/db/xbps/keys
  1033. mkdir -p $TARGETDIR/boot/grub
  1034. _arch=$(xbps-uhelper arch)
  1035. stdbuf -oL env XBPS_ARCH=${_arch} \
  1036. xbps-install -r $TARGETDIR -SyU ${_syspkg} ${_grub} 2>&1 | \
  1037. DIALOG --title "Installing base system packages..." \
  1038. --programbox 24 80
  1039. if [ $? -ne 0 ]; then
  1040. DIE 1
  1041. fi
  1042. xbps-reconfigure -r $TARGETDIR -f base-files >/dev/null 2>&1
  1043. chroot $TARGETDIR xbps-reconfigure -a
  1044. }
  1045. enable_dhcpd() {
  1046. ln -sf /etc/sv/dhcpcd $TARGETDIR/etc/runit/runsvdir/default/dhcpcd
  1047. }
  1048. menu_install() {
  1049. # Don't continue if filesystems are not ready.
  1050. validate_filesystems || return 1
  1051. ROOTPASSWORD_DONE="$(get_option ROOTPASSWORD)"
  1052. BOOTLOADER_DONE="$(get_option BOOTLOADER)"
  1053. if [ -z "$FILESYSTEMS_DONE" ]; then
  1054. DIALOG --msgbox "${BOLD}Required filesystems were not configured, \
  1055. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1056. return 1
  1057. elif [ -z "$ROOTPASSWORD_DONE" ]; then
  1058. DIALOG --msgbox "${BOLD}The root password has not been configured, \
  1059. please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1060. return 1
  1061. elif [ -z "$BOOTLOADER_DONE" ]; then
  1062. DIALOG --msgbox "${BOLD}The disk to install the bootloader has not been \
  1063. configured, please do so before starting the installation.${RESET}" ${MSGBOXSIZE}
  1064. return 1
  1065. fi
  1066. DIALOG --yesno "${BOLD}The following operations will be executed:${RESET}\n\n
  1067. ${BOLD}${TARGETFS}${RESET}\n
  1068. ${BOLD}${RED}WARNING: data on partitions will be COMPLETELY DESTROYED for new \
  1069. filesystems.${RESET}\n\n
  1070. ${BOLD}Do you want to continue?${RESET}" 20 80 || return
  1071. unset TARGETFS
  1072. # Create and mount filesystems
  1073. create_filesystems
  1074. # If source not set use defaults.
  1075. if [ "$(get_option SOURCE)" = "local" -o -z "$SOURCE_DONE" ]; then
  1076. copy_rootfs
  1077. . /etc/default/live.conf
  1078. rm -f $TARGETDIR/etc/motd
  1079. rm -f $TARGETDIR/etc/issue
  1080. rm -f $TARGETDIR/usr/sbin/void-installer
  1081. # Remove live user.
  1082. echo "Removing $USERNAME live user from targetdir ..." >$LOG
  1083. chroot $TARGETDIR userdel -r $USERNAME >$LOG 2>&1
  1084. sed -i -e "/$USERNAME ALL=.*/d" $TARGETDIR/etc/sudoers
  1085. DIALOG --title "Check $LOG for details" \
  1086. --infobox "Rebuilding initramfs for target ..." 4 60
  1087. echo "Rebuilding initramfs for target ..." >$LOG
  1088. # mount required fs
  1089. mount_filesystems
  1090. chroot $TARGETDIR dracut --no-hostonly --add-drivers "ahci" --force >>$LOG 2>&1
  1091. DIALOG --title "Check $LOG for details" \
  1092. --infobox "Removing temporary packages from target ..." 4 60
  1093. echo "Removing temporary packages from target ..." >$LOG
  1094. xbps-remove -r $TARGETDIR -Ry dialog >>$LOG 2>&1
  1095. rmdir $TARGETDIR/mnt/target
  1096. else
  1097. # mount required fs
  1098. mount_filesystems
  1099. # network install, use packages.
  1100. install_packages
  1101. fi
  1102. DIALOG --infobox "Applying installer settings..." 4 60
  1103. # copy target fstab.
  1104. install -Dm644 $TARGET_FSTAB $TARGETDIR/etc/fstab
  1105. # Mount /tmp as tmpfs.
  1106. echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0" >> $TARGETDIR/etc/fstab
  1107. # set up keymap, locale, timezone, hostname, root passwd and user account.
  1108. set_keymap
  1109. set_locale
  1110. set_timezone
  1111. set_hostname
  1112. set_rootpassword
  1113. set_useraccount
  1114. # Copy /etc/skel files for root.
  1115. cp $TARGETDIR/etc/skel/.[bix]* $TARGETDIR/root
  1116. # network settings for target
  1117. if [ -n "$NETWORK_DONE" ]; then
  1118. local net="$(get_option NETWORK)"
  1119. set -- ${net}
  1120. local _dev="$1" _type="$2" _ip="$3" _gw="$4" _dns1="$5" _dns2="$6"
  1121. if [ -z "$_type" ]; then
  1122. # network type empty??!!!
  1123. :
  1124. elif [ "$_type" = "dhcp" ]; then
  1125. if [ -f /etc/wpa_supplicant/wpa_supplicant-${_dev}.conf ]; then
  1126. cp /etc/wpa_supplicant/wpa_supplicant-${_dev}.conf $TARGETDIR/etc/wpa_supplicant
  1127. ln -sf /etc/sv/dhcpcd-${_dev} $TARGETDIR/etc/runit/runsvdir/default/dhcpcd-${_dev}
  1128. else
  1129. enable_dhcpd
  1130. fi
  1131. elif [ -n "$_dev" -a "$_type" = "static" ]; then
  1132. # static IP through dhcpcd.
  1133. mv $TARGETDIR/etc/dhcpcd.conf $TARGETDIR/etc/dhdpcd.conf.orig
  1134. echo "# Static IP configuration set by the void-installer for $_dev." \
  1135. >$TARGETDIR/etc/dhcpcd.conf
  1136. echo "interface $_dev" >>$TARGETDIR/etc/dhcpcd.conf
  1137. echo "static ip_address=$_ip" >>$TARGETDIR/etc/dhcpcd.conf
  1138. echo "static routers=$_gw" >>$TARGETDIR/etc/dhcpcd.conf
  1139. echo "static domain_name_servers=$_dns1 $_dns2" >>$TARGETDIR/etc/dhcpcd.conf
  1140. enable_dhcpd
  1141. fi
  1142. fi
  1143. if [ -f $TARGETDIR/etc/sudoers ]; then
  1144. if [ -z "$(echo $(get_option USERGROUPS) | grep -w wheel)" ]; then
  1145. # enable sudo for primary user USERLOGIN
  1146. echo "# Enable sudo for login '$(get_option USERLOGIN)'" >> $TARGETDIR/etc/sudoers
  1147. echo "$(get_option USERLOGIN) ALL=(ALL) ALL" >> $TARGETDIR/etc/sudoers
  1148. else
  1149. # enable sudoers entry for members of group wheel for primary user
  1150. sed -i $TARGETDIR/etc/sudoers \
  1151. -e "s;#.*%wheel ALL=(ALL) ALL;%wheel ALL=(ALL) ALL;"
  1152. fi
  1153. fi
  1154. # enable text console for grub if chosen
  1155. if [ "$(get_option TEXTCONSOLE)" = "1" ]; then
  1156. sed -i $TARGETDIR/etc/default/grub \
  1157. -e 's|#\(GRUB_TERMINAL_INPUT\).*|\1=console|' \
  1158. -e 's|#\(GRUB_TERMINAL_OUTPUT\).*|\1=console|'
  1159. fi
  1160. # install bootloader.
  1161. set_bootloader
  1162. sync && sync && sync
  1163. # unmount all filesystems.
  1164. umount_filesystems
  1165. # installed successfully.
  1166. DIALOG --yesno "${BOLD}Void Linux has been installed successfully!${RESET}\n
  1167. Do you want to reboot the system?" ${YESNOSIZE}
  1168. if [ $? -eq 0 ]; then
  1169. shutdown -r now
  1170. else
  1171. return
  1172. fi
  1173. }
  1174. menu_source() {
  1175. local src=
  1176. DIALOG --title " Select installation source " \
  1177. --menu "$MENULABEL" 8 70 0 \
  1178. "Local" "Packages from ISO image" \
  1179. "Network" "Packages from official remote reposity"
  1180. case "$(cat $ANSWER)" in
  1181. "Local") src="local";;
  1182. "Network") src="net";
  1183. if [ -z "$NETWORK_DONE" ]; then
  1184. menu_network;
  1185. fi;;
  1186. *) return 1;;
  1187. esac
  1188. SOURCE_DONE=1
  1189. set_option SOURCE $src
  1190. }
  1191. menu() {
  1192. if [ -z "$DEFITEM" ]; then
  1193. DEFITEM="Keyboard"
  1194. fi
  1195. DIALOG --default-item $DEFITEM \
  1196. --extra-button --extra-label "Settings" \
  1197. --title " Void Linux installation menu " \
  1198. --menu "$MENULABEL" 10 70 0 \
  1199. "Keyboard" "Set system keyboard" \
  1200. "Network" "Set up the network" \
  1201. "Source" "Set source installation" \
  1202. "Hostname" "Set system hostname" \
  1203. "Locale" "Set system locale" \
  1204. "Timezone" "Set system time zone" \
  1205. "RootPassword" "Set system root password" \
  1206. "UserAccount" "Set primary user name and password" \
  1207. "BootLoader" "Set disk to install bootloader" \
  1208. "Partition" "Partition disk(s)" \
  1209. "Filesystems" "Configure filesystems and mount points" \
  1210. "Install" "Start installation with saved settings" \
  1211. "Exit" "Exit installation"
  1212. if [ $? -eq 3 ]; then
  1213. # Show settings
  1214. cp $CONF_FILE /tmp/conf_hidden.$$;
  1215. sed -i "s/^ROOTPASSWORD.*/ROOTPASSWORD <-hidden->/" /tmp/conf_hidden.$$
  1216. DIALOG --title "Saved settings for installation" --textbox /tmp/conf_hidden.$$ 14 60
  1217. rm /tmp/conf_hidden.$$
  1218. return
  1219. fi
  1220. case $(cat $ANSWER) in
  1221. "Keyboard") menu_keymap && [ -n "$KEYBOARD_DONE" ] && DEFITEM="Network";;
  1222. "Network") menu_network && [ -n "$NETWORK_DONE" ] && DEFITEM="Source";;
  1223. "Source") menu_source && [ -n "$SOURCE_DONE" ] && DEFITEM="Hostname";;
  1224. "Hostname") menu_hostname && [ -n "$HOSTNAME_DONE" ] && DEFITEM="Locale";;
  1225. "Locale") menu_locale && [ -n "$LOCALE_DONE" ] && DEFITEM="Timezone";;
  1226. "Timezone") menu_timezone && [ -n "$TIMEZONE_DONE" ] && DEFITEM="RootPassword";;
  1227. "RootPassword") menu_rootpassword && [ -n "$ROOTPASSWORD_DONE" ] && DEFITEM="UserAccount";;
  1228. "UserAccount") menu_useraccount && [ -n "$USERNAME_DONE" ] && [ -n "$USERPASSWORD_DONE" ] \
  1229. && DEFITEM="BootLoader";;
  1230. "BootLoader") menu_bootloader && [ -n "$BOOTLOADER_DONE" ] && DEFITEM="Partition";;
  1231. "Partition") menu_partitions && [ -n "$PARTITIONS_DONE" ] && DEFITEM="Filesystems";;
  1232. "Filesystems") menu_filesystems && [ -n "$FILESYSTEMS_DONE" ] && DEFITEM="Install";;
  1233. "Install") menu_install;;
  1234. "Exit") DIE;;
  1235. *) DIALOG --yesno "Abort Installation?" ${YESNOSIZE} && DIE
  1236. esac
  1237. }
  1238. if [ ! -x /bin/dialog ]; then
  1239. echo "ERROR: missing dialog command, exiting..."
  1240. exit 1
  1241. fi
  1242. #
  1243. # main()
  1244. #
  1245. DIALOG --title "${BOLD}${RED} Enter the void ... ${RESET}" --msgbox "\n
  1246. Welcome to the Void Linux installation. A simple and minimal \
  1247. Linux distribution made from scratch and built from the source package tree \
  1248. available for XBPS, a new alternative binary package system.\n\n
  1249. The installation should be pretty straightforward. If you are in trouble \
  1250. please join us at ${BOLD}#voidlinux${RESET} on ${BOLD}irc.freenode.org${RESET}.\n\n
  1251. ${BOLD}http://www.voidlinux.eu${RESET}\n\n" 16 80
  1252. while true; do
  1253. menu
  1254. done
  1255. exit 0
  1256. # vim: set ts=4 sw=4 et: