Merged in changes from master
This commit is contained in:
commit
7d60287a3d
|
|
@ -10,7 +10,7 @@ The installer also doubles as a python library to install Arch Linux and manage
|
||||||
|
|
||||||
* archinstall [discord](https://discord.gg/cqXU88y) server
|
* archinstall [discord](https://discord.gg/cqXU88y) server
|
||||||
* archinstall [matrix.org](https://app.element.io/#/room/#archinstall:matrix.org) channel
|
* archinstall [matrix.org](https://app.element.io/#/room/#archinstall:matrix.org) channel
|
||||||
* archinstall [#archinstall@freenode (IRC)](irc://#archinstall@FreeNode)
|
* archinstall [#archinstall@irc.libera.chat](irc://#archinstall@irc.libera.chat:6697)
|
||||||
* archinstall [documentation](https://python-archinstall.readthedocs.io/en/latest/index.html)
|
* archinstall [documentation](https://python-archinstall.readthedocs.io/en/latest/index.html)
|
||||||
|
|
||||||
# Installation & Usage
|
# Installation & Usage
|
||||||
|
|
@ -34,7 +34,7 @@ Prequisites:
|
||||||
|
|
||||||
Assuming you are on a Arch Linux live-ISO and booted into EFI mode.
|
Assuming you are on a Arch Linux live-ISO and booted into EFI mode.
|
||||||
|
|
||||||
# archinstall --config <path to config file or URL> [optional: --vars '<space_seperated KEY=VALUE pairs>']
|
# archinstall --config <path to config file or URL>
|
||||||
|
|
||||||
# Help?
|
# Help?
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,8 @@ from .lib.user_interaction import *
|
||||||
|
|
||||||
parser = ArgumentParser()
|
parser = ArgumentParser()
|
||||||
|
|
||||||
__version__ = "2.2.0.RC1"
|
__version__ = "2.3.0.dev0"
|
||||||
|
storage['__version__'] = __version__
|
||||||
|
|
||||||
|
|
||||||
def initialize_arguments():
|
def initialize_arguments():
|
||||||
|
|
@ -60,7 +61,10 @@ def initialize_arguments():
|
||||||
|
|
||||||
|
|
||||||
arguments = initialize_arguments()
|
arguments = initialize_arguments()
|
||||||
|
from .lib.plugins import plugins, load_plugin # This initiates the plugin loading ceremony
|
||||||
|
|
||||||
|
if arguments.get('plugin', None):
|
||||||
|
load_plugin(arguments['plugin'])
|
||||||
|
|
||||||
# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython)
|
# TODO: Learn the dark arts of argparse... (I summon thee dark spawn of cPython)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ def cpu_vendor() -> Optional[str]:
|
||||||
def is_vm() -> bool:
|
def is_vm() -> bool:
|
||||||
try:
|
try:
|
||||||
# systemd-detect-virt issues a non-zero exit code if it is not on a virtual machine
|
# systemd-detect-virt issues a non-zero exit code if it is not on a virtual machine
|
||||||
if b"".join(SysCommand("systemd-detect-virt")).lower() != b"none":
|
if b"none" not in b"".join(SysCommand("systemd-detect-virt")).lower():
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ from .hardware import *
|
||||||
from .locale_helpers import verify_keyboard_layout, verify_x11_keyboard_layout
|
from .locale_helpers import verify_keyboard_layout, verify_x11_keyboard_layout
|
||||||
from .mirrors import *
|
from .mirrors import *
|
||||||
from .storage import storage
|
from .storage import storage
|
||||||
|
from .plugins import plugins
|
||||||
from .user_interaction import *
|
from .user_interaction import *
|
||||||
|
|
||||||
# Any package that the Installer() is responsible for (optional and the default ones)
|
# Any package that the Installer() is responsible for (optional and the default ones)
|
||||||
|
|
@ -132,6 +133,12 @@ class Installer:
|
||||||
def pacstrap(self, *packages, **kwargs):
|
def pacstrap(self, *packages, **kwargs):
|
||||||
if type(packages[0]) in (list, tuple):
|
if type(packages[0]) in (list, tuple):
|
||||||
packages = packages[0]
|
packages = packages[0]
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_pacstrap'):
|
||||||
|
if (result := plugin.on_pacstrap(packages)):
|
||||||
|
packages = result
|
||||||
|
|
||||||
self.log(f'Installing packages: {packages}', level=logging.INFO)
|
self.log(f'Installing packages: {packages}', level=logging.INFO)
|
||||||
|
|
||||||
if (sync_mirrors := SysCommand('/usr/bin/pacman -Syy')).exit_code == 0:
|
if (sync_mirrors := SysCommand('/usr/bin/pacman -Syy')).exit_code == 0:
|
||||||
|
|
@ -143,6 +150,11 @@ class Installer:
|
||||||
self.log(f'Could not sync mirrors: {sync_mirrors.exit_code}', level=logging.INFO)
|
self.log(f'Could not sync mirrors: {sync_mirrors.exit_code}', level=logging.INFO)
|
||||||
|
|
||||||
def set_mirrors(self, mirrors):
|
def set_mirrors(self, mirrors):
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_mirrors'):
|
||||||
|
if result := plugin.on_mirrors(mirrors):
|
||||||
|
mirrors = result
|
||||||
|
|
||||||
return use_mirrors(mirrors, destination=f'{self.target}/etc/pacman.d/mirrorlist')
|
return use_mirrors(mirrors, destination=f'{self.target}/etc/pacman.d/mirrorlist')
|
||||||
|
|
||||||
def genfstab(self, flags='-pU'):
|
def genfstab(self, flags='-pU'):
|
||||||
|
|
@ -154,6 +166,10 @@ class Installer:
|
||||||
if not os.path.isfile(f'{self.target}/etc/fstab'):
|
if not os.path.isfile(f'{self.target}/etc/fstab'):
|
||||||
raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n{fstab}')
|
raise RequirementError(f'Could not generate fstab, strapping in packages most likely failed (disk out of space?)\n{fstab}')
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_genfstab'):
|
||||||
|
plugin.on_genfstab(self)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def set_hostname(self, hostname: str, *args, **kwargs):
|
def set_hostname(self, hostname: str, *args, **kwargs):
|
||||||
|
|
@ -177,6 +193,11 @@ class Installer:
|
||||||
if not len(zone):
|
if not len(zone):
|
||||||
return True # Redundant
|
return True # Redundant
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_timezone'):
|
||||||
|
if result := plugin.on_timezone(zone):
|
||||||
|
zone = result
|
||||||
|
|
||||||
if (pathlib.Path("/usr") / "share" / "zoneinfo" / zone).exists():
|
if (pathlib.Path("/usr") / "share" / "zoneinfo" / zone).exists():
|
||||||
(pathlib.Path(self.target) / "etc" / "localtime").unlink(missing_ok=True)
|
(pathlib.Path(self.target) / "etc" / "localtime").unlink(missing_ok=True)
|
||||||
SysCommand(f'/usr/bin/arch-chroot {self.target} ln -s /usr/share/zoneinfo/{zone} /etc/localtime')
|
SysCommand(f'/usr/bin/arch-chroot {self.target} ln -s /usr/share/zoneinfo/{zone} /etc/localtime')
|
||||||
|
|
@ -200,6 +221,10 @@ class Installer:
|
||||||
if (output := self.arch_chroot(f'systemctl enable {service}')).exit_code != 0:
|
if (output := self.arch_chroot(f'systemctl enable {service}')).exit_code != 0:
|
||||||
raise ServiceException(f"Unable to start service {service}: {output}")
|
raise ServiceException(f"Unable to start service {service}: {output}")
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_service'):
|
||||||
|
plugin.on_service(service)
|
||||||
|
|
||||||
def run_command(self, cmd, *args, **kwargs):
|
def run_command(self, cmd, *args, **kwargs):
|
||||||
return SysCommand(f'/usr/bin/arch-chroot {self.target} {cmd}')
|
return SysCommand(f'/usr/bin/arch-chroot {self.target} {cmd}')
|
||||||
|
|
||||||
|
|
@ -229,6 +254,11 @@ class Installer:
|
||||||
|
|
||||||
conf = Networkd(Match={"Name": nic}, Network=network)
|
conf = Networkd(Match={"Name": nic}, Network=network)
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_configure_nic'):
|
||||||
|
if (new_conf := plugin.on_configure_nic(nic, dhcp, ip, gateway, dns)):
|
||||||
|
conf = new_conf
|
||||||
|
|
||||||
with open(f"{self.target}/etc/systemd/network/10-{nic}.network", "a") as netconf:
|
with open(f"{self.target}/etc/systemd/network/10-{nic}.network", "a") as netconf:
|
||||||
netconf.write(str(conf))
|
netconf.write(str(conf))
|
||||||
|
|
||||||
|
|
@ -292,6 +322,12 @@ class Installer:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def mkinitcpio(self, *flags):
|
def mkinitcpio(self, *flags):
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_mkinitcpio'):
|
||||||
|
# Allow plugins to override the usage of mkinitcpio altogether.
|
||||||
|
if plugin.on_mkinitcpio(self):
|
||||||
|
return True
|
||||||
|
|
||||||
with open(f'{self.target}/etc/mkinitcpio.conf', 'w') as mkinit:
|
with open(f'{self.target}/etc/mkinitcpio.conf', 'w') as mkinit:
|
||||||
mkinit.write(f"MODULES=({' '.join(self.MODULES)})\n")
|
mkinit.write(f"MODULES=({' '.join(self.MODULES)})\n")
|
||||||
mkinit.write(f"BINARIES=({' '.join(self.BINARIES)})\n")
|
mkinit.write(f"BINARIES=({' '.join(self.BINARIES)})\n")
|
||||||
|
|
@ -366,9 +402,20 @@ class Installer:
|
||||||
self.log(f"Running post-installation hook: {function}", level=logging.INFO)
|
self.log(f"Running post-installation hook: {function}", level=logging.INFO)
|
||||||
function(self)
|
function(self)
|
||||||
|
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_install'):
|
||||||
|
plugin.on_install(self)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def add_bootloader(self, bootloader='systemd-bootctl'):
|
def add_bootloader(self, bootloader='systemd-bootctl'):
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_add_bootloader'):
|
||||||
|
# Allow plugins to override the boot-loader handling.
|
||||||
|
# This allows for bot configuring and installing bootloaders.
|
||||||
|
if plugin.on_add_bootloader(self):
|
||||||
|
return True
|
||||||
|
|
||||||
boot_partition = None
|
boot_partition = None
|
||||||
root_partition = None
|
root_partition = None
|
||||||
for partition in self.partitions:
|
for partition in self.partitions:
|
||||||
|
|
@ -487,8 +534,19 @@ class Installer:
|
||||||
def user_create(self, user: str, password=None, groups=None, sudo=False):
|
def user_create(self, user: str, password=None, groups=None, sudo=False):
|
||||||
if groups is None:
|
if groups is None:
|
||||||
groups = []
|
groups = []
|
||||||
self.log(f'Creating user {user}', level=logging.INFO)
|
|
||||||
o = b''.join(SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}'))
|
# This plugin hook allows for the plugin to handle the creation of the user.
|
||||||
|
# Password and Group management is still handled by user_create()
|
||||||
|
handled_by_plugin = False
|
||||||
|
for plugin in plugins.values():
|
||||||
|
if hasattr(plugin, 'on_user_create'):
|
||||||
|
if result := plugin.on_user_create(user):
|
||||||
|
handled_by_plugin = result
|
||||||
|
|
||||||
|
if not handled_by_plugin:
|
||||||
|
self.log(f'Creating user {user}', level=logging.INFO)
|
||||||
|
o = b''.join(SysCommand(f'/usr/bin/arch-chroot {self.target} useradd -m -G wheel {user}'))
|
||||||
|
|
||||||
if password:
|
if password:
|
||||||
self.user_set_pw(user, password)
|
self.user_set_pw(user, password)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
import hashlib
|
||||||
|
import importlib
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import pathlib
|
||||||
|
import urllib.parse
|
||||||
|
import urllib.request
|
||||||
|
from importlib import metadata
|
||||||
|
|
||||||
|
from .output import log
|
||||||
|
from .storage import storage
|
||||||
|
|
||||||
|
plugins = {}
|
||||||
|
|
||||||
|
# 1: List archinstall.plugin definitions
|
||||||
|
# 2: Load the plugin entrypoint
|
||||||
|
# 3: Initiate the plugin and store it as .name in plugins
|
||||||
|
for plugin_definition in metadata.entry_points()['archinstall.plugin']:
|
||||||
|
plugin_entrypoint = plugin_definition.load()
|
||||||
|
try:
|
||||||
|
plugins[plugin_definition.name] = plugin_entrypoint()
|
||||||
|
except Exception as err:
|
||||||
|
log(err, level=logging.ERROR)
|
||||||
|
log(f"The above error was detected when loading the plugin: {plugin_definition}", fg="red", level=logging.ERROR)
|
||||||
|
|
||||||
|
|
||||||
|
# The following functions and core are support structures for load_plugin()
|
||||||
|
def localize_path(profile_path :str) -> str:
|
||||||
|
if (url := urllib.parse.urlparse(profile_path)).scheme and url.scheme in ('https', 'http'):
|
||||||
|
converted_path = f"/tmp/{os.path.basename(profile_path).replace('.py', '')}_{hashlib.md5(os.urandom(12)).hexdigest()}.py"
|
||||||
|
|
||||||
|
with open(converted_path, "w") as temp_file:
|
||||||
|
temp_file.write(urllib.request.urlopen(url.geturl()).read().decode('utf-8'))
|
||||||
|
|
||||||
|
return converted_path
|
||||||
|
else:
|
||||||
|
return profile_path
|
||||||
|
|
||||||
|
|
||||||
|
def import_via_path(path :str, namespace=None): # -> module (not sure how to write that in type definitions)
|
||||||
|
if not namespace:
|
||||||
|
namespace = os.path.basename(path)
|
||||||
|
|
||||||
|
if namespace == '__init__.py':
|
||||||
|
path = pathlib.PurePath(path)
|
||||||
|
namespace = path.parent.name
|
||||||
|
|
||||||
|
try:
|
||||||
|
spec = importlib.util.spec_from_file_location(namespace, path)
|
||||||
|
imported = importlib.util.module_from_spec(spec)
|
||||||
|
sys.modules[namespace] = imported
|
||||||
|
spec.loader.exec_module(sys.modules[namespace])
|
||||||
|
|
||||||
|
return namespace
|
||||||
|
except Exception as err:
|
||||||
|
log(err, level=logging.ERROR)
|
||||||
|
log(f"The above error was detected when loading the plugin: {path}", fg="red", level=logging.ERROR)
|
||||||
|
|
||||||
|
try:
|
||||||
|
del(sys.modules[namespace])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def find_nth(haystack, needle, n):
|
||||||
|
start = haystack.find(needle)
|
||||||
|
while start >= 0 and n > 1:
|
||||||
|
start = haystack.find(needle, start+len(needle))
|
||||||
|
n -= 1
|
||||||
|
return start
|
||||||
|
|
||||||
|
def load_plugin(path :str): # -> module (not sure how to write that in type definitions)
|
||||||
|
parsed_url = urllib.parse.urlparse(path)
|
||||||
|
|
||||||
|
# The Profile was not a direct match on a remote URL
|
||||||
|
if not parsed_url.scheme:
|
||||||
|
# Path was not found in any known examples, check if it's an absolute path
|
||||||
|
if os.path.isfile(path):
|
||||||
|
namespace = import_via_path(path)
|
||||||
|
elif parsed_url.scheme in ('https', 'http'):
|
||||||
|
namespace = import_via_path(localize_path(path))
|
||||||
|
|
||||||
|
if namespace in sys.modules:
|
||||||
|
# Version dependency via __archinstall__version__ variable (if present) in the plugin
|
||||||
|
# Any errors in version inconsistency will be handled through normal error handling if not defined.
|
||||||
|
if hasattr(sys.modules[namespace], '__archinstall__version__'):
|
||||||
|
archinstall_major_and_minor_version = float(storage['__version__'][:find_nth(storage['__version__'], '.', 2)])
|
||||||
|
|
||||||
|
if sys.modules[namespace].__archinstall__version__ < archinstall_major_and_minor_version:
|
||||||
|
log(f"Plugin {sys.modules[namespace]} does not support the current Archinstall version.", fg="red", level=logging.ERROR)
|
||||||
|
|
||||||
|
# Locate the plugin entry-point called Plugin()
|
||||||
|
# This in accordance with the entry_points() from setup.cfg above
|
||||||
|
if hasattr(sys.modules[namespace], 'Plugin'):
|
||||||
|
try:
|
||||||
|
plugins[namespace] = sys.modules[namespace].Plugin()
|
||||||
|
except Exception as err:
|
||||||
|
log(err, level=logging.ERROR)
|
||||||
|
log(f"The above error was detected when initiating the plugin: {path}", fg="red", level=logging.ERROR)
|
||||||
|
else:
|
||||||
|
log(f"Plugin '{path}' is missing a valid entry-point or is corrupt.", fg="yellow", level=logging.WARNING)
|
||||||
|
|
@ -859,6 +859,7 @@ def select_profile():
|
||||||
|
|
||||||
print(' -- The above list is a set of pre-programmed profiles. --')
|
print(' -- The above list is a set of pre-programmed profiles. --')
|
||||||
print(' -- They might make it easier to install things like desktop environments. --')
|
print(' -- They might make it easier to install things like desktop environments. --')
|
||||||
|
print(' -- The desktop profile will let you select a DE/WM profile, e.g gnome, kde, sway --')
|
||||||
print(' -- (Leave blank and hit enter to skip this step and continue) --')
|
print(' -- (Leave blank and hit enter to skip this step and continue) --')
|
||||||
|
|
||||||
selected_profile = generic_select(actual_profiles_raw, 'Enter a pre-programmed profile name if you want to install one: ', options_output=False)
|
selected_profile = generic_select(actual_profiles_raw, 'Enter a pre-programmed profile name if you want to install one: ', options_output=False)
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,6 @@ python-archinstall Documentation
|
||||||
|
|
|
|
||||||
| A demo can be viewed here: `https://www.youtube.com/watch?v=9Xt7X_Iqg6E <https://www.youtube.com/watch?v=9Xt7X_Iqg6E>`_ which uses the default guided installer.
|
| A demo can be viewed here: `https://www.youtube.com/watch?v=9Xt7X_Iqg6E <https://www.youtube.com/watch?v=9Xt7X_Iqg6E>`_ which uses the default guided installer.
|
||||||
|
|
||||||
.. warning::
|
|
||||||
This installer currently requires that your machine has EFI-mode enabled.
|
|
||||||
|
|
||||||
Some of the features of Archinstall are:
|
Some of the features of Archinstall are:
|
||||||
|
|
||||||
* **No external dependencies or installation requirements.** Runs without any external requirements or installation processes.
|
* **No external dependencies or installation requirements.** Runs without any external requirements or installation processes.
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ And to run it, execute archinstall as a Python module:
|
||||||
| The ``--script guided`` argument is optional as it's the default behavior.
|
| The ``--script guided`` argument is optional as it's the default behavior.
|
||||||
| But this will start the process of guiding you through a installation of a quite minimal Arch Linux experience.
|
| But this will start the process of guiding you through a installation of a quite minimal Arch Linux experience.
|
||||||
|
|
||||||
Installing directly from a config file
|
Installing directly from a configuration file
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
@ -58,6 +58,7 @@ Installing directly from a config file
|
||||||
],
|
],
|
||||||
"!encryption-password": "supersecret",
|
"!encryption-password": "supersecret",
|
||||||
"filesystem": "btrfs",
|
"filesystem": "btrfs",
|
||||||
|
"gfx_driver": "VMware / VirtualBox (open-source)",
|
||||||
"harddrive": {
|
"harddrive": {
|
||||||
"path": "/dev/nvme0n1"
|
"path": "/dev/nvme0n1"
|
||||||
},
|
},
|
||||||
|
|
@ -66,14 +67,11 @@ Installing directly from a config file
|
||||||
"linux"
|
"linux"
|
||||||
],
|
],
|
||||||
"keyboard-language": "us",
|
"keyboard-language": "us",
|
||||||
"mirror-region": {
|
"mirror-region": "Worldwide",
|
||||||
"Worldwide": {
|
|
||||||
"https://mirror.rackspace.com/archlinux/$repo/os/$arch": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nic": {
|
"nic": {
|
||||||
"NetworkManager": true
|
"NetworkManager": true
|
||||||
},
|
},
|
||||||
|
"ntp": true,
|
||||||
"packages": ["docker", "git", "wget", "zsh"],
|
"packages": ["docker", "git", "wget", "zsh"],
|
||||||
"profile": "gnome",
|
"profile": "gnome",
|
||||||
"services": ["docker"],
|
"services": ["docker"],
|
||||||
|
|
@ -82,6 +80,8 @@ Installing directly from a config file
|
||||||
"!password": "devel"
|
"!password": "devel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"sys-encoding": "utf-8",
|
||||||
|
"sys-language": "en_US",
|
||||||
"timezone": "US/Eastern",
|
"timezone": "US/Eastern",
|
||||||
"users": {}
|
"users": {}
|
||||||
}
|
}
|
||||||
|
|
@ -92,46 +92,55 @@ To run it, execute archinstall as a Python module:
|
||||||
|
|
||||||
python -m archinstall --config <local path or remote URL>
|
python -m archinstall --config <local path or remote URL>
|
||||||
|
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| Key | Values/Description | Description | Required |
|
| Key | Values/Description | Description | Required |
|
||||||
| | | | |
|
| | | | |
|
||||||
+======================+========================================================+============================================================================+===============================================+
|
+======================+======================================================================================================================================+======================================================================================+===============================================+
|
||||||
| audio | pipewire/pulseaudio | Audioserver to be installed | No |
|
| audio | pipewire/pulseaudio | Audioserver to be installed | No |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| bootloader | systemd-bootctl/grub-install | Bootloader to be installed | Yes |
|
| bootloader | systemd-bootctl/grub-install | Bootloader to be installed | Yes |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| custom-commands | [ <command1>, <command2>, ...] | Custom commands to be run post install | No |
|
| custom-commands | [ <command1>, <command2>, ...] | Custom commands to be run post install | No |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| !encryption-password | any | Password to encrypt disk, not encrypted if password not provided | No |
|
| !encryption-password | any | Password to encrypt disk, not encrypted if password not provided | No |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| filesystem | ext4 / btrfs / fat32 etc. | Filesystem for root and home partitions | Yes |
|
| filesystem | ext4 / btrfs / fat32 etc. | Filesystem for root and home partitions | Yes |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
| harddrive | { "path": <path of device> } | Path of device to be used | Yes |
|
| gfx_driver | "VMware / VirtualBox (open-source)" or "Nvidia" or "Intel (open-source)" or "AMD / ATI (open-source)" or "All open-source (default)" | Graphics Drivers to install | No |
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| | | | |
|
||||||
| hostname | any | Hostname of machine after installation | Yes |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| harddrive | { "path": <path of device> } | Path of device to be used | Yes |
|
||||||
| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | Atleast 1 |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| hostname | any | Hostname of machine after installation | Yes |
|
||||||
| keyboard-language | 2 letter code for your keyboard language | eg: us, de etc | Yes |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| kernels | [ "kernel1", "kernel2"] | List of kernels to install eg: linux, linux-lts, linux-zen etc | Atleast 1 |
|
||||||
| mirror-region | {"<Region Name>": { "Mirror Name": True/False}, ..} | List of regions and mirrors to use | Yes |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| keyboard-language | 2 letter code for your keyboard language | eg: us, de etc | Yes |
|
||||||
| nic | nic to use, Use value NetworkManager for installing it | | Yes |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| mirror-region | {"<Region Name>": { "Mirror Name": True/False}, ..} | List of regions and mirrors to use | Yes |
|
||||||
| packages | [ "package1", "package2", ..] | List of packages to install post-installation | No |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| nic | { NetworkManager: <boolean>, nic: <nic name> } | | Yes |
|
||||||
| profile | Name of profile to install | profiles are present in profiles/, use the name of a profile to install it | No |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| ntp | <boolean> | Set to true to set-up ntp post install | No |
|
||||||
| !root-password | any | The root account password | No |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| packages | [ "package1", "package2", ..] | List of packages to install post-installation | No |
|
||||||
| services | [ "service1", "service2", ..] | Services to enable post-installation | No |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| profile | Name of the profile to install | Profiles are present in profiles/, use the name of a profile to install it | No |
|
||||||
| superusers | { "<username>": { "!password": "<password>"}, ..} | List of superuser credentials, see config for reference | Yes, if root account password is not provided |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| !root-password | any | The root account password | No |
|
||||||
| timezone | Timezone to configure in installation | Timezone eg: UTC, Asia/Kolkata etc. | Yes |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| services | [ "service1", "service2", ..] | Services to enable post-installation | No |
|
||||||
| users | { "<username>": { "!password": "<password>"}, ..} | List of regular user credentials, see config for reference | Yes, can be {} |
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
+----------------------+--------------------------------------------------------+----------------------------------------------------------------------------+-----------------------------------------------+
|
| sys-encoding | "utf-8" | Set to change system encoding post-install, ignored if --advanced flag is not passed | No |
|
||||||
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
|
| sys-language | "en_US" | Set to change system language post-install, ignored if --advanced flag is not passed | No |
|
||||||
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
|
| superusers | { "<username>": { "!password": "<password>"}, ..} | List of superuser credentials, see configuration for reference | Yes, if root account password is not provided |
|
||||||
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
|
| timezone | Timezone to configure in installation | Timezone eg: UTC, Asia/Kolkata etc. | Yes |
|
||||||
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
|
| users | { "<username>": { "!password": "<password>"}, ..} | List of regular user credentials, see configuration for reference | Yes, can be {} |
|
||||||
|
+----------------------+--------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------+-----------------------------------------------+
|
||||||
|
|
||||||
Description individual steps
|
Description individual steps
|
||||||
============================
|
============================
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
],
|
],
|
||||||
"!encryption-password": "supersecret",
|
"!encryption-password": "supersecret",
|
||||||
"filesystem": "btrfs",
|
"filesystem": "btrfs",
|
||||||
|
"gfx_driver": "VMware / VirtualBox (open-source)",
|
||||||
"harddrive": {
|
"harddrive": {
|
||||||
"path": "/dev/nvme0n1"
|
"path": "/dev/nvme0n1"
|
||||||
},
|
},
|
||||||
|
|
@ -16,14 +17,11 @@
|
||||||
"linux"
|
"linux"
|
||||||
],
|
],
|
||||||
"keyboard-language": "us",
|
"keyboard-language": "us",
|
||||||
"mirror-region": {
|
"mirror-region": "Worldwide",
|
||||||
"Worldwide": {
|
|
||||||
"https://mirror.rackspace.com/archlinux/$repo/os/$arch": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nic": {
|
"nic": {
|
||||||
"NetworkManager": true
|
"NetworkManager": true
|
||||||
},
|
},
|
||||||
|
"ntp": true,
|
||||||
"packages": ["docker", "git", "wget", "zsh"],
|
"packages": ["docker", "git", "wget", "zsh"],
|
||||||
"profile": "gnome",
|
"profile": "gnome",
|
||||||
"services": ["docker"],
|
"services": ["docker"],
|
||||||
|
|
@ -32,6 +30,8 @@
|
||||||
"!password": "devel"
|
"!password": "devel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"sys-encoding": "utf-8",
|
||||||
|
"sys-language": "en_US",
|
||||||
"timezone": "US/Eastern",
|
"timezone": "US/Eastern",
|
||||||
"users": {}
|
"users": {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import time
|
||||||
|
|
||||||
import archinstall
|
import archinstall
|
||||||
from archinstall.lib.general import run_custom_user_commands
|
from archinstall.lib.general import run_custom_user_commands
|
||||||
from archinstall.lib.hardware import has_uefi
|
from archinstall.lib.hardware import has_uefi, AVAILABLE_GFX_DRIVERS
|
||||||
from archinstall.lib.networking import check_mirror_reachable
|
from archinstall.lib.networking import check_mirror_reachable
|
||||||
from archinstall.lib.profiles import Profile
|
from archinstall.lib.profiles import Profile
|
||||||
|
|
||||||
|
|
@ -186,7 +186,10 @@ def perform_filesystem_operations():
|
||||||
print()
|
print()
|
||||||
print('This is your chosen configuration:')
|
print('This is your chosen configuration:')
|
||||||
archinstall.log("-- Guided template chosen (with below config) --", level=logging.DEBUG)
|
archinstall.log("-- Guided template chosen (with below config) --", level=logging.DEBUG)
|
||||||
archinstall.log(json.dumps(archinstall.arguments, indent=4, sort_keys=True, cls=archinstall.JSON), level=logging.INFO)
|
user_configuration = json.dumps(archinstall.arguments, indent=4, sort_keys=True, cls=archinstall.JSON)
|
||||||
|
archinstall.log(user_configuration, level=logging.INFO)
|
||||||
|
with open("/var/log/archinstall/user_configuration.json", "w") as config_file:
|
||||||
|
config_file.write(user_configuration)
|
||||||
print()
|
print()
|
||||||
|
|
||||||
if not archinstall.arguments.get('silent'):
|
if not archinstall.arguments.get('silent'):
|
||||||
|
|
@ -369,15 +372,24 @@ else:
|
||||||
archinstall.arguments['harddrive'].keep_partitions = False
|
archinstall.arguments['harddrive'].keep_partitions = False
|
||||||
# Temporary workaround to make Desktop Environments work
|
# Temporary workaround to make Desktop Environments work
|
||||||
if archinstall.arguments.get('profile', None) is not None:
|
if archinstall.arguments.get('profile', None) is not None:
|
||||||
archinstall.arguments['profile'] = archinstall.Profile(None, archinstall.arguments.get('profile', None))
|
if type(archinstall.arguments.get('profile', None)) is dict:
|
||||||
|
archinstall.arguments['profile'] = archinstall.Profile(None, archinstall.arguments.get('profile', None)['path'])
|
||||||
|
else:
|
||||||
|
archinstall.arguments['profile'] = archinstall.Profile(None, archinstall.arguments.get('profile', None))
|
||||||
else:
|
else:
|
||||||
archinstall.arguments['profile'] = None
|
archinstall.arguments['profile'] = None
|
||||||
|
|
||||||
if archinstall.arguments.get('mirror-region', None) is not None:
|
if archinstall.arguments.get('mirror-region', None) is not None:
|
||||||
selected_region = archinstall.arguments.get('mirror-region', None)
|
if type(archinstall.arguments.get('mirror-region', None)) is dict:
|
||||||
archinstall.arguments['mirror-region'] = {selected_region: archinstall.list_mirrors()[selected_region]}
|
archinstall.arguments['mirror-region'] = archinstall.arguments.get('mirror-region', None)
|
||||||
|
else:
|
||||||
|
selected_region = archinstall.arguments.get('mirror-region', None)
|
||||||
|
archinstall.arguments['mirror-region'] = {selected_region: archinstall.list_mirrors()[selected_region]}
|
||||||
archinstall.arguments['sys-language'] = archinstall.arguments.get('sys-language', 'en_US')
|
archinstall.arguments['sys-language'] = archinstall.arguments.get('sys-language', 'en_US')
|
||||||
archinstall.arguments['sys-encoding'] = archinstall.arguments.get('sys-encoding', 'utf-8')
|
archinstall.arguments['sys-encoding'] = archinstall.arguments.get('sys-encoding', 'utf-8')
|
||||||
|
|
||||||
|
if archinstall.arguments.get('gfx_driver', None) is not None:
|
||||||
|
archinstall.storage['gfx_driver_packages'] = AVAILABLE_GFX_DRIVERS.get(archinstall.arguments.get('gfx_driver', None), None)
|
||||||
|
|
||||||
perform_filesystem_operations()
|
perform_filesystem_operations()
|
||||||
perform_installation(archinstall.arguments.get('target-mountpoint', None))
|
perform_installation(archinstall.arguments.get('target-mountpoint', None))
|
||||||
|
|
@ -4,6 +4,8 @@ import archinstall
|
||||||
|
|
||||||
is_top_level_profile = True
|
is_top_level_profile = True
|
||||||
|
|
||||||
|
__description__ = 'Provides a selection of desktop environments and tiling window managers, e.g. gnome, kde, sway'
|
||||||
|
|
||||||
# New way of defining packages for a profile, which is iterable and can be used out side
|
# New way of defining packages for a profile, which is iterable and can be used out side
|
||||||
# of the profile to get a list of "what packages will be installed".
|
# of the profile to get a list of "what packages will be installed".
|
||||||
__packages__ = [
|
__packages__ = [
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
is_top_level_profile = True
|
is_top_level_profile = True
|
||||||
|
|
||||||
|
__description__ = 'A very basic installation that allows you to customize Arch Linux as you see fit.'
|
||||||
|
|
||||||
|
|
||||||
def _prep_function(*args, **kwargs):
|
def _prep_function(*args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ import archinstall
|
||||||
|
|
||||||
is_top_level_profile = True
|
is_top_level_profile = True
|
||||||
|
|
||||||
|
__description__ = 'Provides a selection of various server packages to install and enable, e.g. httpd, nginx, mariadb'
|
||||||
|
|
||||||
available_servers = [
|
available_servers = [
|
||||||
"cockpit",
|
"cockpit",
|
||||||
"docker",
|
"docker",
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ def _prep_function(*args, **kwargs):
|
||||||
other code in this stage. So it's a safe way to ask the user
|
other code in this stage. So it's a safe way to ask the user
|
||||||
for more input before any other installer steps start.
|
for more input before any other installer steps start.
|
||||||
"""
|
"""
|
||||||
__builtins__["_gfx_driver_packages"] = archinstall.select_driver()
|
archinstall.storage["gfx_driver_packages"] = archinstall.select_driver()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ def _prep_function(*args, **kwargs):
|
||||||
# through importlib.util.spec_from_file_location("sway", "/somewhere/sway.py")
|
# through importlib.util.spec_from_file_location("sway", "/somewhere/sway.py")
|
||||||
# or through conventional import sway
|
# or through conventional import sway
|
||||||
if __name__ == "sway":
|
if __name__ == "sway":
|
||||||
if "nvidia" in _gfx_driver_packages:
|
if "nvidia" in archinstall.storage.get("gfx_driver_packages", None):
|
||||||
choice = input("The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues. Continue anyways? [y/N] ")
|
choice = input("The proprietary Nvidia driver is not supported by Sway. It is likely that you will run into issues. Continue anyways? [y/N] ")
|
||||||
if choice.lower() in ("n", ""):
|
if choice.lower() in ("n", ""):
|
||||||
raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.")
|
raise archinstall.lib.exceptions.HardwareIncompatibilityError("Sway does not support the proprietary nvidia drivers.")
|
||||||
|
|
@ -43,4 +43,4 @@ if __name__ == "sway":
|
||||||
archinstall.storage['installation_session'].add_additional_packages(__packages__)
|
archinstall.storage['installation_session'].add_additional_packages(__packages__)
|
||||||
|
|
||||||
# Install the graphics driver packages
|
# Install the graphics driver packages
|
||||||
archinstall.storage['installation_session'].add_additional_packages(_gfx_driver_packages)
|
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}")
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import archinstall
|
||||||
|
|
||||||
is_top_level_profile = True
|
is_top_level_profile = True
|
||||||
|
|
||||||
|
__description__ = 'Installs a minimal system as well as xorg and graphics drivers.'
|
||||||
|
|
||||||
__packages__ = [
|
__packages__ = [
|
||||||
'dkms',
|
'dkms',
|
||||||
'xorg-server',
|
'xorg-server',
|
||||||
|
|
@ -22,7 +24,7 @@ def _prep_function(*args, **kwargs):
|
||||||
for more input before any other installer steps start.
|
for more input before any other installer steps start.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__builtins__['_gfx_driver_packages'] = archinstall.select_driver()
|
archinstall.storage["gfx_driver_packages"] = archinstall.select_driver()
|
||||||
|
|
||||||
# TODO: Add language section and/or merge it with the locale selected
|
# TODO: Add language section and/or merge it with the locale selected
|
||||||
# earlier in for instance guided.py installer.
|
# earlier in for instance guided.py installer.
|
||||||
|
|
@ -35,13 +37,13 @@ def _prep_function(*args, **kwargs):
|
||||||
# or through conventional import xorg
|
# or through conventional import xorg
|
||||||
if __name__ == 'xorg':
|
if __name__ == 'xorg':
|
||||||
try:
|
try:
|
||||||
if "nvidia" in _gfx_driver_packages:
|
if "nvidia" in archinstall.storage.get("gfx_driver_packages", None):
|
||||||
if "linux-zen" in archinstall.storage['installation_session'].base_packages or "linux-lts" in archinstall.storage['installation_session'].base_packages:
|
if "linux-zen" in archinstall.storage['installation_session'].base_packages or "linux-lts" in archinstall.storage['installation_session'].base_packages:
|
||||||
archinstall.storage['installation_session'].add_additional_packages("dkms") # I've had kernel regen fail if it wasn't installed before nvidia-dkms
|
archinstall.storage['installation_session'].add_additional_packages("dkms") # I've had kernel regen fail if it wasn't installed before nvidia-dkms
|
||||||
archinstall.storage['installation_session'].add_additional_packages("xorg-server xorg-xinit nvidia-dkms")
|
archinstall.storage['installation_session'].add_additional_packages("xorg-server xorg-xinit nvidia-dkms")
|
||||||
else:
|
else:
|
||||||
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(_gfx_driver_packages)}")
|
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}")
|
||||||
else:
|
else:
|
||||||
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(_gfx_driver_packages)}")
|
archinstall.storage['installation_session'].add_additional_packages(f"xorg-server xorg-xinit {' '.join(archinstall.storage.get('gfx_driver_packages', None))}")
|
||||||
except:
|
except:
|
||||||
archinstall.storage['installation_session'].add_additional_packages("xorg-server xorg-xinit") # Prep didn't run, so there's no driver to install
|
archinstall.storage['installation_session'].add_additional_packages("xorg-server xorg-xinit") # Prep didn't run, so there's no driver to install
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue