From 6902ce27b488574f020c7d5d4d8480a9a4ae4ecc Mon Sep 17 00:00:00 2001 From: Johannes Kamprad Date: Sun, 9 Nov 2025 17:18:39 +0100 Subject: [PATCH] Merge upstream archiso changes, bootmode makeover (upstream) adding firefox.desktop file for livesession to let it start without showing affiliate links from firefox, exchanging maliit-keyboard with plasma-keyboard --- CHANGELOG.md | 3 +- airootfs/etc/hostname | 2 - airootfs/etc/locale.conf | 3 - airootfs/etc/mkinitcpio.conf.d/archiso.conf | 3 + airootfs/etc/mkinitcpio.d/linux.preset | 5 +- .../journald.conf.d/volatile-storage.conf | 3 - .../systemd/logind.conf.d/do-not-suspend.conf | 3 - .../getty@tty1.service.d/autologin.conf | 3 - airootfs/root/.automated_script.sh | 26 +- airootfs/root/.zlogin | 2 +- .../.local/share/applications/firefox.desktop | 902 +++++++++++++++++ mkarchiso | 916 +++++++----------- mkarchiso-changes.md | 7 + packages.x86_64 | 1 + profiledef.sh | 3 +- 15 files changed, 1272 insertions(+), 610 deletions(-) create mode 100644 airootfs/etc/mkinitcpio.conf.d/archiso.conf create mode 100644 airootfs/root/endeavouros-skel-liveuser/src/etc/skel/.local/share/applications/firefox.desktop diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ba42a..d988412 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,9 @@ --- -# Post Mercury changes (2025) +# Ganymede Release Changes (2025) * adding nvidia.service and script to install Nvidia Modules packages open or closed source related to Model ranges. +* Broadcom-WL handling is now using a service too, and it will popup request to change driver on the livesession asking user to proceed. * updating mkarchiso to latest and merging changes to bootloader entry format from upstream. * changing boot entries to as of no need to blacklist Nvidia (as not installed on boot) * updating preview pictures in liveuser skel settings to show properly on live session. diff --git a/airootfs/etc/hostname b/airootfs/etc/hostname index f4f78c1..ca96c56 100755 --- a/airootfs/etc/hostname +++ b/airootfs/etc/hostname @@ -1,3 +1 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later EndeavourOS diff --git a/airootfs/etc/locale.conf b/airootfs/etc/locale.conf index 9bf7aef..01ec548 100755 --- a/airootfs/etc/locale.conf +++ b/airootfs/etc/locale.conf @@ -1,4 +1 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later - LANG=en_US.UTF-8 diff --git a/airootfs/etc/mkinitcpio.conf.d/archiso.conf b/airootfs/etc/mkinitcpio.conf.d/archiso.conf new file mode 100644 index 0000000..8719c45 --- /dev/null +++ b/airootfs/etc/mkinitcpio.conf.d/archiso.conf @@ -0,0 +1,3 @@ +MODULES=(vmd) +HOOKS=(base udev modconf kms memdisk archiso archiso_loop_mnt archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs block filesystems keyboard) +COMPRESSION="zstd" diff --git a/airootfs/etc/mkinitcpio.d/linux.preset b/airootfs/etc/mkinitcpio.d/linux.preset index d35f137..8e85205 100755 --- a/airootfs/etc/mkinitcpio.d/linux.preset +++ b/airootfs/etc/mkinitcpio.d/linux.preset @@ -1,11 +1,8 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later - # mkinitcpio preset file for the 'linux' package on archiso PRESETS=('archiso') ALL_kver='/boot/vmlinuz-linux' -ALL_config='/etc/mkinitcpio.conf' +archiso_config='/etc/mkinitcpio.conf.d/archiso.conf' archiso_image="/boot/initramfs-linux.img" diff --git a/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf b/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf index 3104779..b69850d 100755 --- a/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf +++ b/airootfs/etc/systemd/journald.conf.d/volatile-storage.conf @@ -1,5 +1,2 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later - [Journal] Storage=volatile diff --git a/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf b/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf index c6b17a4..f3ecb39 100755 --- a/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf +++ b/airootfs/etc/systemd/logind.conf.d/do-not-suspend.conf @@ -1,6 +1,3 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later - [Login] HandleSuspendKey=ignore HandleHibernateKey=ignore diff --git a/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf b/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf index 3905a1d..6fba7e5 100755 --- a/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf +++ b/airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf @@ -1,6 +1,3 @@ -# -# SPDX-License-Identifier: GPL-3.0-or-later - [Service] ExecStart= ExecStart=-/sbin/agetty --autologin liveuser --noclear %I 38400 linux diff --git a/airootfs/root/.automated_script.sh b/airootfs/root/.automated_script.sh index ed3a924..f7f3ced 100755 --- a/airootfs/root/.automated_script.sh +++ b/airootfs/root/.automated_script.sh @@ -1,22 +1,29 @@ #!/usr/bin/env bash -script_cmdline () -{ +script_cmdline() { local param - for param in $(< /proc/cmdline); do + for param in $(/dev/null + if [[ "${script}" =~ ^((http|https|ftp|tftp)://) ]]; then + # there's no synchronization for network availability before executing this script + printf '%s: waiting for network-online.target\n' "$0" + until systemctl --quiet is-active network-online.target; do + sleep 1 + done + printf '%s: downloading %s\n' "$0" "${script}" + curl "${script}" --location --retry-connrefused --retry 10 --fail -s -o /tmp/startup_script rt=$? else cp "${script}" /tmp/startup_script @@ -24,6 +31,9 @@ automated_script () fi if [[ ${rt} -eq 0 ]]; then chmod +x /tmp/startup_script + printf '%s: executing automated script\n' "$0" + # note that script is executed when other services (like pacman-init) may be still in progress, please + # synchronize to "systemctl is-system-running --wait" when your script depends on other services /tmp/startup_script fi fi diff --git a/airootfs/root/.zlogin b/airootfs/root/.zlogin index 0fb119d..bf6bc8f 100755 --- a/airootfs/root/.zlogin +++ b/airootfs/root/.zlogin @@ -1,5 +1,5 @@ # fix for screen readers -if grep -Fq 'accessibility=' /proc/cmdline &> /dev/null; then +if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then setopt SINGLE_LINE_ZLE fi diff --git a/airootfs/root/endeavouros-skel-liveuser/src/etc/skel/.local/share/applications/firefox.desktop b/airootfs/root/endeavouros-skel-liveuser/src/etc/skel/.local/share/applications/firefox.desktop new file mode 100644 index 0000000..ecf71f9 --- /dev/null +++ b/airootfs/root/endeavouros-skel-liveuser/src/etc/skel/.local/share/applications/firefox.desktop @@ -0,0 +1,902 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Exec=/usr/lib/firefox/firefox --new-window https://endeavouros.com/ +Terminal=false +X-MultipleArgs=false +Icon=firefox +StartupWMClass=firefox +DBusActivatable=false +Categories=GNOME;GTK;Network;WebBrowser; +MimeType=application/json;application/pdf;application/rdf+xml;application/rss+xml;application/x-xpinstall;application/xhtml+xml;application/xml;audio/flac;audio/ogg;audio/webm;image/avif;image/gif;image/jpeg;image/png;image/svg+xml;image/webp;text/html;text/xml;video/ogg;video/webm;x-scheme-handler/chrome;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/mailto; +StartupNotify=true +Actions=new-window;new-private-window;open-profile-manager; +Name=Firefox +Name[ach]=Firefox +Name[af]=Firefox +Name[an]=Firefox +Name[ar]=Firefox +Name[ast]=Firefox +Name[az]=Firefox +Name[be]=Firefox +Name[bg]=Firefox +Name[bn]=Firefox +Name[br]=Firefox +Name[brx]=Firefox +Name[bs]=Firefox +Name[ca]=Firefox +Name[ca_valencia]=Firefox +Name[cak]=Firefox +Name[ckb]=Firefox +Name[cs]=Firefox +Name[cy]=Firefox +Name[da]=Firefox +Name[de]=Firefox +Name[dsb]=Firefox +Name[el]=Firefox +Name[en_CA]=Firefox +Name[en_GB]=Firefox +Name[eo]=Firefox +Name[es_AR]=Firefox +Name[es_CL]=Firefox +Name[es_ES]=Firefox +Name[es_MX]=Firefox +Name[et]=Firefox +Name[eu]=Firefox +Name[fa]=Firefox +Name[ff]=Firefox +Name[fi]=Firefox +Name[fr]=Firefox +Name[fur]=Firefox +Name[fy_NL]=Firefox +Name[ga_IE]=Firefox +Name[gd]=Firefox +Name[gl]=Firefox +Name[gn]=Firefox +Name[gu_IN]=Firefox +Name[he]=Firefox +Name[hi_IN]=Firefox +Name[hr]=Firefox +Name[hsb]=Firefox +Name[hu]=Firefox +Name[hy_AM]=Firefox +Name[hye]=Firefox +Name[ia]=Firefox +Name[id]=Firefox +Name[is]=Firefox +Name[it]=Firefox +Name[ja]=Firefox +Name[ka]=Firefox +Name[kab]=Firefox +Name[kk]=Firefox +Name[km]=Firefox +Name[kn]=Firefox +Name[ko]=Firefox +Name[lij]=Firefox +Name[lo]=Firefox +Name[lt]=Firefox +Name[ltg]=Firefox +Name[lv]=Firefox +Name[meh]=Firefox +Name[mk]=Firefox +Name[mr]=Firefox +Name[ms]=Firefox +Name[my]=Firefox +Name[nb_NO]=Firefox +Name[ne_NP]=Firefox +Name[nl]=Firefox +Name[nn_NO]=Firefox +Name[oc]=Firefox +Name[pa_IN]=Firefox +Name[pl]=Firefox +Name[pt_BR]=Firefox +Name[pt_PT]=Firefox +Name[rm]=Firefox +Name[ro]=Firefox +Name[ru]=Firefox +Name[sat]=Firefox +Name[sc]=Firefox +Name[sco]=Firefox +Name[si]=Firefox +Name[sk]=Firefox +Name[skr]=Firefox +Name[sl]=Firefox +Name[son]=Firefox +Name[sq]=Firefox +Name[sr]=Firefox +Name[sv_SE]=Firefox +Name[szl]=Firefox +Name[ta]=Firefox +Name[te]=Firefox +Name[tg]=Firefox +Name[th]=Firefox +Name[tl]=Firefox +Name[tr]=Firefox +Name[trs]=Firefox +Name[uk]=Firefox +Name[ur]=Firefox +Name[uz]=Firefox +Name[vi]=Firefox +Name[wo]=Firefox +Name[xh]=Firefox +Name[zh_CN]=Firefox +Name[zh_TW]=Firefox +Comment=Browse the World Wide Web +Comment[ach]=Browse the World Wide Web +Comment[af]=Browse the World Wide Web +Comment[an]=Browse the World Wide Web +Comment[ar]=تصفح شبكة الوِب العالمية +Comment[ast]=Browse the World Wide Web +Comment[az]=Browse the World Wide Web +Comment[be]=Аглядайце Сеціва +Comment[bg]=Разгледайте световната мрежа +Comment[bn]=Browse the World Wide Web +Comment[br]=Ergerzhout ar World Wide Web +Comment[brx]=Browse the World Wide Web +Comment[bs]=Pretražujte World Wide Web +Comment[ca]=Navegeu pel Web +Comment[ca_valencia]=Browse the World Wide Web +Comment[cak]=Tok chupam Word Wide Web +Comment[ckb]=Browse the World Wide Web +Comment[cs]=Prohlížení stránek World Wide Webu +Comment[cy]=Pori'r We Fyd Eang +Comment[da]=Brug internettet +Comment[de]=Im Internet surfen +Comment[dsb]=Pśeglědajśo World Wide Web +Comment[el]=Περιηγηθείτε στον παγκόσμιο ιστό +Comment[en_CA]=Browse the World Wide Web +Comment[en_GB]=Browse the World Wide Web +Comment[eo]=Retumi en la reto +Comment[es_AR]=Navegar la World Wide Web +Comment[es_CL]=Navegar por la World Wide Web +Comment[es_ES]=Navegar por la web +Comment[es_MX]=Navegar por la web +Comment[et]=Browse the World Wide Web +Comment[eu]=Arakatu World Wide Web-a +Comment[fa]=Browse the World Wide Web +Comment[ff]=Browse the World Wide Web +Comment[fi]=Selaa Internetiä +Comment[fr]=Naviguer sur le Web +Comment[fur]=Navighe sul Web +Comment[fy_NL]=Navigearje op it wrâldwide web +Comment[ga_IE]=Browse the World Wide Web +Comment[gd]=Rùraich lìon na cruinne +Comment[gl]=Navegar pola World Wide Web +Comment[gn]=Eikundaha World Wide Web rupi +Comment[gu_IN]=Browse the World Wide Web +Comment[he]=גלישה באינטרנט +Comment[hi_IN]=Browse the World Wide Web +Comment[hr]=Pregledaj World Wide Web +Comment[hsb]=Přehladajće World Wide Web +Comment[hu]=Böngésszen a világhálón +Comment[hy_AM]=Զննի՛ր համաշխարհային սարդոստայնը +Comment[hye]=Browse the World Wide Web +Comment[ia]=Navigar sur le Web +Comment[id]=Jelajahi World Wide Web +Comment[is]=Vafraðu um veraldarvefinn +Comment[it]=Naviga sul Web +Comment[ja]=World Wide Web をブラウジング +Comment[ka]=მსოფლიო ქსელთან წვდომა +Comment[kab]=Inig deg Web +Comment[kk]=Ғаламторды шолу +Comment[km]=Browse the World Wide Web +Comment[kn]=Browse the World Wide Web +Comment[ko]=월드 와이드 웹 탐색 +Comment[lij]=Browse the World Wide Web +Comment[lo]=ທ່ອງເວັບທົ່ວໂລກ +Comment[lt]=Browse the World Wide Web +Comment[ltg]=Browse the World Wide Web +Comment[lv]=Pārlūkojiet globālo tīmekli +Comment[meh]=Browse the World Wide Web +Comment[mk]=Browse the World Wide Web +Comment[mr]=Browse the World Wide Web +Comment[ms]=Browse the World Wide Web +Comment[my]=Browse the World Wide Web +Comment[nb_NO]=Surf på nettet +Comment[ne_NP]=Browse the World Wide Web +Comment[nl]=Navigeren op het wereldwijde web +Comment[nn_NO]=Surf på nettet +Comment[oc]=Navegar pel Web +Comment[pa_IN]=ਵਰਲਡ ਵਾਈਡ ਵੈੱਬ ਬਰਾਊਜ਼ਰ ਕਰੋ +Comment[pl]=Przeglądaj Internet +Comment[pt_BR]=Navegue na World Wide Web +Comment[pt_PT]=Navegar na Internet +Comment[rm]=Navigar en il web +Comment[ro]=Browse the World Wide Web +Comment[ru]=Доступ в Интернет +Comment[sat]=World Wide Web ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ +Comment[sc]=Nàviga su Web +Comment[sco]=Browse the World Wide Web +Comment[si]=ලෝක ව්‍යාප්ත වියමන පිරික්සන්න +Comment[sk]=Prehľadávať web (www) +Comment[skr]=ورلڈ وائیڈ ویب براؤز کرو +Comment[sl]=Brskanje po svetovnem spletu +Comment[son]=Browse the World Wide Web +Comment[sq]=Shfletoni në World Wide Web +Comment[sr]=Истражите интернет +Comment[sv_SE]=Surfa på webben +Comment[szl]=Browse the World Wide Web +Comment[ta]=Browse the World Wide Web +Comment[te]=Browse the World Wide Web +Comment[tg]=Ба шабакаи ҷаҳонии Интернет дастрасӣ пайдо намоед +Comment[th]=เรียกดูเวิลด์ไวด์เว็บ +Comment[tl]=Browse the World Wide Web +Comment[tr]=Web’de gezin +Comment[trs]=Gāchē nu ngà World Wide Web +Comment[uk]=Переглядайте всесвітню мережу +Comment[ur]=Browse the World Wide Web +Comment[uz]=Browse the World Wide Web +Comment[vi]=Duyệt web trên toàn thế giới +Comment[wo]=Browse the World Wide Web +Comment[xh]=Browse the World Wide Web +Comment[zh_CN]=浏览万维网 +Comment[zh_TW]=瀏覽全球資訊網 +GenericName=Web Browser +GenericName[ach]=Web Browser +GenericName[af]=Web Browser +GenericName[an]=Web Browser +GenericName[ar]=متصفح الإنترنت +GenericName[ast]=Web Browser +GenericName[az]=Web Browser +GenericName[be]=Вэб-браўзер +GenericName[bg]=Уеб браузър +GenericName[bn]=Web Browser +GenericName[br]=Merdeer Web +GenericName[brx]=Web Browser +GenericName[bs]=Web pretraživač +GenericName[ca]=Navegador web +GenericName[ca_valencia]=Web Browser +GenericName[cak]=Web Okik'amaya'l +GenericName[ckb]=Web Browser +GenericName[cs]=Webový prohlížeč +GenericName[cy]=Porwr Gwe +GenericName[da]=Webbrowser +GenericName[de]=Internet-Browser +GenericName[dsb]=Webwobglědowak +GenericName[el]=Πρόγραμμα περιήγησης +GenericName[en_CA]=Web Browser +GenericName[en_GB]=Web Browser +GenericName[eo]=Retumilo +GenericName[es_AR]=Navegador web +GenericName[es_CL]=Navegador Web +GenericName[es_ES]=Navegador web +GenericName[es_MX]=Navegador Web +GenericName[et]=Web Browser +GenericName[eu]=Web nabigatzailea +GenericName[fa]=Web Browser +GenericName[ff]=Web Browser +GenericName[fi]=Verkkoselain +GenericName[fr]=Navigateur web +GenericName[fur]=Navigadôr Web +GenericName[fy_NL]=Webbrowser +GenericName[ga_IE]=Web Browser +GenericName[gd]=Brabhsair-lìn +GenericName[gl]=Navegador web +GenericName[gn]=Ñanduti Kundahára +GenericName[gu_IN]=Web Browser +GenericName[he]=דפדפן אינטרנט +GenericName[hi_IN]=Web Browser +GenericName[hr]=Web preglednik +GenericName[hsb]=Webwobhladowak +GenericName[hu]=Webböngésző +GenericName[hy_AM]=Վեբ դիտարկիչ +GenericName[hye]=Web Browser +GenericName[ia]=Navigator web +GenericName[id]=Peramban Web +GenericName[is]=Vafri +GenericName[it]=Browser web +GenericName[ja]=ウェブブラウザー +GenericName[ka]=ბრაუზერი +GenericName[kab]=Iminig web +GenericName[kk]=Веб-браузері +GenericName[km]=Web Browser +GenericName[kn]=Web Browser +GenericName[ko]=웹 브라우저 +GenericName[lij]=Navegatô Web +GenericName[lo]=ຕົວ​ທ່ອງ​ເວັບ​ເວັບ​ໄຊ​ຕ​໌ +GenericName[lt]=Web Browser +GenericName[ltg]=Web Browser +GenericName[lv]=Tīmekļa pārlūks +GenericName[meh]=Web Browser +GenericName[mk]=Web Browser +GenericName[mr]=Web Browser +GenericName[ms]=Web Browser +GenericName[my]=Web Browser +GenericName[nb_NO]=Nettleser +GenericName[ne_NP]=Web Browser +GenericName[nl]=Webbrowser +GenericName[nn_NO]=Nettlesar +GenericName[oc]=Navegador Web +GenericName[pa_IN]=ਵੈੱਬ ਬਰਾਊਜ਼ਰ +GenericName[pl]=Przeglądarka internetowa +GenericName[pt_BR]=Navegador web +GenericName[pt_PT]=Navegador Web +GenericName[rm]=Navigatur web +GenericName[ro]=Web Browser +GenericName[ru]=Веб-браузер +GenericName[sat]=ᱣᱮᱵᱽ ᱵᱽᱨᱟᱣᱡᱚᱨ +GenericName[sc]=Navigadore web +GenericName[sco]=Web Browser +GenericName[si]=වියමන අතිරික්සුව +GenericName[sk]=Webový prehliadač +GenericName[skr]=ویب براؤزر +GenericName[sl]=Spletni brskalnik +GenericName[son]=Web Browser +GenericName[sq]=Shfletues +GenericName[sr]=Веб прегледач +GenericName[sv_SE]=Webbläsare +GenericName[szl]=Web Browser +GenericName[ta]=Web Browser +GenericName[te]=Web Browser +GenericName[tg]=Браузери веб +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tl]=Web Browser +GenericName[tr]=Web Tarayıcısı +GenericName[trs]=Web riña gāchē nu’ +GenericName[uk]=Браузер +GenericName[ur]=Web Browser +GenericName[uz]=Web Browser +GenericName[vi]=Trình duyệt web +GenericName[wo]=Web Browser +GenericName[xh]=Web Browser +GenericName[zh_CN]=Web 浏览器 +GenericName[zh_TW]=網頁瀏覽器 +Keywords=Internet;WWW;Browser;Web;Explorer; +Keywords[ach]=Internet;WWW;Browser;Web;Explorer; +Keywords[af]=Internet;WWW;Browser;Web;Explorer; +Keywords[an]=Internet;WWW;Browser;Web;Explorer; +Keywords[ar]=Internet;WWW;Browser;Web;Explorer; +Keywords[ast]=Internet;WWW;Browser;Web;Explorer; +Keywords[az]=Internet;WWW;Browser;Web;Explorer; +Keywords[be]=Internet;WWW;Browser;Web;Explorer; +Keywords[bg]=Internet;WWW;Browser;Web;Explorer; +Keywords[bn]=Internet;WWW;Browser;Web;Explorer; +Keywords[br]=Internet;WWW;Merdeer;Web;Ergerzhout; +Keywords[brx]=Internet;WWW;Browser;Web;Explorer; +Keywords[bs]=Internet;WWW;Pretraživač;Web;Istraživač; +Keywords[ca]=Internet;WWW;Browser;Web;Explorador;Navegador; +Keywords[ca_valencia]=Internet;WWW;Browser;Web;Explorer; +Keywords[cak]=K'amaya'l;WWW;Okik'amaya'l;Kanob'äl; +Keywords[ckb]=Internet;WWW;Browser;Web;Explorer; +Keywords[cs]=internet;WWW;prohlížeč;web; +Keywords[cy]=Rhyngrwyd;WWW;Porwr;Gwe;Archwiliwr; +Keywords[da]=Internet;WWW;Browser;Nettet;Explorer; +Keywords[de]=Internet;WWW;Browser;Web;Explorer; +Keywords[dsb]=Internet;WWW;wobglědowak;Web;Explorer; +Keywords[el]=Internet;WWW;Browser;Web;Explorer;Διαδίκτυο;Ιστός;Ίντερνετ; +Keywords[en_CA]=Internet;WWW;Browser;Web;Explorer; +Keywords[en_GB]=Internet;WWW;Browser;Web;Explorer; +Keywords[eo]=Interreto;Retumilo;TTT;Teksaĵo;Reto;Internet;WWW;Browser;Web;Explorer; +Keywords[es_AR]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_CL]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_ES]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_MX]=Internet;WWW;Navegador;Web;Explorador; +Keywords[et]=Internet;WWW;Browser;Web;Explorer; +Keywords[eu]=Internet;WWW;Nabigatzailea;Web;Arakatzailea; +Keywords[fa]=Internet;WWW;Browser;Web;Explorer; +Keywords[ff]=Internet;WWW;Browser;Web;Explorer; +Keywords[fi]=Internet;WWW;Browser;Web;Explorer;netti;webbi;selain; +Keywords[fr]=Internet;WWW;Navigateur;Web;Explorer; +Keywords[fur]=Internet;WWW;Browser;Navigadôr;Web;Esploradôr;Explorer; +Keywords[fy_NL]=Ynternet;WWW;Browser;Web;Ferkenner; +Keywords[ga_IE]=Internet;WWW;Browser;Web;Explorer; +Keywords[gd]=Internet;WWW;Browser;Web;Explorer;eadar-lìon;brabhsair;brobhsair;lìon;taisgealaiche; +Keywords[gl]=Internet;WWW;Navegador;Web;Explorador; +Keywords[gn]=Internet;WWW;Browser;Web;Explorer; +Keywords[gu_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[he]=אינטרנט;WWW;דפדפן;רשת;סייר;מרשתת; +Keywords[hi_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[hr]=Internet;WWW;Preglednik;Web;Istraživač; +Keywords[hsb]=Internet;WWW;wobhladowak;Web;Explorer; +Keywords[hu]=Internet;WWW;Böngésző;Web;Világháló; +Keywords[hy_AM]=Համացանց,WWW,Զննիչ,Վեբ,Ցանցախույզ: +Keywords[hye]=Internet;WWW;Browser;Web;Explorer; +Keywords[ia]=Internet;WWW;Navigator;Web;Explorator; +Keywords[id]=Internet;WWW;Browser;Web;Explorer; +Keywords[is]=Internet;WWW; Vafri; Vefur; Explorer; +Keywords[it]=Internet;WWW;Browser;Web;Explorer;Navigatore; +Keywords[ja]=Internet;WWW;Browser;Web;Explorer;インターネット;ブラウザー;ウェブ; +Keywords[ka]=ინტერნეტი;WWW;ბრაუზერი;ქსელი;ქსელთან წვდომა; +Keywords[kab]=Internet;WWW;Browser;Web;Explorer; +Keywords[kk]=Internet;WWW;Browser;Web;Explorer;Интернет;Ғаламтор;Браузер;Желі;Шолғыш; +Keywords[km]=Internet;WWW;Browser;Web;Explorer; +Keywords[kn]=Internet;WWW;Browser;Web;Explorer; +Keywords[ko]=인터넷;브라우저;웹;탐색기;Internet;WWW;Browser;Web;Explorer; +Keywords[lij]=Internet;WWW;Browser;Web;Explorer;Navegatô; +Keywords[lo]=Internet;WWW;Browser;Web;Explorer; +Keywords[lt]=Internet;WWW;Browser;Web;Explorer; +Keywords[ltg]=Internet;WWW;Browser;Web;Explorer; +Keywords[lv]=Internets;WWW;Pārlūkprogramma;Tīmeklis; +Keywords[meh]=Internet;WWW;Browser;Web;Explorer; +Keywords[mk]=Internet;WWW;Browser;Web;Explorer; +Keywords[mr]=Internet;WWW;Browser;Web;Explorer; +Keywords[ms]=Internet;WWW;Browser;Web;Explorer; +Keywords[my]=Internet;WWW;Browser;Web;Explorer; +Keywords[nb_NO]=Internett;WWW;Nettleser;Web;Utforsker; +Keywords[ne_NP]=Internet;WWW;Browser;Web;Explorer; +Keywords[nl]=Internet;WWW;Browser;Web;Verkenner; +Keywords[nn_NO]=Internett;WWW;Nettlesar;Web;Utforskar; +Keywords[oc]=Internet;WWW;Navegador;Navigador;Navegator;Navigator;Web;Explorer; +Keywords[pa_IN]=ਇੰਟਰਨੈੱਟ;WWW;ਬਰਾਊਜ਼ਰ;ਵੈੱਬ;ਐਕਸਪਲਰੋਰ;ਵੈਬ;ਇੰਟਰਨੈਟ; +Keywords[pl]=Internet;WWW;Przeglądarka;Browser;Wyszukiwarka;Web;Sieć;Explorer;Eksplorer;Strony;Witryny;internetowe; +Keywords[pt_BR]=Internet;WWW;Browser;Web;Explorer;Navegador; +Keywords[pt_PT]=Internet;WWW;Navegador;Web;Explorador; +Keywords[rm]=Internet;WWW;Browser;Web;Explorer;navigatur; +Keywords[ro]=Internet;WWW;Browser;Web;Explorer; +Keywords[ru]=Сеть;Интернет;Браузер;Доступ в Интернет; +Keywords[sat]=Internet;WWW;Browser;Web;Explorer; +Keywords[sc]=Internet;WWW;Navigadore;Web;Explorer; +Keywords[sco]=Internet;WWW;Browser;Web;Explorer; +Keywords[si]=අන්තර්ජාලය;අතිරික්සුව;පිරික්සන්න;ගවේශකය;Internet;WWW;Browser;Web;Explorer; +Keywords[sk]=Internet;WWW;Prehliadač;Web;Prieskumník; +Keywords[skr]=Internet;WWW;Browser;Web;Explorer; +Keywords[sl]=internet;www;brskalnik;splet; +Keywords[son]=Internet;WWW;Browser;Web;Explorer; +Keywords[sq]=Internet;WWW;Shfletues;Web;Eksplorues; +Keywords[sr]=Internet;WWW;Browser;Web;Explorer; +Keywords[sv_SE]=Internet;WWW;Webbläsare;Webb;Utforskare; +Keywords[szl]=Internet;WWW;Browser;Web;Explorer; +Keywords[ta]=Internet;WWW;Browser;Web;Explorer; +Keywords[te]=Internet;WWW;Browser;Web;Explorer; +Keywords[tg]=Интернет;WWW;Браузер;Сомона;Ҷустуҷӯгар; +Keywords[th]=อินเทอร์เน็ต;เบราว์เซอร์;เว็บ;Internet;WWW;Browser;Web;Explorer; +Keywords[tl]=Internet;WWW;Browser;Web;Explorer; +Keywords[tr]=Internet;WWW;Browser;Web;Explorer;İnternet;Tarayıcı; +Keywords[trs]=Internet;WWW;Browser;Web;Explorer; +Keywords[uk]=Інтернет;WWW;Браузер;Веб;Переглядач; +Keywords[ur]=Internet;WWW;Browser;Web;Explorer; +Keywords[uz]=Internet;WWW;Browser;Web;Explorer; +Keywords[vi]=Internet;WWW;Trình duyệt;Web;Duyệt web; +Keywords[wo]=Internet;WWW;Browser;Web;Explorer; +Keywords[xh]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_TW]=網際網路;網路;瀏覽器;網頁;上網;Internet;WWW;Browser;Web;Explorer; +X-GNOME-FullName=Firefox Web Browser +X-GNOME-FullName[ach]=Firefox Web Browser +X-GNOME-FullName[af]=Firefox Web Browser +X-GNOME-FullName[an]=Firefox Web Browser +X-GNOME-FullName[ar]=متصفح Firefox +X-GNOME-FullName[ast]=Firefox Web Browser +X-GNOME-FullName[az]=Firefox Web Browser +X-GNOME-FullName[be]=Вэб-браўзер Firefox +X-GNOME-FullName[bg]=Firefox Уеб браузър +X-GNOME-FullName[bn]=Firefox Web Browser +X-GNOME-FullName[br]=Merdeer Web Firefox +X-GNOME-FullName[brx]=Firefox Web Browser +X-GNOME-FullName[bs]=Firefox web pretraživač +X-GNOME-FullName[ca]=Navegador web Firefox +X-GNOME-FullName[ca_valencia]=Firefox Web Browser +X-GNOME-FullName[cak]=Firefox Web Browser +X-GNOME-FullName[ckb]=Firefox Web Browser +X-GNOME-FullName[cs]=Webový prohlížeč Firefox +X-GNOME-FullName[cy]=Porwr Gwe Firefox +X-GNOME-FullName[da]=Firefox-browser +X-GNOME-FullName[de]=Firefox-Web-Browser +X-GNOME-FullName[dsb]=Webwobglědowak Firefox +X-GNOME-FullName[el]=Πρόγραμμα περιήγησης Firefox +X-GNOME-FullName[en_CA]=Firefox Web Browser +X-GNOME-FullName[en_GB]=Firefox Web Browser +X-GNOME-FullName[eo]=Retumilo Firefox +X-GNOME-FullName[es_AR]=Navegador web Firefox +X-GNOME-FullName[es_CL]=Navegador web Firefox +X-GNOME-FullName[es_ES]=Navegador web Firefox +X-GNOME-FullName[es_MX]=Navegador web Firefox +X-GNOME-FullName[et]=Firefox Web Browser +X-GNOME-FullName[eu]=Firefox web nabigatzailea +X-GNOME-FullName[fa]=Firefox Web Browser +X-GNOME-FullName[ff]=Firefox Web Browser +X-GNOME-FullName[fi]=Firefox-verkkoselain +X-GNOME-FullName[fr]=Navigateur web Firefox +X-GNOME-FullName[fur]=Navigadôr web Firefox +X-GNOME-FullName[fy_NL]=Firefox-webbrowser +X-GNOME-FullName[ga_IE]=Firefox Web Browser +X-GNOME-FullName[gd]=Brabhsair-lìn Firefox +X-GNOME-FullName[gl]=Navegador web Firefox +X-GNOME-FullName[gn]=Firefox Ñanduti Kundahára +X-GNOME-FullName[gu_IN]=Firefox Web Browser +X-GNOME-FullName[he]=דפדפן אינטרנט Firefox +X-GNOME-FullName[hi_IN]=Firefox वेब ब्राउज़र +X-GNOME-FullName[hr]=Firefox web preglednik +X-GNOME-FullName[hsb]=Webwobhladowak Firefox +X-GNOME-FullName[hu]=Firefox webböngésző +X-GNOME-FullName[hy_AM]=Firefox վեբ դիտարկիչ +X-GNOME-FullName[hye]=Firefox Web Browser +X-GNOME-FullName[ia]=Navigator web Firefox +X-GNOME-FullName[id]=Firefox Peramban Web +X-GNOME-FullName[is]=Firefox-vafri +X-GNOME-FullName[it]=Browser web Firefox +X-GNOME-FullName[ja]=Firefox ウェブブラウザー +X-GNOME-FullName[ka]=Firefox-ბრაუზერი +X-GNOME-FullName[kab]=Iminig web Firefox +X-GNOME-FullName[kk]=Firefox веб-браузері +X-GNOME-FullName[km]=Firefox Web Browser +X-GNOME-FullName[kn]=Firefox Web Browser +X-GNOME-FullName[ko]=Firefox 웹 브라우저 +X-GNOME-FullName[lij]=Firefox Navegatô Web +X-GNOME-FullName[lo]=Firefox ເວັບບຣາວເຊີ +X-GNOME-FullName[lt]=Firefox Web Browser +X-GNOME-FullName[ltg]=Firefox Web Browser +X-GNOME-FullName[lv]=Firefox tīmekļa pārlūks +X-GNOME-FullName[meh]=Firefox Web Browser +X-GNOME-FullName[mk]=Firefox Web Browser +X-GNOME-FullName[mr]=Firefox Web Browser +X-GNOME-FullName[ms]=Firefox Web Browser +X-GNOME-FullName[my]=Firefox Web Browser +X-GNOME-FullName[nb_NO]=Firefox-nettleser +X-GNOME-FullName[ne_NP]=Firefox Web Browser +X-GNOME-FullName[nl]=Firefox-webbrowser +X-GNOME-FullName[nn_NO]=Firefox-nettlesar +X-GNOME-FullName[oc]=Navegador web Firefox +X-GNOME-FullName[pa_IN]=Firefox ਵੈੱਬ ਬਰਾਊਜ਼ਰ +X-GNOME-FullName[pl]=Przeglądarka Firefox +X-GNOME-FullName[pt_BR]=Navegador web Firefox +X-GNOME-FullName[pt_PT]=Navegador Web Firefox +X-GNOME-FullName[rm]=Navigatur-web Firefox +X-GNOME-FullName[ro]=Firefox Web Browser +X-GNOME-FullName[ru]=Веб-браузер Firefox +X-GNOME-FullName[sat]=Firefox ᱣᱮᱵᱽ ᱵᱽᱨᱟᱣᱡᱚᱨ +X-GNOME-FullName[sc]=Navigadore web Firefox +X-GNOME-FullName[sco]=Firefox Web Browser +X-GNOME-FullName[si]=Firefox අතිරික්සුව +X-GNOME-FullName[sk]=Webový prehliadač Firefox +X-GNOME-FullName[skr]=Firefox ویب براؤزر +X-GNOME-FullName[sl]=Spletni brskalnik Firefox +X-GNOME-FullName[son]=Firefox Web Browser +X-GNOME-FullName[sq]=Shfletuesi Firefox +X-GNOME-FullName[sr]=Firefox веб прегледач +X-GNOME-FullName[sv_SE]=Firefox webbläsare +X-GNOME-FullName[szl]=Firefox Web Browser +X-GNOME-FullName[ta]=Firefox Web Browser +X-GNOME-FullName[te]=Firefox Web Browser +X-GNOME-FullName[tg]=Браузери интернетии «Firefox» +X-GNOME-FullName[th]=เว็บเบราว์เซอร์ Firefox +X-GNOME-FullName[tl]=Firefox Web Browser +X-GNOME-FullName[tr]=Firefox Web Tarayıcısı +X-GNOME-FullName[trs]=Firefox Web riña gāchē nu’ +X-GNOME-FullName[uk]=Браузер Firefox +X-GNOME-FullName[ur]=Firefox Web Browser +X-GNOME-FullName[uz]=Firefox Web Browser +X-GNOME-FullName[vi]=Trình duyệt Web Firefox +X-GNOME-FullName[wo]=Firefox Web Browser +X-GNOME-FullName[xh]=Firefox Web Browser +X-GNOME-FullName[zh_CN]=Firefox 浏览器 +X-GNOME-FullName[zh_TW]=Firefox 網頁瀏覽器 + +[Desktop Action new-window] +Exec=/usr/lib/firefox/firefox --new-window https://endeavouros.com/ +Name=New Window +Name[ach]=New Window +Name[af]=New Window +Name[an]=New Window +Name[ar]=نافذة جديدة +Name[ast]=New Window +Name[az]=New Window +Name[be]=Новае акно +Name[bg]=Нов прозорец +Name[bn]=New Window +Name[br]=Prenestr nevez +Name[brx]=New Window +Name[bs]=Novi prozor +Name[ca]=Finestra nova +Name[ca_valencia]=New Window +Name[cak]=K'ak'a' Tzuwäch +Name[ckb]=New Window +Name[cs]=Nové okno +Name[cy]=Ffenestr Newydd +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[dsb]=Nowe wokno +Name[el]=Νέο παράθυρο +Name[en_CA]=New Window +Name[en_GB]=New Window +Name[eo]=Nova fenestro +Name[es_AR]=Nueva ventana +Name[es_CL]=Nueva ventana +Name[es_ES]=Nueva ventana +Name[es_MX]=Nueva ventana +Name[et]=New Window +Name[eu]=Leiho berria +Name[fa]=New Window +Name[ff]=New Window +Name[fi]=Uusi ikkuna +Name[fr]=Nouvelle fenêtre +Name[fur]=Gnûf barcon +Name[fy_NL]=Nij finster +Name[ga_IE]=New Window +Name[gd]=Uinneag ùr +Name[gl]=Nova xanela +Name[gn]=Ovetã pyahu +Name[gu_IN]=New Window +Name[he]=חלון חדש +Name[hi_IN]=New Window +Name[hr]=Novi prozor +Name[hsb]=Nowe wokno +Name[hu]=Új ablak +Name[hy_AM]=Նոր պատուհան +Name[hye]=New Window +Name[ia]=Nove fenestra +Name[id]=Jendela Baru +Name[is]=Nýr gluggi +Name[it]=Nuova finestra +Name[ja]=新しいウィンドウ +Name[ka]=ახალი ფანჯარა +Name[kab]=Asfaylu amaynut +Name[kk]=Жаңа терезе +Name[km]=New Window +Name[kn]=New Window +Name[ko]=새 창 +Name[lij]=Neuvo Barcon +Name[lo]=ວິນໂດໃໝ່ +Name[lt]=New Window +Name[ltg]=New Window +Name[lv]=Jauns logs +Name[meh]=New Window +Name[mk]=New Window +Name[mr]=New Window +Name[ms]=New Window +Name[my]=New Window +Name[nb_NO]=Nytt vindu +Name[ne_NP]=New Window +Name[nl]=Nieuw venster +Name[nn_NO]=Nytt vindauge +Name[oc]=Fenèstra novèla +Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ +Name[pl]=Nowe okno +Name[pt_BR]=Nova janela +Name[pt_PT]=Nova janela +Name[rm]=Nova fanestra +Name[ro]=New Window +Name[ru]=Новое окно +Name[sat]=ᱱᱟᱶᱟ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana noa +Name[sco]=New Window +Name[si]=නව කවුළුව +Name[sk]=Nové okno +Name[skr]=نویں ونڈو +Name[sl]=Novo okno +Name[son]=New Window +Name[sq]=Dritare e Re +Name[sr]=Нови прозор +Name[sv_SE]=Nytt fönster +Name[szl]=New Window +Name[ta]=New Window +Name[te]=New Window +Name[tg]=Равзанаи нав +Name[th]=หน้าต่างใหม่ +Name[tl]=New Window +Name[tr]=Yeni pencere +Name[trs]=Bēntanâ nākàa +Name[uk]=Нове вікно +Name[ur]=New Window +Name[uz]=New Window +Name[vi]=Cửa sổ mới +Name[wo]=New Window +Name[xh]=New Window +Name[zh_CN]=新建窗口 +Name[zh_TW]=開新視窗 + +[Desktop Action new-private-window] +Exec=/usr/lib/firefox/firefox --private-window %u +Name=New Private Window +Name[ach]=New Private Window +Name[af]=New Private Window +Name[an]=New Private Window +Name[ar]=نافذة خاصة جديدة +Name[ast]=New Private Window +Name[az]=New Private Window +Name[be]=Новае прыватнае акно +Name[bg]=Нов личен прозорец +Name[bn]=New Private Window +Name[br]=Prenestr prevez nevez +Name[brx]=New Private Window +Name[bs]=Novi privatni prozor +Name[ca]=Finestra privada nova +Name[ca_valencia]=New Private Window +Name[cak]=K'ak'a' Ichinan Tzuwäch +Name[ckb]=New Private Window +Name[cs]=Nové anonymní okno +Name[cy]=Ffenestr Breifat Newydd +Name[da]=Nyt privat vindue +Name[de]=Neues privates Fenster +Name[dsb]=Nowe priwatne wokno +Name[el]=Νέο ιδιωτικό παράθυρο +Name[en_CA]=New Private Window +Name[en_GB]=New Private Window +Name[eo]=Nova privata fenestro +Name[es_AR]=Nueva ventana privada +Name[es_CL]=Nueva ventana privada +Name[es_ES]=Nueva ventana privada +Name[es_MX]=Nueva ventana privada +Name[et]=New Private Window +Name[eu]=Leiho pribatu berria +Name[fa]=New Private Window +Name[ff]=New Private Window +Name[fi]=Uusi yksityinen ikkuna +Name[fr]=Nouvelle fenêtre privée +Name[fur]=Gnûf barcon privât +Name[fy_NL]=Nij priveefinster +Name[ga_IE]=New Private Window +Name[gd]=Uinneag phrìobhaideach ùr +Name[gl]=Nova xanela privada +Name[gn]=Ovetã ñemi pyahu +Name[gu_IN]=New Private Window +Name[he]=חלון פרטי חדש +Name[hi_IN]=New Private Window +Name[hr]=Novi privatni prozor +Name[hsb]=Nowe priwatne wokno +Name[hu]=Új privát ablak +Name[hy_AM]=Նոր գաղտնի պատուհան +Name[hye]=New Private Window +Name[ia]=Nove fenestra private +Name[id]=Jendela Mode Pribadi Baru +Name[is]=Nýr huliðsgluggi +Name[it]=Nuova finestra anonima +Name[ja]=新しいプライベートウィンドウ +Name[ka]=ახალი პირადი ფანჯარა +Name[kab]=Asfaylu amaynut n tunigin tusligt +Name[kk]=Жаңа жекелік терезе +Name[km]=New Private Window +Name[kn]=New Private Window +Name[ko]=새 사생활 보호 창 +Name[lij]=Neuvo Barcon Privòu +Name[lo]=ວິນໂດສ່ວນຕົວໃໝ່ +Name[lt]=New Private Window +Name[ltg]=New Private Window +Name[lv]=Jauns privātais logs +Name[meh]=New Private Window +Name[mk]=New Private Window +Name[mr]=New Private Window +Name[ms]=New Private Window +Name[my]=New Private Window +Name[nb_NO]=Nytt privat vindu +Name[ne_NP]=New Private Window +Name[nl]=Nieuw privévenster +Name[nn_NO]=Nytt privat vindauge +Name[oc]=Fenèstra privada novèla +Name[pa_IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ +Name[pl]=Nowe okno prywatne +Name[pt_BR]=Nova janela privativa +Name[pt_PT]=Nova janela privada +Name[rm]=Nova fanestra privata +Name[ro]=New Private Window +Name[ru]=Новое приватное окно +Name[sat]=ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana privada noa +Name[sco]=New Private Window +Name[si]=නව පෞද්. කවුළුව +Name[sk]=Nové súkromné okno +Name[skr]=نویں نجی ونڈو +Name[sl]=Novo zasebno okno +Name[son]=New Private Window +Name[sq]=Dritare e Re Private +Name[sr]=Нови приватни прозор +Name[sv_SE]=Nytt privat fönster +Name[szl]=New Private Window +Name[ta]=New Private Window +Name[te]=New Private Window +Name[tg]=Равзанаи хусусии нав +Name[th]=หน้าต่างส่วนตัวใหม่ +Name[tl]=New Private Window +Name[tr]=Yeni gizli pencere +Name[trs]=Bēntanâ huì nākàa +Name[uk]=Приватне вікно +Name[ur]=New Private Window +Name[uz]=New Private Window +Name[vi]=Cửa sổ riêng tư mới +Name[wo]=New Private Window +Name[xh]=New Private Window +Name[zh_CN]=新建隐私窗口 +Name[zh_TW]=開新隱私視窗 + +[Desktop Action open-profile-manager] +Exec=/usr/lib/firefox/firefox --ProfileManager +Name=Open Profile Manager +Name[ach]=Open Profile Manager +Name[af]=Open Profile Manager +Name[an]=Open Profile Manager +Name[ar]=افتح مدير الملف الشخصي +Name[ast]=Open Profile Manager +Name[az]=Open Profile Manager +Name[be]=Адкрыць менеджар профіляў +Name[bg]=Отваряне на мениджъра на профили +Name[bn]=Open Profile Manager +Name[br]=Digeriñ an ardoer aeladoù +Name[brx]=Open Profile Manager +Name[bs]=Otvori Menadžera profila +Name[ca]=Obre el gestor de perfils +Name[ca_valencia]=Open Profile Manager +Name[cak]=Open Profile Manager +Name[ckb]=Open Profile Manager +Name[cs]=Otevřete Správce profilů +Name[cy]=Agorwch y Rheolwr Proffil +Name[da]=Åbn profilhåndtering +Name[de]=Profilverwaltung öffnen +Name[dsb]=Profilowy zastojnik wócyniś +Name[el]=Άνοιγμα Διαχείρισης προφίλ +Name[en_CA]=Open Profile Manager +Name[en_GB]=Open Profile Manager +Name[eo]=Malfermi administranton de profiloj +Name[es_AR]=Abrir administrador de perfiles +Name[es_CL]=Abrir administrador de perfiles +Name[es_ES]=Abrir administrador de perfiles +Name[es_MX]=Abrir administrador de perfiles +Name[et]=Open Profile Manager +Name[eu]=Ireki profilen kudeatzailea +Name[fa]=Open Profile Manager +Name[ff]=Open Profile Manager +Name[fi]=Avaa profiilien hallinta +Name[fr]=Ouvrir le gestionnaire de profils +Name[fur]=Vierç gjestôr profîi +Name[fy_NL]=Profylbehearder iepenje +Name[ga_IE]=Open Profile Manager +Name[gd]=Fosgail manaidsear nam pròifilean +Name[gl]=Abrir o xestor de perfís +Name[gn]=Embojuruja mba’ete ñangarekoha +Name[gu_IN]=Open Profile Manager +Name[he]=פתיחת מנהל הפרופילים +Name[hi_IN]=Open Profile Manager +Name[hr]=Otvori upravljač profila +Name[hsb]=Zrjadowak profilow wočinić +Name[hu]=Profilkezelő megnyitása +Name[hy_AM]=Բացեք պրոֆիլի կառավարիչը +Name[hye]=Open Profile Manager +Name[ia]=Aperir le gestor de profilo +Name[id]=Buka Pengelola Profil +Name[is]=Opna umsýslu notandasniða +Name[it]=Apri gestore profili +Name[ja]=プロファイルマネージャーを開く +Name[ka]=პროფილის მმართველის გახსნა +Name[kab]=Ldi amsefrak n umaɣnu +Name[kk]=Профильдер бақарушысын ашу +Name[km]=Open Profile Manager +Name[kn]=Open Profile Manager +Name[ko]=프로필 관리자 열기 +Name[lij]=Open Profile Manager +Name[lo]=ເປີດຕົວຈັດການໂປຣໄຟລ໌ +Name[lt]=Open Profile Manager +Name[ltg]=Open Profile Manager +Name[lv]=Atvērt profilu pārvaldnieku +Name[meh]=Open Profile Manager +Name[mk]=Open Profile Manager +Name[mr]=Open Profile Manager +Name[ms]=Open Profile Manager +Name[my]=Open Profile Manager +Name[nb_NO]=Åpne profilbehandler +Name[ne_NP]=Open Profile Manager +Name[nl]=Profielbeheerder openen +Name[nn_NO]=Opne profilhandsaming +Name[oc]=Dobrir lo gestionari de perfils +Name[pa_IN]=ਪਰੋਫ਼ਾਈਲ ਮੈਨੇਜਰ ਖੋਲ੍ਹੋ +Name[pl]=Menedżer profili +Name[pt_BR]=Abrir gerenciador de perfis +Name[pt_PT]=Abrir o Gestor de Perfis +Name[rm]=Avrir l'administraziun da profils +Name[ro]=Open Profile Manager +Name[ru]=Открыть менеджер профилей +Name[sat]=ᱢᱮᱫᱦᱟᱸ ᱢᱮᱱᱮᱡᱚᱨ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ +Name[sc]=Aberi su gestore de profilos +Name[sco]=Open Profile Manager +Name[si]=පැතිකඩ කළමනාකරු අරින්න +Name[sk]=Otvoriť Správcu profilov +Name[skr]=پروفائل منیجر کھولو +Name[sl]=Odpri upravitelja profilov +Name[son]=Open Profile Manager +Name[sq]=Hapni Përgjegjës Profilesh +Name[sr]=Отворите управљач профила +Name[sv_SE]=Öppna Profilhanteraren +Name[szl]=Open Profile Manager +Name[ta]=Open Profile Manager +Name[te]=Open Profile Manager +Name[tg]=Кушодани мудири профилҳо +Name[th]=เปิดตัวจัดการโปรไฟล์ +Name[tl]=Open Profile Manager +Name[tr]=Profil yöneticisini aç +Name[trs]=Sa nīkāj ñu’ūnj nej perfî huā nì’nï̀nj ïn +Name[uk]=Відкрити менеджер профілів +Name[ur]=Open Profile Manager +Name[uz]=Open Profile Manager +Name[vi]=Mở trình quản lý hồ sơ +Name[wo]=Open Profile Manager +Name[xh]=Open Profile Manager +Name[zh_CN]=打开配置文件管理器 +Name[zh_TW]=開啟設定檔管理員 diff --git a/mkarchiso b/mkarchiso index 2631d67..6c0df62 100755 --- a/mkarchiso +++ b/mkarchiso @@ -49,6 +49,12 @@ efiboot_files=() # adapted from GRUB_EARLY_INITRD_LINUX_STOCK in https://git.savannah.gnu.org/cgit/grub.git/tree/util/grub-mkconfig.in readonly ucodes=('intel-uc.img' 'intel-ucode.img' 'amd-uc.img' 'amd-ucode.img' 'early_ucode.cpio' 'microcode.cpio') declare -i need_external_ucodes=0 +readonly -A uefi_arch=( + ['x86_64']='x64' + ['aarch64']='AA64' + ['riscv64']='RISCV64' + ['loongarch64']='LOONGARCH64' +) # change for EndeavourOS start @@ -467,9 +473,9 @@ _make_boot_on_iso9660() { _msg_info "Done!" } -# Prepare syslinux for booting from MBR (isohybrid) -_make_bootmode_bios.syslinux.mbr() { - _msg_info "Setting up SYSLINUX for BIOS booting from a disk..." +# Prepare syslinux for booting from MBR (isohybrid) and El-Torito booting +_make_bootmode_bios.syslinux() { + _msg_info "Setting up SYSLINUX for BIOS booting..." install -d -m 0755 -- "${isofs_dir}/boot/syslinux" for _cfg in "${profile}/syslinux/"*.cfg; do sed "s|%ARCHISO_LABEL%|${iso_label}|g; @@ -485,8 +491,6 @@ _make_bootmode_bios.syslinux.mbr() { install -m 0644 -- "${pacstrap_dir}/usr/lib/syslinux/bios/lpxelinux.0" "${isofs_dir}/boot/syslinux/" install -m 0644 -- "${pacstrap_dir}/usr/lib/syslinux/bios/memdisk" "${isofs_dir}/boot/syslinux/" - _run_once _make_boot_on_iso9660 - if [[ -e "${isofs_dir}/boot/syslinux/hdt.c32" ]]; then install -d -m 0755 -- "${isofs_dir}/boot/syslinux/hdt" if [[ -e "${pacstrap_dir}/usr/share/hwdata/pci.ids" ]]; then @@ -504,20 +508,19 @@ _make_bootmode_bios.syslinux.mbr() { install -m 0644 -- "${pacstrap_dir}/boot/memtest86+/memtest.bin" "${isofs_dir}/boot/memtest86+/memtest" install -m 0644 -- "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" "${isofs_dir}/boot/memtest86+/LICENSE" fi - _msg_info "Done! SYSLINUX set up for BIOS booting from a disk successfully." -} -# Prepare syslinux for El-Torito booting -_make_bootmode_bios.syslinux.eltorito() { - _msg_info "Setting up SYSLINUX for BIOS booting from an optical disc..." install -d -m 0755 -- "${isofs_dir}/boot/syslinux" install -m 0644 -- "${pacstrap_dir}/usr/lib/syslinux/bios/isolinux.bin" "${isofs_dir}/boot/syslinux/" install -m 0644 -- "${pacstrap_dir}/usr/lib/syslinux/bios/isohdpfx.bin" "${isofs_dir}/boot/syslinux/" - # ISOLINUX and SYSLINUX installation is shared - _run_once _make_bootmode_bios.syslinux.mbr - - _msg_info "Done! SYSLINUX set up for BIOS booting from an optical disc successfully." + _msg_info "Done! SYSLINUX set up for BIOS booting successfully." +} +# Deprecated boot modes +_make_bootmode_bios.syslinux.eltorito() { + return 1 +} +_make_bootmode_bios.syslinux.mbr() { + return 1 } # Copy kernel and initramfs to FAT image @@ -542,19 +545,17 @@ _make_boot_on_fat() { } # Create a FAT image (efiboot.img) which will serve as the EFI system partition -# $1: image size in bytes _make_efibootimg() { - local imgsize_kib="0" - local imgsize_bytes=${1} + local -i imgsize_kib=0 local mkfs_fat_opts=(-C -n ARCHISO_EFI) - # Convert from bytes to KiB and round up to the next full MiB with an additional 8 MiB for reserved sectors, file - # and directory entries and to allow adding custom files when repacking the ISO. - imgsize_kib="$( - awk 'function ceil(x){return int(x)+(x>int(x))} - function byte_to_kib(x){return x/1024} - function mib_to_kib(x){return x*1024} - END {print mib_to_kib(ceil((byte_to_kib($1)+8192)/1024))}' <<<"${imgsize_bytes}" + # Calculate the file size in bytes, convert to KiB and round up to the next full MiB with an additional 8 MiB for + # reserved sectors, file and directory entries and to allow adding custom files when repacking the ISO. + imgsize_kib="$(du -bcs -- "${efiboot_files[@]}" 2>/dev/null \ + | awk 'function ceil(x){return int(x)+(x>int(x))} + function byte_to_kib(x){return x/1024} + function mib_to_kib(x){return x*1024} + END {print mib_to_kib(ceil((byte_to_kib($1)+8192)/1024))}' )" # Use FAT32 as early as possible. mkfs.fat selects FAT32 if the size ≥ 512 MiB, but a FAT32 file system can already @@ -566,7 +567,7 @@ _make_efibootimg() { # The FAT image must be created with mkfs.fat not mformat, as some systems have issues with mformat made images: # https://lists.gnu.org/archive/html/grub-devel/2019-04/msg00099.html rm -f -- "${efibootimg}" - _msg_info "Creating FAT image of size: ${imgsize_kib} KiB..." + _msg_info "Creating FAT image of size: $(( imgsize_kib / 1024 )) MiB..." if [[ "${quiet}" == "y" ]]; then # mkfs.fat does not have a -q/--quiet option, so redirect stdout to /dev/null instead # https://github.com/dosfstools/dosfstools/issues/103 @@ -592,18 +593,6 @@ _check_if_initramfs_has_ucode() { done } -# Copy GRUB files to ISO 9660 which is used by both IA32 UEFI and x64 UEFI -_make_common_bootmode_grub_copy_to_isofs() { - local files_to_copy=() - - files_to_copy+=("${work_dir}/grub/"*) - if compgen -G "${profile}/grub/!(*.cfg)" &>/dev/null; then - files_to_copy+=("${profile}/grub/"!(*.cfg)) - fi - install -d -m 0755 -- "${isofs_dir}/boot/grub" - cp -r --remove-destination -- "${files_to_copy[@]}" "${isofs_dir}/boot/grub/" -} - # Prepare GRUB configuration files _make_common_bootmode_grub_cfg() { local _cfg @@ -702,8 +691,17 @@ _make_common_grubenv_and_loopbackcfg() { fi } -_make_bootmode_uefi-ia32.grub.esp() { - local grubmodules=() +# Prepare GRUB +_make_bootmode_uefi.grub() { + local grub_target grubmodules=() files_to_copy=() + + _msg_info "Setting up GRUB for UEFI booting..." + + # Get GRUB-specific architecture name + case "$arch" in + 'aarch64') grub_target='arm64-efi' ;; + *) grub_target="${arch}-efi" ;; + esac # Prepare configuration files _run_once _make_common_bootmode_grub_cfg @@ -715,151 +713,153 @@ _make_bootmode_uefi-ia32.grub.esp() { minicmd normal ntfs ntfscomp part_apple part_gpt part_msdos png read reboot regexp search \ search_fs_file search_fs_uuid search_label serial sleep tpm udf usb usbserial_common usbserial_ftdi \ usbserial_pl2303 usbserial_usbdebug video xfs zstd) - grub-mkstandalone -O i386-efi \ + grub-mkstandalone -O "$grub_target" \ --modules="${grubmodules[*]}" \ --locales="en@quot" \ --themes="" \ --sbat=/usr/share/grub/sbat.csv \ --disable-shim-lock \ - -o "${work_dir}/BOOTIA32.EFI" "boot/grub/grub.cfg=${work_dir}/grub-embed.cfg" + -o "${work_dir}/BOOT${uefi_arch[$arch]}.EFI" "boot/grub/grub.cfg=${work_dir}/grub-embed.cfg" # Add GRUB to the list of files used to calculate the required FAT image size. - efiboot_files+=("${work_dir}/BOOTIA32.EFI" - "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi") + efiboot_files+=("${work_dir}/BOOT${uefi_arch[$arch]}.EFI" + "${pacstrap_dir}/usr/share/edk2-shell/${uefi_arch[$arch],,}/Shell_Full.efi") - if [[ " ${bootmodes[*]} " =~ uefi-x64.systemd-boot.esp ]]; then - # TODO: Remove this branch. - _run_once _make_bootmode_uefi-x64.systemd-boot.esp - elif [[ " ${bootmodes[*]} " =~ uefi-x64.grub.esp ]]; then - _run_once _make_bootmode_uefi-x64.grub.esp - else - efiboot_imgsize="$(du -bcs -- "${efiboot_files[@]}" 2>/dev/null | awk 'END { print $1 }')" - # Create a FAT image for the EFI system partition - _make_efibootimg "$efiboot_imgsize" + # Create IA32 EFI binary for mixed-mode booting on x86_64 systems with IA32 UEFI + if [[ "$arch" == 'x86_64' ]]; then + grub-mkstandalone -O i386-efi \ + --modules="${grubmodules[*]}" \ + --locales="en@quot" \ + --themes="" \ + --sbat=/usr/share/grub/sbat.csv \ + --disable-shim-lock \ + -o "${work_dir}/BOOTIA32.EFI" "boot/grub/grub.cfg=${work_dir}/grub-embed.cfg" + efiboot_files+=("${work_dir}/BOOTIA32.EFI" + "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi") fi - # Copy GRUB EFI binary to the default/fallback boot path - mcopy -i "${efibootimg}" "${work_dir}/BOOTIA32.EFI" ::/EFI/BOOT/BOOTIA32.EFI - - # Copy GRUB files - _run_once _make_common_bootmode_grub_copy_to_isofs - - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ]]; then - mcopy -i "${efibootimg}" "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ::/shellia32.efi - fi - - _msg_info "Done! GRUB set up for UEFI booting successfully." -} - -# Prepare GRUB for El Torito booting -_make_bootmode_uefi-ia32.grub.eltorito() { - # El Torito UEFI boot requires an image containing the EFI system partition. - # uefi-ia32.grub.eltorito has the same requirements as uefi-ia32.grub.esp - _run_once _make_bootmode_uefi-ia32.grub.esp - - # Prepare configuration files - _run_once _make_common_bootmode_grub_cfg - - # Additionally set up systemd-boot in ISO 9660. This allows creating a medium for the live environment by using - # manual partitioning and simply copying the ISO 9660 file system contents. - # This is not related to El Torito booting and no firmware uses these files. - _msg_info "Preparing an /EFI directory for the ISO 9660 file system..." - install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" - - # Copy GRUB EFI binary to the default/fallback boot path - install -m 0644 -- "${work_dir}/BOOTIA32.EFI" "${isofs_dir}/EFI/BOOT/BOOTIA32.EFI" - - # Copy GRUB configuration files - _run_once _make_common_bootmode_grub_copy_to_isofs - - # edk2-shell based UEFI shell - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ]]; then - install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" "${isofs_dir}/shellia32.efi" - fi - - _msg_info "Done!" -} - -_make_bootmode_uefi-x64.grub.esp() { - local grubmodules=() - - # Prepare configuration files - _run_once _make_common_bootmode_grub_cfg - - # Create EFI binary - # Module list from https://bugs.archlinux.org/task/71382#comment202911 - grubmodules=(all_video at_keyboard boot btrfs cat chain configfile echo efifwsetup efinet exfat ext2 f2fs fat font \ - gfxmenu gfxterm gzio halt hfsplus iso9660 jpeg keylayouts linux loadenv loopback lsefi lsefimmap \ - minicmd normal ntfs ntfscomp part_apple part_gpt part_msdos png read reboot regexp search \ - search_fs_file search_fs_uuid search_label serial sleep tpm udf usb usbserial_common usbserial_ftdi \ - usbserial_pl2303 usbserial_usbdebug video xfs zstd) - grub-mkstandalone -O x86_64-efi \ - --modules="${grubmodules[*]}" \ - --locales="en@quot" \ - --themes="" \ - --sbat=/usr/share/grub/sbat.csv \ - --disable-shim-lock \ - -o "${work_dir}/BOOTx64.EFI" "boot/grub/grub.cfg=${work_dir}/grub-embed.cfg" - # Add GRUB to the list of files used to calculate the required FAT image size. - efiboot_files+=("${work_dir}/BOOTx64.EFI" - "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi") - - efiboot_imgsize="$(du -bcs -- "${efiboot_files[@]}" 2>/dev/null | awk 'END { print $1 }')" - # Create a FAT image for the EFI system partition - _make_efibootimg "$efiboot_imgsize" + _make_efibootimg + + # Additionally set up GRUB in ISO 9660. This allows creating a medium for the live environment by using + # manual partitioning and simply copying the ISO 9660 file system contents. + # This is not related to El Torito booting and no firmware uses these files. + install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" # Copy GRUB EFI binary to the default/fallback boot path - mcopy -i "${efibootimg}" "${work_dir}/BOOTx64.EFI" ::/EFI/BOOT/BOOTx64.EFI - - # Copy GRUB files - _run_once _make_common_bootmode_grub_copy_to_isofs - - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then - mcopy -i "${efibootimg}" "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ::/shellx64.efi + mcopy -i "${efibootimg}" "${work_dir}/BOOT${uefi_arch[$arch]}.EFI" "::/EFI/BOOT/BOOT${uefi_arch[$arch]}.EFI" + install -m 0644 -- "${work_dir}/BOOT${uefi_arch[$arch]}.EFI" "${isofs_dir}/EFI/BOOT/BOOT${uefi_arch[$arch]}.EFI" + # Set up mixed mode booting for x86_64 systems with IA32 UEFI + if [[ "$arch" == 'x86_64' ]]; then + mcopy -i "${efibootimg}" "${work_dir}/BOOTIA32.EFI" ::/EFI/BOOT/BOOTIA32.EFI + install -m 0644 -- "${work_dir}/BOOTIA32.EFI" "${isofs_dir}/EFI/BOOT/BOOTIA32.EFI" fi - # Add other aditional/extra files to ${install_dir}/boot/ - if [[ -e "${pacstrap_dir}/boot/memtest86+/memtest.efi" ]]; then - install -d -m 0755 -- "${isofs_dir}/boot/memtest86+/" - install -m 0644 -- "${pacstrap_dir}/boot/memtest86+/memtest.efi" "${isofs_dir}/boot/memtest86+/memtest.efi" - install -m 0644 -- "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" "${isofs_dir}/boot/memtest86+/LICENSE" + # Copy GRUB files + files_to_copy+=("${work_dir}/grub/"*) + if compgen -G "${profile}/grub/!(*.cfg)" &>/dev/null; then + files_to_copy+=("${profile}/grub/"!(*.cfg)) + fi + install -d -m 0755 -- "${isofs_dir}/boot/grub" + cp -r --remove-destination -- "${files_to_copy[@]}" "${isofs_dir}/boot/grub/" + + # edk2-shell based UEFI shell + if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/${uefi_arch[$arch],,}/Shell_Full.efi" ]]; then + mcopy -i "${efibootimg}" \ + "${pacstrap_dir}/usr/share/edk2-shell/${uefi_arch[$arch],,}/Shell_Full.efi" "::/shell${uefi_arch[$arch],,}.efi" + install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/${uefi_arch[$arch],,}/Shell_Full.efi" \ + "${isofs_dir}/shell${uefi_arch[$arch],,}.efi" + fi + if [[ "$arch" == 'x86_64' ]]; then + # UEFI shell for x86_64 systems with IA32 UEFI + if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ]]; then + mcopy -i "${efibootimg}" "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ::/shellia32.efi + install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" "${isofs_dir}/shellia32.efi" + fi + + # Copy Memtest86+ + # Only the x64 binary is built. See https://gitlab.archlinux.org/archlinux/packaging/packages/memtest86plus/-/merge_requests/2 + if [[ -e "${pacstrap_dir}/boot/memtest86+/memtest.efi" ]]; then + install -d -m 0755 -- "${isofs_dir}/boot/memtest86+/" + install -m 0644 -- "${pacstrap_dir}/boot/memtest86+/memtest.efi" "${isofs_dir}/boot/memtest86+/memtest.efi" + install -m 0644 -- "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" "${isofs_dir}/boot/memtest86+/LICENSE" + fi fi _msg_info "Done! GRUB set up for UEFI booting successfully." } - -# Prepare GRUB for El Torito booting +# Deprecated boot modes +_make_bootmode_uefi-ia32.grub.esp() { + return 1 +} +_make_bootmode_uefi-ia32.grub.eltorito() { + return 1 +} +_make_bootmode_uefi-x64.grub.esp() { + return 1 +} _make_bootmode_uefi-x64.grub.eltorito() { - # El Torito UEFI boot requires an image containing the EFI system partition. - # uefi-x64.grub.eltorito has the same requirements as uefi-x64.grub.esp - _run_once _make_bootmode_uefi-x64.grub.esp - - # Prepare configuration files - _run_once _make_common_bootmode_grub_cfg - - # Additionally set up systemd-boot in ISO 9660. This allows creating a medium for the live environment by using - # manual partitioning and simply copying the ISO 9660 file system contents. - # This is not related to El Torito booting and no firmware uses these files. - _msg_info "Preparing an /EFI directory for the ISO 9660 file system..." - install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" - - # Copy GRUB EFI binary to the default/fallback boot path - install -m 0644 -- "${work_dir}/BOOTx64.EFI" "${isofs_dir}/EFI/BOOT/BOOTx64.EFI" - - # Copy GRUB files - _run_once _make_common_bootmode_grub_copy_to_isofs - - # edk2-shell based UEFI shell - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then - install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" "${isofs_dir}/shellx64.efi" - fi - - _msg_info "Done!" + return 1 } -_make_common_bootmode_systemd-boot() { - local _file efiboot_imgsize - local _available_ucodes=() +# Copy UEFI-architecture-specific files +_make_common_bootmode_uefi.systemd-boot_copy_files() { + local target_arch="$1" + + # Copy systemd-boot EFI binary to the default/fallback boot path + mcopy -i "${efibootimg}" \ + "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-boot${target_arch,,}.efi" "::/EFI/BOOT/BOOT${target_arch}.EFI" + install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-boot${target_arch,,}.efi" \ + "${isofs_dir}/EFI/BOOT/BOOT${target_arch}.EFI" + + # edk2-shell based UEFI shell + # shell*.efi is picked up automatically when on / + if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/${target_arch,,}/Shell_Full.efi" ]]; then + mcopy -i "${efibootimg}" \ + "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" "::/shell${target_arch,,}.efi" + install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/${target_arch,,}/Shell_Full.efi" \ + "${isofs_dir}/shell${target_arch,,}.efi" + fi + + # Copy Memtest86+ + # Only the x64 binary is built. See https://gitlab.archlinux.org/archlinux/packaging/packages/memtest86plus/-/merge_requests/2 + if [[ "$target_arch" == 'x64' ]]; then + if [[ -e "${pacstrap_dir}/boot/memtest86+/memtest.efi" ]]; then + mmd -i "${efibootimg}" ::/boot ::/boot/memtest86+ + mcopy -i "${efibootimg}" \ + "${pacstrap_dir}/boot/memtest86+/memtest.efi" ::/boot/memtest86+/ + mcopy -i "${efibootimg}" \ + "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" ::/boot/memtest86+/LICENSE + install -d -m 0755 -- "${isofs_dir}/boot/memtest86+/" + install -m 0644 -- "${pacstrap_dir}/boot/memtest86+/memtest.efi" "${isofs_dir}/boot/memtest86+/memtest.efi" + install -m 0644 -- "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" "${isofs_dir}/boot/memtest86+/LICENSE" + fi + fi +} + +# Prepare systemd-boot +_make_bootmode_uefi.systemd-boot() { + local _conf _file _available_ucodes=() boot_entry_arch + + _msg_info "Setting up systemd-boot for UEFI booting..." + + # Prepare configuration files + install -d -m 0755 -- "${work_dir}/loader" "${work_dir}/loader/entries" + install -m 0644 -- "${profile}/efiboot/loader/loader.conf" "${work_dir}/loader" + for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do + # Extract the UEFI architecture from the boot entry file + if boot_entry_arch="$(grep -Pao -- '^architecture\s+\K\w+' "${_conf}" 2>/dev/null)"; then + # Skip adding boot entry files for foreign UEFI architectures (unless when on x86_64 and adding IA32 boot entries) + if ! [[ "${boot_entry_arch^^}" == "${uefi_arch[$arch]^^}" || ( "$arch" == 'x86_64' && "${boot_entry_arch^^}" == 'IA32' ) ]]; then + continue + fi + fi + + sed "s|%ARCHISO_LABEL%|${iso_label}|g; + s|%ARCHISO_UUID%|${iso_uuid}|g; + s|%INSTALL_DIR%|${install_dir}|g; + s|%ARCH%|${arch}|g" \ + "${_conf}" >"${work_dir}/loader/entries/${_conf##*/}" + done if (( need_external_ucodes )); then for _file in "${ucodes[@]}"; do @@ -869,195 +869,64 @@ _make_common_bootmode_systemd-boot() { done fi # Calculate the required FAT image size in bytes - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.esp ' || " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.eltorito ' ]]; then - efiboot_files+=("${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" - "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" - "${pacstrap_dir}/boot/memtest86+/memtest.efi" - "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt") - fi - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-ia32.systemd-boot.esp ' || " ${bootmodes[*]} " =~ ' uefi-ia32.systemd-boot.eltorito ' ]]; then - efiboot_files+=("${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootia32.efi" - "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi") - fi - - efiboot_files+=("${work_dir}/loader/" + efiboot_files+=("${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-boot${uefi_arch[$arch],,}.efi" + "${pacstrap_dir}/usr/share/edk2-shell/${uefi_arch[$arch],,}/Shell_Full.efi" + "${work_dir}/loader/" "${pacstrap_dir}/boot/vmlinuz-"* "${pacstrap_dir}/boot/initramfs-"*".img" "${_available_ucodes[@]}") - efiboot_imgsize="$(du -bcs -- "${efiboot_files[@]}" 2>/dev/null | awk 'END { print $1 }')" + + # Files specific to x86_64: IA32 UEFI binaries for mixed mode booting, memtest86+ + if [[ "$arch" == 'x86_64' ]]; then + efiboot_files+=("${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootia32.efi" + "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" + "${pacstrap_dir}/boot/memtest86+/memtest.efi" + "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt") + fi # Create a FAT image for the EFI system partition - _make_efibootimg "$efiboot_imgsize" -} + _make_efibootimg -_make_common_bootmode_systemd-boot_conf() { - local _conf + # Additionally set up systemd-boot in ISO 9660. This allows creating a medium for the live environment by using + # manual partitioning and simply copying the ISO 9660 file system contents. + # This is not related to El Torito booting and no firmware uses these files. + install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" - install -d -m 0755 -- "${work_dir}/loader" "${work_dir}/loader/entries" - - install -m 0644 -- "${profile}/efiboot/loader/loader.conf" "${work_dir}/loader" - for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do - sed "s|%ARCHISO_LABEL%|${iso_label}|g; - s|%ARCHISO_UUID%|${iso_uuid}|g; - s|%INSTALL_DIR%|${install_dir}|g; - s|%ARCH%|${arch}|g" \ - "${_conf}" >"${work_dir}/loader/entries/${_conf##*/}" - done -} - -# Copy systemd-boot configuration files to ISO 9660 -_make_common_bootmode_systemd-boot_conf.isofs() { - cp -r --remove-destination -- "${work_dir}/loader" "${isofs_dir}/" -} - -# Copy systemd-boot configuration files to FAT image -_make_common_bootmode_systemd-boot_conf.esp() { + # Copy systemd-boot configuration files mcopy -i "${efibootimg}" -s "${work_dir}/loader" ::/ -} + cp -r --remove-destination -- "${work_dir}/loader" "${isofs_dir}/" -# Prepare systemd-boot for booting when written to a disk (isohybrid) -_make_bootmode_uefi-x64.systemd-boot.esp() { - _msg_info "Setting up systemd-boot for x64 UEFI booting..." - - # Prepare configuration files - _run_once _make_common_bootmode_systemd-boot_conf - - # Prepare a FAT image for the EFI system partition - _run_once _make_common_bootmode_systemd-boot - - # Copy systemd-boot EFI binary to the default/fallback boot path - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/BOOTx64.EFI - - # Copy systemd-boot configuration files - _run_once _make_common_bootmode_systemd-boot_conf.esp - - # shellx64.efi is picked up automatically when on / - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ::/shellx64.efi - fi - - # Copy Memtest86+ - if [[ -e "${pacstrap_dir}/boot/memtest86+/memtest.efi" ]]; then - mmd -i "${efibootimg}" ::/boot ::/boot/memtest86+ - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/boot/memtest86+/memtest.efi" ::/boot/memtest86+/ - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" ::/boot/memtest86+/LICENSE + # Copy EFI binaries and related files + _make_common_bootmode_uefi.systemd-boot_copy_files "${uefi_arch[$arch]}" + # Set up mixed mode booting for x86_64 systems with IA32 UEFI + if [[ "$arch" == 'x86_64' ]]; then + _make_common_bootmode_uefi.systemd-boot_copy_files 'IA32' fi # Copy kernel and initramfs to FAT image. # systemd-boot can only access files from the EFI system partition it was launched from. _run_once _make_boot_on_fat - _msg_info "Done! systemd-boot set up for x64 UEFI booting successfully." + _msg_info "Done! systemd-boot set up for UEFI booting successfully." } - -# Prepare systemd-boot for El Torito booting +# Deprecated boot modes _make_bootmode_uefi-x64.systemd-boot.eltorito() { - # Prepare configuration files - _run_once _make_common_bootmode_systemd-boot_conf - - # El Torito UEFI boot requires an image containing the EFI system partition. - # uefi-x64.systemd-boot.eltorito has the same requirements as uefi-x64.systemd-boot.esp - _run_once _make_bootmode_uefi-x64.systemd-boot.esp - - # Additionally set up systemd-boot in ISO 9660. This allows creating a medium for the live environment by using - # manual partitioning and simply copying the ISO 9660 file system contents. - # This is not related to El Torito booting and no firmware uses these files. - _msg_info "Preparing an /EFI directory for the ISO 9660 file system..." - install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" - - # Copy systemd-boot EFI binary to the default/fallback boot path - install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \ - "${isofs_dir}/EFI/BOOT/BOOTx64.EFI" - - # Copy systemd-boot configuration files - _run_once _make_common_bootmode_systemd-boot_conf.isofs - - # edk2-shell based UEFI shell - # shellx64.efi is picked up automatically when on / - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then - install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" "${isofs_dir}/shellx64.efi" - fi - - # Copy Memtest86+ - if [[ -e "${pacstrap_dir}/boot/memtest86+/memtest.efi" ]]; then - install -d -m 0755 -- "${isofs_dir}/boot/memtest86+/" - install -m 0644 -- "${pacstrap_dir}/boot/memtest86+/memtest.efi" "${isofs_dir}/boot/memtest86+/memtest.efi" - install -m 0644 -- "${pacstrap_dir}/usr/share/licenses/spdx/GPL-2.0-only.txt" "${isofs_dir}/boot/memtest86+/LICENSE" - fi - - _msg_info "Done!" + return 1 } - -_make_bootmode_uefi-ia32.systemd-boot.esp() { - _msg_info "Setting up systemd-boot for IA32 UEFI booting..." - - # Prepare configuration files - _run_once _make_common_bootmode_systemd-boot_conf - - # Prepare a FAT image for the EFI system partition - _run_once _make_common_bootmode_systemd-boot - - # Copy systemd-boot EFI binary to the default/fallback boot path - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootia32.efi" ::/EFI/BOOT/BOOTIA32.EFI - - # Copy systemd-boot configuration files - _run_once _make_common_bootmode_systemd-boot_conf.esp - - # shellia32.efi is picked up automatically when on / - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ]]; then - mcopy -i "${efibootimg}" \ - "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ::/shellia32.efi - fi - - # Copy kernel and initramfs to FAT image. - # systemd-boot can only access files from the EFI system partition it was launched from. - _run_once _make_boot_on_fat - - _msg_info "Done! systemd-boot set up for IA32 UEFI booting successfully." +_make_bootmode_uefi-x64.systemd-boot.esp() { + return 1 } - _make_bootmode_uefi-ia32.systemd-boot.eltorito() { - # Prepare configuration files - _run_once _make_common_bootmode_systemd-boot_conf - - # El Torito UEFI boot requires an image containing the EFI system partition. - # uefi-ia32.systemd-boot.eltorito has the same requirements as uefi-ia32.systemd-boot.esp - _run_once _make_bootmode_uefi-ia32.systemd-boot.esp - - # Additionally set up systemd-boot in ISO 9660. This allows creating a medium for the live environment by using - # manual partitioning and simply copying the ISO 9660 file system contents. - # This is not related to El Torito booting and no firmware uses these files. - _msg_info "Preparing an /EFI directory for the ISO 9660 file system..." - install -d -m 0755 -- "${isofs_dir}/EFI/BOOT" - - # Copy systemd-boot EFI binary to the default/fallback boot path - install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootia32.efi" \ - "${isofs_dir}/EFI/BOOT/BOOTIA32.EFI" - - # Copy systemd-boot configuration files - _run_once _make_common_bootmode_systemd-boot_conf.isofs - - # edk2-shell based UEFI shell - # shellia32.efi is picked up automatically when on / - if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" ]]; then - install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/ia32/Shell_Full.efi" "${isofs_dir}/shellia32.efi" - fi - - _msg_info "Done!" + return 1 +} +_make_bootmode_uefi-ia32.systemd-boot.esp() { + return 1 } -_validate_requirements_bootmode_bios.syslinux.mbr() { - # bios.syslinux.mbr requires bios.syslinux.eltorito - # shellcheck disable=SC2076 - if [[ ! " ${bootmodes[*]} " =~ ' bios.syslinux.eltorito ' ]]; then +_validate_requirements_bootmode_bios.syslinux() { + # Check if the architecture supports BIOS booting + if [[ "$arch" != @('x86_64'|'i686') ]]; then (( validation_error=validation_error+1 )) - _msg_error "Using 'bios.syslinux.mbr' boot mode without 'bios.syslinux.eltorito' is not supported." 0 + _msg_error "Validating '${bootmode}': BIOS boot modes are not supported on the '${arch}' architecture!" 0 fi # Check if the syslinux package is in the package list @@ -1095,7 +964,23 @@ _validate_requirements_bootmode_bios.syslinux.eltorito() { _validate_requirements_bootmode_bios.syslinux.mbr } -_validate_requirements_common_systemd-boot() { +_validate_requirements_bootmode_bios.syslinux.mbr() { + _msg_warning "The '${bootmode}' boot mode is deprecated. Use 'bios.syslinux' instead." + _remove_deprecated_boot_mode + # shellcheck disable=SC2076 + if [[ ! " ${bootmodes[*]} " =~ ' bios.syslinux ' ]]; then + bootmodes+=('bios.syslinux') + _validate_requirements_bootmode_bios.syslinux + fi +} + +_validate_common_requirements_bootmode_uefi() { + # Check if the architecture supports UEFI + if [[ ! -v uefi_arch["$arch"] ]]; then + (( validation_error=validation_error+1 )) + _msg_error "Validating '${bootmode}': UEFI boot modes are not supported on the '${arch}' architecture!" 0 + fi + # Check if mkfs.fat is available if ! command -v mkfs.fat &>/dev/null; then (( validation_error=validation_error+1 )) @@ -1108,6 +993,25 @@ _validate_requirements_common_systemd-boot() { _msg_error "Validating '${bootmode}': mmd and/or mcopy are not available on this host. Install 'mtools'!" 0 fi + # Check for optional packages + # shellcheck disable=SC2076 + if [[ ! " ${pkg_list[*]} " =~ ' edk2-shell ' ]]; then + _msg_info "'edk2-shell' is not in the package list. The ISO will not contain a bootable UEFI shell." + fi + # shellcheck disable=SC2076 + if [[ "$arch" == 'x86_64' && ! " ${pkg_list[*]} " =~ ' memtest86+-efi ' ]]; then + _msg_info "Validating '${bootmode}': 'memtest86+-efi' is not in the package list. Memory testing will not be available from the UEFI boot loader." + fi +} + +_validate_requirements_bootmode_uefi.systemd-boot() { + _validate_common_requirements_bootmode_uefi + + # shellcheck disable=SC2076 + if [[ " ${bootmodes[*]} " =~ ' uefi.grub ' ]]; then + _msg_error "Validating '${bootmode}': cannot be used with the 'uefi.grub' bootmode!" 0 + fi + # Check if systemd-boot configuration files exist if [[ ! -d "${profile}/efiboot/loader/entries" ]]; then (( validation_error=validation_error+1 )) @@ -1127,82 +1031,37 @@ _validate_requirements_common_systemd-boot() { fi done fi - - # Check for optional packages - # shellcheck disable=SC2076 - if [[ ! " ${pkg_list[*]} " =~ ' edk2-shell ' ]]; then - _msg_info "'edk2-shell' is not in the package list. The ISO will not contain a bootable UEFI shell." - fi } _validate_requirements_bootmode_uefi-x64.systemd-boot.esp() { + _msg_warning "The '${bootmode}' boot mode is deprecated. Use 'uefi.systemd-boot' instead." + _remove_deprecated_boot_mode # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.grub.esp ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-x64.grub.esp!" 0 - fi - _validate_requirements_common_systemd-boot - - # shellcheck disable=SC2076 - if [[ ! " ${pkg_list[*]} " =~ ' memtest86+-efi ' ]]; then - _msg_info "Validating '${bootmode}': 'memtest86+-efi' is not in the package list. Memory testing will not be available from systemd-boot." + if [[ ! " ${bootmodes[*]} " =~ ' uefi.systemd-boot ' ]]; then + bootmodes+=('uefi.systemd-boot') + _validate_requirements_bootmode_uefi.systemd-boot fi } _validate_requirements_bootmode_uefi-x64.systemd-boot.eltorito() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.grub.eltorito ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-x64.grub.eltorito!" 0 - fi - # uefi-x64.systemd-boot.eltorito has the exact same requirements as uefi-x64.systemd-boot.esp _validate_requirements_bootmode_uefi-x64.systemd-boot.esp } - _validate_requirements_bootmode_uefi-ia32.systemd-boot.esp() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-ia32.grub.esp ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-ia32.grub.esp!" 0 - fi - - _validate_requirements_common_systemd-boot + # uefi-ia32.systemd-boot.esp has the exact same requirements as uefi-x64.systemd-boot.esp + _validate_requirements_bootmode_uefi-x64.systemd-boot.esp } - _validate_requirements_bootmode_uefi-ia32.systemd-boot.eltorito() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-ia32.grub.eltorito ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-ia32.grub.eltorito!" 0 - fi - - # uefi-ia32.systemd-boot.eltorito has the exact same requirements as uefi-ia32.systemd-boot.esp - _validate_requirements_bootmode_uefi-ia32.systemd-boot.esp + # uefi-ia32.systemd-boot.eltorito has the exact same requirements as uefi-x64.systemd-boot.esp + _validate_requirements_bootmode_uefi-x64.systemd-boot.esp } -_validate_requirements_bootmode_uefi-ia32.grub.esp() { - # Check if GRUB is available - if ! command -v grub-mkstandalone &>/dev/null; then - (( validation_error=validation_error+1 )) - _msg_error "Validating '${bootmode}': grub-install is not available on this host. Install 'grub'!" 0 - fi +_validate_requirements_bootmode_uefi.grub() { + _validate_common_requirements_bootmode_uefi # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.esp ' ]]; then - _validate_requirements_bootmode_uefi-x64.systemd-boot.esp - elif [[ " ${bootmodes[*]} " =~ ' uefi-x64.grub.esp ' ]]; then - _validate_requirements_bootmode_uefi-x64.grub.esp - else - _msg_error "Validating '${bootmode}': requires one of bootmode uefi-x64.systemd-boot.esp or uefi-x64.grub.esp" 0 - fi -} - -_validate_requirements_bootmode_uefi-ia32.grub.eltorito() { - # uefi-ia32.grub.eltorito has the exact same requirements as uefi-ia32.grub.esp - _validate_requirements_bootmode_uefi-ia32.grub.esp -} - -_validate_requirements_bootmode_uefi-x64.grub.esp() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.esp ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-x64.systemd-boot.esp!" 0 + if [[ " ${bootmodes[*]} " =~ ' uefi.systemd-boot ' ]]; then + _msg_error "Validating '${bootmode}': cannot be used with the 'uefi.systemd-boot' bootmode!" 0 fi # Check if GRUB is available @@ -1211,17 +1070,6 @@ _validate_requirements_bootmode_uefi-x64.grub.esp() { _msg_error "Validating '${bootmode}': grub-install is not available on this host. Install 'grub'!" 0 fi - # Check if mkfs.fat is available - if ! command -v mkfs.fat &>/dev/null; then - (( validation_error=validation_error+1 )) - _msg_error "Validating '${bootmode}': mkfs.fat is not available on this host. Install 'dosfstools'!" 0 - fi - - # Check if mmd and mcopy are available - if ! { command -v mmd &>/dev/null && command -v mcopy &>/dev/null; }; then - _msg_error "Validating '${bootmode}': mmd and/or mcopy are not available on this host. Install 'mtools'!" 0 - fi - # Check if GRUB configuration files exist if [[ ! -d "${profile}/grub" ]]; then (( validation_error=validation_error+1 )) @@ -1241,27 +1089,46 @@ _validate_requirements_bootmode_uefi-x64.grub.esp() { fi done fi - - # Check for optional packages - # shellcheck disable=SC2076 - if [[ ! " ${pkg_list[*]} " =~ ' edk2-shell ' ]]; then - _msg_info "'edk2-shell' is not in the package list. The ISO will not contain a bootable UEFI shell." - fi - # shellcheck disable=SC2076 - if [[ ! " ${pkg_list[*]} " =~ ' memtest86+-efi ' ]]; then - _msg_info "Validating '${bootmode}': 'memtest86+-efi' is not in the package list. Memory testing will not be available from GRUB." - fi } -_validate_requirements_bootmode_uefi-x64.grub.eltorito() { +_validate_requirements_bootmode_uefi-ia32.grub.esp() { + # uefi-ia32.grub.esp has the exact same requirements as uefi-x64.grub.esp + _validate_requirements_bootmode_uefi-x64.grub.esp +} +_validate_requirements_bootmode_uefi-ia32.grub.eltorito() { + # uefi-ia32.grub.eltorito has the exact same requirements as uefi-x64.grub.esp + _validate_requirements_bootmode_uefi-x64.grub.esp +} +_validate_requirements_bootmode_uefi-x64.grub.esp() { + _msg_warning "The '${bootmode}' boot mode is deprecated. Use 'uefi.grub' instead." + _remove_deprecated_boot_mode # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.eltorito ' ]]; then - _msg_error "Validating '${bootmode}': cannot be used with bootmode uefi-x64.systemd-boot.eltorito!" 0 + if [[ ! " ${bootmodes[*]} " =~ ' uefi.grub ' ]]; then + bootmodes+=('uefi.grub') + _validate_requirements_bootmode_uefi.grub fi +} +_validate_requirements_bootmode_uefi-x64.grub.eltorito() { # uefi-x64.grub.eltorito has the exact same requirements as uefi-x64.grub.esp _validate_requirements_bootmode_uefi-x64.grub.esp } +# Remove deprecated boot mode from the bootmodes array +_remove_deprecated_boot_mode() { + local -i bootmodes_index + + # Find the array index of the deprecated boot mode + for bootmodes_index in "${!bootmodes[@]}"; do + if [[ "$bootmode" == "${bootmodes[${bootmodes_index}]}" ]]; then + # Remove the deprecated boot mode + unset "bootmodes[${bootmodes_index}]" + # Reindex the array + bootmodes=("${bootmodes[@]}") + break + fi + done +} + # Build airootfs filesystem image _prepare_airootfs_image() { _run_once "_mkairootfs_${airootfs_image_type}" @@ -1515,8 +1382,8 @@ _validate_requirements_buildmode_netboot() { _validate_common_requirements_buildmode_all } -# SYSLINUX El Torito -_add_xorrisofs_options_bios.syslinux.eltorito() { +# SYSLINUX MBR (isohybrid) and El Torito +_add_xorrisofs_options_bios.syslinux() { xorrisofs_options+=( # El Torito boot image for x86 BIOS '-eltorito-boot' 'boot/syslinux/isolinux.bin' @@ -1524,12 +1391,6 @@ _add_xorrisofs_options_bios.syslinux.eltorito() { '-eltorito-catalog' 'boot/syslinux/boot.cat' # Required options to boot with ISOLINUX '-no-emul-boot' '-boot-load-size' '4' '-boot-info-table' - ) -} - -# SYSLINUX MBR (isohybrid) -_add_xorrisofs_options_bios.syslinux.mbr() { - xorrisofs_options+=( # SYSLINUX MBR bootstrap code; does not work without "-eltorito-boot syslinux/isolinux.bin" '-isohybrid-mbr' "${isofs_dir}/boot/syslinux/isohdpfx.bin" # When GPT is used, create an additional partition in the MBR (besides 0xEE) for sectors 0–1 (MBR @@ -1544,27 +1405,8 @@ _add_xorrisofs_options_bios.syslinux.mbr() { ) } -# GRUB in an attached EFI system partition -_add_xorrisofs_options_uefi-ia32.grub.esp() { - # TODO: how does the bootmodes systemd-boot vs x64.grub affect ${bootmodes[*]} tests in _add_xorrisofs_options_uefi-x64.systemd-boot.esp etc? - # shellcheck disable=SC2076 - if [[ ! " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.esp ' && ! " ${bootmodes[*]} " =~ ' uefi-x64.grub.esp ' ]]; then - # _add_xorrisofs_options_uefi-x64.systemd-boot.esp - _add_xorrisofs_options_uefi-x64.grub.esp - fi -} - -# GRUB via El Torito -_add_xorrisofs_options_uefi-ia32.grub.eltorito() { - # shellcheck disable=SC2076 - if [[ ! " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.eltorito ' && ! " ${bootmodes[*]} " =~ ' uefi-x64.grub.eltorito ' ]]; then - # _add_xorrisofs_options_uefi-x64.systemd-boot.eltorito - _add_xorrisofs_options_uefi-x64.grub.eltorito - fi -} - -# systemd-boot in an attached EFI system partition -_add_xorrisofs_options_uefi-x64.systemd-boot.esp() { +# UEFI boot loader in an attached EFI system partition and El Torito +_add_common_xorrisofs_options_uefi() { # Move the first partition away from the start of the ISO, otherwise the GPT will not be valid and ISO 9660 # partition will not be mountable # shellcheck disable=SC2076 @@ -1573,136 +1415,39 @@ _add_xorrisofs_options_uefi-x64.systemd-boot.esp() { xorrisofs_options+=('-append_partition' '2' 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B' "${efibootimg}") # Ensure GPT is used as some systems do not support UEFI booting without it # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' bios.syslinux.mbr ' ]]; then - # A valid GPT prevents BIOS booting on some systems, instead use an invalid GPT (without a protective MBR). - # The attached partition will have the EFI system partition type code in MBR, but in the invalid GPT it will - # have a Microsoft basic partition type code. - if [[ ! " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.eltorito ' && ! " ${bootmodes[*]} " =~ ' uefi-ia32.grub.eltorito ' ]]; then - # If '-isohybrid-gpt-basdat' is specified before '-e', then the appended EFI system partition will have the - # EFI system partition type ID/GUID in both MBR and GPT. If '-isohybrid-gpt-basdat' is specified after '-e', - # the appended EFI system partition will have the Microsoft basic data type GUID in GPT. - if [[ ! " ${xorrisofs_options[*]} " =~ ' -isohybrid-gpt-basdat ' ]]; then - xorrisofs_options+=('-isohybrid-gpt-basdat') - fi - fi - else + if [[ ! " ${bootmodes[*]} " =~ ' bios.syslinux ' ]]; then # Use valid GPT if BIOS booting support will not be required xorrisofs_options+=('-appended_part_as_gpt') - fi -} - -# systemd-boot via El Torito -_add_xorrisofs_options_uefi-x64.systemd-boot.eltorito() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.systemd-boot.esp ' || " ${bootmodes[*]} " =~ ' uefi-ia32.grub.esp ' ]]; then - # systemd-boot in an attached EFI system partition via El Torito - xorrisofs_options+=( - # Start a new El Torito boot entry for UEFI - '-eltorito-alt-boot' - # Set the second partition as the El Torito UEFI boot image - '-e' '--interval:appended_partition_2:all::' - # Boot image is not emulating floppy or hard disk; required for all known boot loaders - '-no-emul-boot' - ) - # A valid GPT prevents BIOS booting on some systems, use an invalid GPT instead. - if [[ " ${bootmodes[*]} " =~ ' bios.syslinux.mbr ' ]]; then - # If '-isohybrid-gpt-basdat' is specified before '-e', then the appended EFI system partition will have the - # EFI system partition type ID/GUID in both MBR and GPT. If '-isohybrid-gpt-basdat' is specified after '-e', - # the appended EFI system partition will have the Microsoft basic data type GUID in GPT. - if [[ ! " ${xorrisofs_options[*]} " =~ ' -isohybrid-gpt-basdat ' ]]; then - xorrisofs_options+=('-isohybrid-gpt-basdat') - fi - fi else - # The ISO will not contain a GPT partition table, so to be able to reference efiboot.img, place it as a - # file inside the ISO 9660 file system - install -d -m 0755 -- "${isofs_dir}/EFI/archiso" - cp -a -- "${efibootimg}" "${isofs_dir}/EFI/archiso/efiboot.img" - # systemd-boot in an embedded efiboot.img via El Torito - xorrisofs_options+=( - # Start a new El Torito boot entry for UEFI - '-eltorito-alt-boot' - # Set efiboot.img as the El Torito UEFI boot image - '-e' 'EFI/archiso/efiboot.img' - # Boot image is not emulating floppy or hard disk; required for all known boot loaders - '-no-emul-boot' - ) + # A valid GPT prevents BIOS booting on some systems, use an invalid GPT instead. + # If '-isohybrid-gpt-basdat' is specified before '-e', then the appended EFI system partition will have the + # EFI system partition type ID/GUID in both MBR and GPT. If '-isohybrid-gpt-basdat' is specified after '-e', + # the appended EFI system partition will have the Microsoft basic data type GUID in GPT. + xorrisofs_options+=('-isohybrid-gpt-basdat') fi - # Specify where to save the El Torito boot catalog file in case it is not already set by bios.syslinux.eltorito + # systemd-boot in an attached EFI system partition via El Torito + xorrisofs_options+=( + # Start a new El Torito boot entry for UEFI + '-eltorito-alt-boot' + # Set the second partition as the El Torito UEFI boot image + '-e' '--interval:appended_partition_2:all::' + # Boot image is not emulating floppy or hard disk; required for all known boot loaders + '-no-emul-boot' + ) + + # Specify where to save the El Torito boot catalog file in case it is not already set by bios.syslinux # shellcheck disable=SC2076 [[ " ${bootmodes[*]} " =~ ' bios.' ]] || xorrisofs_options+=('-eltorito-catalog' 'EFI/boot.cat') } -# GRUB in an attached EFI system partition. -# Same as _add_xorrisofs_options_uefi-x64.systemd-boot.esp. -_add_xorrisofs_options_uefi-x64.grub.esp() { - # Move the first partition away from the start of the ISO, otherwise the GPT will not be valid and ISO 9660 - # partition will not be mountable - # shellcheck disable=SC2076 - [[ " ${xorrisofs_options[*]} " =~ ' -partition_offset ' ]] || xorrisofs_options+=('-partition_offset' '16') - # Attach efiboot.img as a second partition and set its partition type to "EFI system partition" - xorrisofs_options+=('-append_partition' '2' 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B' "${efibootimg}") - # Ensure GPT is used as some systems do not support UEFI booting without it - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' bios.syslinux.mbr ' ]]; then - # A valid GPT prevents BIOS booting on some systems, instead use an invalid GPT (without a protective MBR). - # The attached partition will have the EFI system partition type code in MBR, but in the invalid GPT it will - # have a Microsoft basic partition type code. - if [[ ! " ${bootmodes[*]} " =~ ' uefi-x64.grub.eltorito ' && ! " ${bootmodes[*]} " =~ ' uefi-ia32.grub.eltorito ' ]]; then - # If '-isohybrid-gpt-basdat' is specified before '-e', then the appended EFI system partition will have the - # EFI system partition type ID/GUID in both MBR and GPT. If '-isohybrid-gpt-basdat' is specified after '-e', - # the appended EFI system partition will have the Microsoft basic data type GUID in GPT. - if [[ ! " ${xorrisofs_options[*]} " =~ ' -isohybrid-gpt-basdat ' ]]; then - xorrisofs_options+=('-isohybrid-gpt-basdat') - fi - fi - else - # Use valid GPT if BIOS booting support will not be required - xorrisofs_options+=('-appended_part_as_gpt') - fi +# systemd-boot in an attached EFI system partition and El Torito +_add_xorrisofs_options_uefi.systemd-boot() { + _add_common_xorrisofs_options_uefi } -# GRUB via El Torito -# Same as _add_xorrisofs_options_uefi-x64.systemd-boot.eltorito. -_add_xorrisofs_options_uefi-x64.grub.eltorito() { - # shellcheck disable=SC2076 - if [[ " ${bootmodes[*]} " =~ ' uefi-x64.grub.esp ' || " ${bootmodes[*]} " =~ ' uefi-ia32.grub.esp ' ]]; then - # grub in an attached EFI system partition via El Torito - xorrisofs_options+=( - # Start a new El Torito boot entry for UEFI - '-eltorito-alt-boot' - # Set the second partition as the El Torito UEFI boot image - '-e' '--interval:appended_partition_2:all::' - # Boot image is not emulating floppy or hard disk; required for all known boot loaders - '-no-emul-boot' - ) - # A valid GPT prevents BIOS booting on some systems, use an invalid GPT instead. - if [[ " ${bootmodes[*]} " =~ ' bios.syslinux.mbr ' ]]; then - # If '-isohybrid-gpt-basdat' is specified before '-e', then the appended EFI system partition will have the - # EFI system partition type ID/GUID in both MBR and GPT. If '-isohybrid-gpt-basdat' is specified after '-e', - # the appended EFI system partition will have the Microsoft basic data type GUID in GPT. - if [[ ! " ${xorrisofs_options[*]} " =~ ' -isohybrid-gpt-basdat ' ]]; then - xorrisofs_options+=('-isohybrid-gpt-basdat') - fi - fi - else - # The ISO will not contain a GPT partition table, so to be able to reference efiboot.img, place it as a - # file inside the ISO 9660 file system - install -d -m 0755 -- "${isofs_dir}/EFI/archiso" - cp -a -- "${efibootimg}" "${isofs_dir}/EFI/archiso/efiboot.img" - # grub in an embedded efiboot.img via El Torito - xorrisofs_options+=( - # Start a new El Torito boot entry for UEFI - '-eltorito-alt-boot' - # Set efiboot.img as the El Torito UEFI boot image - '-e' 'EFI/archiso/efiboot.img' - # Boot image is not emulating floppy or hard disk; required for all known boot loaders - '-no-emul-boot' - ) - fi - # Specify where to save the El Torito boot catalog file in case it is not already set by bios.syslinux.eltorito - # shellcheck disable=SC2076 - [[ " ${bootmodes[*]} " =~ ' bios.' ]] || xorrisofs_options+=('-eltorito-catalog' 'EFI/boot.cat') +# GRUB in an attached EFI system partition and El Torito +_add_xorrisofs_options_uefi.grub() { + _add_common_xorrisofs_options_uefi } # Build bootstrap image @@ -1718,7 +1463,8 @@ _build_bootstrap_image() { _msg_info "Creating bootstrap image..." rm -f -- "${out_dir:?}/${image_name:?}" - bsdtar -cf - "root.${arch}" "pkglist.${arch}.txt" | "${bootstrap_tarball_compression[@]}" >"${out_dir}/${image_name}" + bsdtar -cf - "root.${arch}" "pkglist.${arch}.txt" 'version' \ + | "${bootstrap_tarball_compression[@]}" >"${out_dir}/${image_name}" _msg_info "Done!" du -h -- "${out_dir}/${image_name}" cd -- "${OLDPWD}" @@ -1797,16 +1543,17 @@ _read_profile() { # Resolve paths of files that are expected to reside in the profile's directory [[ -n "$arch" ]] || arch="$(uname -m)" - [[ -n "$packages" ]] || packages="${profile}/packages.${arch}" - packages="$(realpath -- "${packages}")" - pacman_conf="$(realpath -- "${pacman_conf}")" - - # Resolve paths of files that may reside in the profile's directory - if [[ -z "$bootstrap_packages" ]] && [[ -e "${profile}/bootstrap_packages.${arch}" ]]; then - bootstrap_packages="${profile}/bootstrap_packages.${arch}" - bootstrap_packages="$(realpath -- "${bootstrap_packages}")" - pacman_conf="$(realpath -- "${pacman_conf}")" + # Use "packages" if it exists but "packages.${arch}" does not + if [[ -z "$packages" && ! -e "${profile}/packages.${arch}" && -e "${profile}/packages" ]]; then + packages="${profile}/packages" fi + packages="$(realpath -- "${packages:-${profile}/packages.${arch}}")" + # Use "bootstrap_packages" if it exists but "bootstrap_packages.${arch}" does not + if [[ -z "$bootstrap_packages" && ! -e "${profile}/bootstrap_packages.${arch}" && -e "${profile}/bootstrap_packages" ]]; then + bootstrap_packages="${profile}/bootstrap_packages" + fi + bootstrap_packages="$(realpath -- "${bootstrap_packages:-${profile}/bootstrap_packages.${arch}}")" + pacman_conf="$(realpath -- "${pacman_conf}")" cd -- "${OLDPWD}" fi @@ -1929,15 +1676,19 @@ _make_version() { local _os_release _msg_info "Creating version files..." - # Write version file to system installation dir - rm -f -- "${pacstrap_dir}/version" - printf '%s\n' "${iso_version}" >"${pacstrap_dir}/version" if [[ "${buildmode}" == @("iso"|"netboot") ]]; then + # Write version file to system installation dir + rm -f -- "${pacstrap_dir}/version" + printf '%s\n' "${iso_version}" >"${pacstrap_dir}/version" + install -d -m 0755 -- "${isofs_dir}/${install_dir}" # Write version file to ISO 9660 printf '%s\n' "${iso_version}" >"${isofs_dir}/${install_dir}/version" - + elif [[ "${buildmode}" == 'bootstrap' ]]; then + # Write version file to the root of the tarball + rm -f -- "${bootstrap_parent}/version" + printf '%s\n' "${iso_version}" >"${bootstrap_parent}/version" fi if [[ "${buildmode}" == "iso" ]]; then # Write a limited grubenv with version information to install_dir on ISO 9660 for use cases where only the @@ -2024,10 +1775,13 @@ _build_iso_base() { _run_once _make_version _run_once _make_customize_airootfs _run_once _make_pkglist - _run_once _check_if_initramfs_has_ucode - if [[ "${buildmode}" == 'netboot' ]]; then - _run_once _make_boot_on_iso9660 - else + if [[ "$arch" == @('x86_64'|'i686') ]]; then + _run_once _check_if_initramfs_has_ucode + fi + # Copy the kernel and initramfs to ISO 9660 for boot loaders that can read the ISO 9660 file system and also for + # UEFI-bootable installation medium creation via file system transposition. + _run_once _make_boot_on_iso9660 + if [[ "${buildmode}" != 'netboot' ]]; then _make_bootmodes fi _run_once _cleanup_pacstrap_dir @@ -2088,7 +1842,9 @@ _build_buildmode_netboot() { # Build the ISO buildmode _build_buildmode_iso() { +# change for EndeavourOS start local image_name="${iso_name}-${iso_version}.iso" +# change for EndeavourOS end local run_once_mode="${buildmode}" efibootimg="${work_dir}/efiboot.img" _build_iso_base diff --git a/mkarchiso-changes.md b/mkarchiso-changes.md index 454bb9b..5d12c36 100644 --- a/mkarchiso-changes.md +++ b/mkarchiso-changes.md @@ -1,3 +1,10 @@ +change on 2025.11.09: +remerge changes [bootmode changes, some config changed (updated), adds support for IA32-UEFI boots (forcingly)] +``` +Version archiso 87-1 +``` + + change on 2025.09.15: remerge changes, no code changes ``` diff --git a/packages.x86_64 b/packages.x86_64 index 5efa7cb..e9b77fe 100644 --- a/packages.x86_64 +++ b/packages.x86_64 @@ -233,6 +233,7 @@ plasma-browser-integration plasma-desktop plasma-disks plasma-firewall +plasma-keyboard plasma-nm plasma-pa plasma-x11-session diff --git a/profiledef.sh b/profiledef.sh index 11c9873..9be39f1 100644 --- a/profiledef.sh +++ b/profiledef.sh @@ -11,8 +11,7 @@ buildmodes=('iso') quiet="n" work_dir="work" out_dir="out" -bootmodes=('bios.syslinux.mbr' 'bios.syslinux.eltorito' 'uefi-x64.systemd-boot.esp' 'uefi-x64.systemd-boot.eltorito') - +bootmodes=('bios.syslinux' 'uefi.systemd-boot') arch="x86_64" pacman_conf="pacman.conf" airootfs_image_type="squashfs"