Repository: archlinux/archinstall

Issue:
Executing Boot() more than once in succession causes "Transport endpoint is not connected"
Not sure yet what causes this:

![image](https://user-images.githubusercontent.com/861439/140619185-dce5b464-91fd-4f08-a047-069ed36170ac.png)



Discussion:

Resolving patch:
diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py
--- a/archinstall/lib/installer.py
+++ b/archinstall/lib/installer.py
@@ -691,6 +691,7 @@ def create_file(self, filename, owner=None):
 		return InstallationFile(self, filename, owner)
 
 	def set_keyboard_language(self, language: str) -> bool:
+		log(f"Setting keyboard language to {language}", level=logging.INFO)
 		if len(language.strip()):
 			if not verify_keyboard_layout(language):
 				self.log(f"Invalid keyboard language specified: {language}", fg="red", level=logging.ERROR)
@@ -712,6 +713,7 @@ def set_keyboard_language(self, language: str) -> bool:
 		return True
 
 	def set_x11_keyboard_language(self, language: str) -> bool:
+		log(f"Setting x11 keyboard language to {language}", level=logging.INFO)
 		"""
 		A fallback function to set x11 layout specifically and separately from console layout.
 		This isn't strictly necessary since .set_keyboard_language() does this as well.
diff --git a/archinstall/lib/systemd.py b/archinstall/lib/systemd.py
--- a/archinstall/lib/systemd.py
+++ b/archinstall/lib/systemd.py
@@ -1,4 +1,6 @@
 import logging
+import time
+from .exceptions import SysCallError
 from .general import SysCommand, SysCommandWorker, locate_binary
 from .installer import Installer
 from .output import log
@@ -65,8 +67,10 @@ def __enter__(self):
 				'-D', self.instance.target,
 				'--timezone=off',
 				'-b',
+				'--no-pager',
 				'--machine', self.container_name
 			])
+			# '-P' or --console=pipe  could help us not having to do a bunch of os.write() calls, but instead use pipes (stdin, stdout and stderr) as usual.
 
 		if not self.ready:
 			while self.session.is_alive():
@@ -85,7 +89,14 @@ def __exit__(self, *args, **kwargs):
 			log(args[1], level=logging.ERROR, fg='red')
 			log(f"The error above occured in a temporary boot-up of the installation {self.instance}", level=logging.ERROR, fg="red")
 
-		SysCommand(f'machinectl shell {self.container_name} /bin/bash -c "shutdown now"')
+		shutdown = SysCommand(f'systemd-run --machine={self.container_name} --pty /bin/bash -c "shutdown now"')
+		while self.session.is_alive():
+			time.sleep(0.25)
+
+		if shutdown.exit_code == 0:
+			storage['active_boot'] = None
+		else:
+			raise SysCallError(f"Could not shut down temporary boot of {self.instance}", level=logging.ERROR, fg="red")
 
 	def __iter__(self):
 		if self.session:
@@ -112,10 +123,10 @@ def SysCommand(self, cmd: list, *args, **kwargs):
 
 			cmd[0] = locate_binary(cmd[0])
 
-		return SysCommand(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)
+		return SysCommand(["systemd-run", f"--machine={self.container_name}", "--pty", *cmd], *args, **kwargs)
 
 	def SysCommandWorker(self, cmd: list, *args, **kwargs):
 		if cmd[0][0] != '/' and cmd[0][:2] != './':
 			cmd[0] = locate_binary(cmd[0])
 
-		return SysCommandWorker(["machinectl", "shell", self.container_name, *cmd], *args, **kwargs)
+		return SysCommandWorker(["systemd-run", f"--machine={self.container_name}", "--pty", *cmd], *args, **kwargs)


Test patch: