<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://kb.pocnet.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoC</id>
	<title>Knowledgebase - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://kb.pocnet.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PoC"/>
	<link rel="alternate" type="text/html" href="https://kb.pocnet.net/wiki/Spezial:Beitr%C3%A4ge/PoC"/>
	<updated>2026-04-27T14:29:02Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3137</id>
		<title>Input/Output-Verhalten bei HPE Microserver Gen10</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3137"/>
		<updated>2026-04-11T22:56:36Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Lösung */ Stimmt nicht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;HPE Microserver Gen 10&#039;&#039;&#039;&amp;lt;ref&amp;gt;Nicht Gen10+!&amp;lt;/ref&amp;gt; ist mit einem Massenspeichercontroller Marvell 88SE9230 ausgerüstet, der sich im Tagesbetrieb etwas merkwürdig im &#039;&#039;&#039;I/O-Verhalten&#039;&#039;&#039; gezeigt hat.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es geht hier nicht um den Betrieb des Chipsatzes im RAID-Modus, sondern mit einzelnen Disks.&amp;lt;ref&amp;gt;Das RAID selbst läuft mit &#039;&#039;mdraid&#039;&#039;.&amp;lt;/ref&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problembeschreibung ==&lt;br /&gt;
Mit Festplatten&amp;lt;ref&amp;gt;WD Green 2&amp;amp;thinsp;TB&amp;lt;/ref&amp;gt; aber auch SSDs&amp;lt;ref&amp;gt;Samsung 870 QVO 2&amp;amp;thinsp;TB.&amp;lt;/ref&amp;gt; konnte ich unter Linux&amp;lt;ref&amp;gt;Debian 12, Kernel Version 6.1.0.&amp;lt;/ref&amp;gt; stellenweise Ruckler und Hakler beobachten, die hart an der Grenze zu &#039;&#039;es nervt&#039;&#039; waren, ich aber in Anbetracht der doch eher schwachbrüstigen CPU als gegeben hinnahm. Allerdings trat das Problem beim Vorgängersystem, einem HP Microserver N54L mit ansonsten gleicher Software nicht auf.&lt;br /&gt;
&lt;br /&gt;
Für mich war das insbesondere spürbar…&lt;br /&gt;
* beim Editieren von Textdateien in &#039;&#039;vim&#039;&#039;.&lt;br /&gt;
** Beim Wechsel von Einfüge- nach Kommandomodus ließ sich der Cursor nicht mehr instant bewegen, sondern brauchte eine knappe halbe Sekunde Bedenkzeit.&lt;br /&gt;
** Beim Scrollen durch längere Texte ruckelte und stockte die Darstellung immer mal wieder.&lt;br /&gt;
** Speichern einer wenige KiB großen Datei hat eine knappe halbe Sekunde Verzögerung bis zum Prompt nach sich gezogen.&lt;br /&gt;
* beim Aufrufen von eher kleinen Programmen wie &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt;, u.&amp;amp;thinsp;Ä. bei denen ebenfalls nach dem Beenden der Funktion der Shell-Prompt im Vergleich zum Vorgängersystem dann doch einen Ticken zu lange brauchte bis er wieder erschien.&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Dank eines guten Freundes, der dies auf dem gegebenen System ebenfalls beobachten konnte, ließ sich das Problem eingrenzen. Das temporäre Verzeichnis &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; ist auf meinem System eine RAM-Disk. Forciert man das Anlegen der &#039;&#039;vim&#039;&#039;-Recoverydateien dort drin, war das Ruckeln im Editor komplett verschwunden. Es konnte sich somit nur um ein I/O-Problem handeln.&lt;br /&gt;
&lt;br /&gt;
Meine Recherchen haben ergeben, dass der Marvell-Chipsatz sich als [[wikipedia:Advanced Host Controller Interface|AHCI]] am System meldet, und das Kernelmodul &#039;&#039;ahci.ko&#039;&#039; noch zwei Parameter beherrscht:&lt;br /&gt;
* &amp;lt;code&amp;gt;marvell_enable&amp;lt;/code&amp;gt; soll dazu da sein, manche Marvell-Chipsätze in den SATA-Mode zu zwingen.&lt;br /&gt;
* &amp;lt;code&amp;gt;mobile_lpm_policy&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Dies soll &#039;&#039;demnächst&#039;&#039; in &#039;&#039;lpm_policy&#039;&#039; umbenannt werden, weil es nicht nur Notebooks betrifft.&amp;lt;/ref&amp;gt; zur Konfiguration des Standard-Stromsparmodus, der in &amp;lt;code&amp;gt;/sys/class/scsi_host/host&#039;&#039;n&#039;&#039;/link_power_management_policy&amp;lt;/code&amp;gt; eingesehen werden kann.&lt;br /&gt;
&lt;br /&gt;
Da die Ports standardmäßig im Sysfs auf &#039;&#039;max_performance&#039;&#039; standen, habe ich diesen Parameter nicht weiter getestet.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&amp;lt;s&amp;gt;Der Test mit &#039;&#039;marvell_enable=1&#039;&#039; verlief positiv. Das Ruckelproblem war damit verschwunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;options ahci marvell_enable=1&amp;quot; &amp;gt; /etc/modprobe.d/ahci.conf&lt;br /&gt;
update-initramfs -u&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
Korrelation bedingt nicht zwingend Kausalität. Der Fehler wurde im Laufe der Zeit wieder sichtbar. Es scheint also einen Zusammenhang mit der Laufzeit des Systems zu geben.&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Hardware]]&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3136</id>
		<title>Input/Output-Verhalten bei HPE Microserver Gen10</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3136"/>
		<updated>2026-04-07T20:16:09Z</updated>

		<summary type="html">&lt;p&gt;PoC: Genauer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;HPE Microserver Gen 10&#039;&#039;&#039;&amp;lt;ref&amp;gt;Nicht Gen10+!&amp;lt;/ref&amp;gt; ist mit einem Massenspeichercontroller Marvell 88SE9230 ausgerüstet, der sich im Tagesbetrieb etwas merkwürdig im &#039;&#039;&#039;I/O-Verhalten&#039;&#039;&#039; gezeigt hat.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es geht hier nicht um den Betrieb des Chipsatzes im RAID-Modus, sondern mit einzelnen Disks.&amp;lt;ref&amp;gt;Das RAID selbst läuft mit &#039;&#039;mdraid&#039;&#039;.&amp;lt;/ref&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problembeschreibung ==&lt;br /&gt;
Mit Festplatten&amp;lt;ref&amp;gt;WD Green 2&amp;amp;thinsp;TB&amp;lt;/ref&amp;gt; aber auch SSDs&amp;lt;ref&amp;gt;Samsung 870 QVO 2&amp;amp;thinsp;TB.&amp;lt;/ref&amp;gt; konnte ich unter Linux&amp;lt;ref&amp;gt;Debian 12, Kernel Version 6.1.0.&amp;lt;/ref&amp;gt; stellenweise Ruckler und Hakler beobachten, die hart an der Grenze zu &#039;&#039;es nervt&#039;&#039; waren, ich aber in Anbetracht der doch eher schwachbrüstigen CPU als gegeben hinnahm. Allerdings trat das Problem beim Vorgängersystem, einem HP Microserver N54L mit ansonsten gleicher Software nicht auf.&lt;br /&gt;
&lt;br /&gt;
Für mich war das insbesondere spürbar…&lt;br /&gt;
* beim Editieren von Textdateien in &#039;&#039;vim&#039;&#039;.&lt;br /&gt;
** Beim Wechsel von Einfüge- nach Kommandomodus ließ sich der Cursor nicht mehr instant bewegen, sondern brauchte eine knappe halbe Sekunde Bedenkzeit.&lt;br /&gt;
** Beim Scrollen durch längere Texte ruckelte und stockte die Darstellung immer mal wieder.&lt;br /&gt;
** Speichern einer wenige KiB großen Datei hat eine knappe halbe Sekunde Verzögerung bis zum Prompt nach sich gezogen.&lt;br /&gt;
* beim Aufrufen von eher kleinen Programmen wie &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt;, u.&amp;amp;thinsp;Ä. bei denen ebenfalls nach dem Beenden der Funktion der Shell-Prompt im Vergleich zum Vorgängersystem dann doch einen Ticken zu lange brauchte bis er wieder erschien.&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Dank eines guten Freundes, der dies auf dem gegebenen System ebenfalls beobachten konnte, ließ sich das Problem eingrenzen. Das temporäre Verzeichnis &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; ist auf meinem System eine RAM-Disk. Forciert man das Anlegen der &#039;&#039;vim&#039;&#039;-Recoverydateien dort drin, war das Ruckeln im Editor komplett verschwunden. Es konnte sich somit nur um ein I/O-Problem handeln.&lt;br /&gt;
&lt;br /&gt;
Meine Recherchen haben ergeben, dass der Marvell-Chipsatz sich als [[wikipedia:Advanced Host Controller Interface|AHCI]] am System meldet, und das Kernelmodul &#039;&#039;ahci.ko&#039;&#039; noch zwei Parameter beherrscht:&lt;br /&gt;
* &amp;lt;code&amp;gt;marvell_enable&amp;lt;/code&amp;gt; soll dazu da sein, manche Marvell-Chipsätze in den SATA-Mode zu zwingen.&lt;br /&gt;
* &amp;lt;code&amp;gt;mobile_lpm_policy&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Dies soll &#039;&#039;demnächst&#039;&#039; in &#039;&#039;lpm_policy&#039;&#039; umbenannt werden, weil es nicht nur Notebooks betrifft.&amp;lt;/ref&amp;gt; zur Konfiguration des Standard-Stromsparmodus, der in &amp;lt;code&amp;gt;/sys/class/scsi_host/host&#039;&#039;n&#039;&#039;/link_power_management_policy&amp;lt;/code&amp;gt; eingesehen werden kann.&lt;br /&gt;
&lt;br /&gt;
Da die Ports standardmäßig im Sysfs auf &#039;&#039;max_performance&#039;&#039; standen, habe ich diesen Parameter nicht weiter getestet.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
Der Test mit &#039;&#039;marvell_enable=1&#039;&#039; verlief positiv. Das Ruckelproblem war damit verschwunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;options ahci marvell_enable=1&amp;quot; &amp;gt; /etc/modprobe.d/ahci.conf&lt;br /&gt;
update-initramfs -u&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Hardware]]&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3135</id>
		<title>Input/Output-Verhalten bei HPE Microserver Gen10</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3135"/>
		<updated>2026-04-06T22:10:22Z</updated>

		<summary type="html">&lt;p&gt;PoC: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;HPE Microserver Gen 10&#039;&#039;&#039;&amp;lt;ref&amp;gt;Nicht Gen10+!&amp;lt;/ref&amp;gt; ist mit einem Massenspeichercontroller Marvell 88SE9230 ausgerüstet, der sich nach einer Analyse etwas merkwürdig im &#039;&#039;&#039;I/O-Verhalten&#039;&#039;&#039; gezeigt hat.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es geht hier nicht um den Betrieb des Chipsatzes im RAID-Modus, sondern mit einzelnen Disks.&amp;lt;ref&amp;gt;Das RAID selbst läuft mit &#039;&#039;mdraid&#039;&#039;.&amp;lt;/ref&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problembeschreibung ==&lt;br /&gt;
Mit Festplatten&amp;lt;ref&amp;gt;WD Green 2&amp;amp;thinsp;TB&amp;lt;/ref&amp;gt; aber auch SSDs&amp;lt;ref&amp;gt;Samsung 870 QVO 2&amp;amp;thinsp;TB.&amp;lt;/ref&amp;gt; konnte ich unter Linux&amp;lt;ref&amp;gt;Debian 12, Kernel Version 6.1.0.&amp;lt;/ref&amp;gt; stellenweise Ruckler und Hakler beobachten, die hart an der Grenze zu &#039;&#039;es nervt&#039;&#039; waren, ich aber in Anbetracht der doch eher schwachbrüstigen CPU als gegeben hinnahm. Allerdings trat das Problem beim Vorgängersystem, einem HP Microserver N54L mit ansonsten gleicher Software nicht auf.&lt;br /&gt;
&lt;br /&gt;
Für mich war das insbesondere spürbar…&lt;br /&gt;
* beim Editieren von Textdateien in &#039;&#039;vim&#039;&#039;.&lt;br /&gt;
** Beim Wechsel von Einfüge- nach Kommandomodus ließ sich der Cursor nicht mehr instant bewegen, sondern brauchte eine knappe halbe Sekunde Bedenkzeit.&lt;br /&gt;
** Beim Scrollen durch längere Texte ruckelte und stockte die Darstellung immer mal wieder.&lt;br /&gt;
** Speichern einer wenige KiB großen Datei hat eine knappe halbe Sekunde Verzögerung bis zum Prompt nach sich gezogen.&lt;br /&gt;
* beim Aufrufen von eher kleinen Programmen wie &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt;, u.&amp;amp;thinsp;Ä. bei denen ebenfalls nach dem Beenden der Funktion der Shell-Prompt im Vergleich zum Vorgängersystem dann doch einen Ticken zu lange brauchte bis er wieder erschien.&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Dank eines guten Freundes, der dies auf dem gegebenen System ebenfalls beobachten konnte, ließ sich das Problem eingrenzen. Das temporäre Verzeichnis &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; ist auf meinem System eine RAM-Disk. Forciert man das Anlegen der &#039;&#039;vim&#039;&#039;-Recoverydateien dort drin, war das Ruckeln im Editor komplett verschwunden. Es konnte sich somit nur um ein I/O-Problem handeln.&lt;br /&gt;
&lt;br /&gt;
Meine Recherchen haben ergeben, dass der Marvell-Chipsatz sich als [[wikipedia:Advanced Host Controller Interface|AHCI]] am System meldet, und das Kernelmodul &#039;&#039;ahci.ko&#039;&#039; noch zwei Parameter beherrscht:&lt;br /&gt;
* &amp;lt;code&amp;gt;marvell_enable&amp;lt;/code&amp;gt; soll dazu da sein, manche Marvell-Chipsätze in den SATA-Mode zu zwingen.&lt;br /&gt;
* &amp;lt;code&amp;gt;mobile_lpm_policy&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Dies soll &#039;&#039;demnächst&#039;&#039; in &#039;&#039;lpm_policy&#039;&#039; umbenannt werden, weil es nicht nur Notebooks betrifft.&amp;lt;/ref&amp;gt; zur Konfiguration des Standard-Stromsparmodus, der in &amp;lt;code&amp;gt;/sys/class/scsi_host/host&#039;&#039;n&#039;&#039;/link_power_management_policy&amp;lt;/code&amp;gt; eingesehen werden kann.&lt;br /&gt;
&lt;br /&gt;
Da die Ports standardmäßig im Sysfs auf &#039;&#039;max_performance&#039;&#039; standen, habe ich diesen Parameter nicht weiter getestet.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
Der Test mit &#039;&#039;marvell_enable=1&#039;&#039; verlief positiv. Das Ruckelproblem war damit verschwunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;options ahci marvell_enable=1&amp;quot; &amp;gt; /etc/modprobe.d/ahci.conf&lt;br /&gt;
update-initramfs -u&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Hardware]]&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3134</id>
		<title>Input/Output-Verhalten bei HPE Microserver Gen10</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Input/Output-Verhalten_bei_HPE_Microserver_Gen10&amp;diff=3134"/>
		<updated>2026-04-06T22:09:51Z</updated>

		<summary type="html">&lt;p&gt;PoC: New&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;HPE Microserver Gen 10&#039;&#039;&#039;&amp;lt;ref&amp;gt;Nicht Gen10+!&amp;lt;/ref&amp;gt; ist mit einem Massenspeichercontroller Marvell 88SE9230 ausgerüstet, der sich nach einer Analyse etwas merkwürdig im &#039;&#039;&#039;I/O-Verhalten&#039;&#039;&#039; gezeigt hat.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis:&#039;&#039;&#039; Es geht hier nicht um den Betrieb des Chipsatzes im RAID-Modus, sondern mit einzelnen Disks.&amp;lt;ref&amp;gt;Das RAID selbst läuft mit &#039;&#039;mdraid&#039;&#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Problembeschreibung ==&lt;br /&gt;
Mit Festplatten&amp;lt;ref&amp;gt;WD Green 2&amp;amp;thinsp;TB&amp;lt;/ref&amp;gt; aber auch SSDs&amp;lt;ref&amp;gt;Samsung 870 QVO 2&amp;amp;thinsp;TB.&amp;lt;/ref&amp;gt; konnte ich unter Linux&amp;lt;ref&amp;gt;Debian 12, Kernel Version 6.1.0.&amp;lt;/ref&amp;gt; stellenweise Ruckler und Hakler beobachten, die hart an der Grenze zu &#039;&#039;es nervt&#039;&#039; waren, ich aber in Anbetracht der doch eher schwachbrüstigen CPU als gegeben hinnahm. Allerdings trat das Problem beim Vorgängersystem, einem HP Microserver N54L mit ansonsten gleicher Software nicht auf.&lt;br /&gt;
&lt;br /&gt;
Für mich war das insbesondere spürbar…&lt;br /&gt;
* beim Editieren von Textdateien in &#039;&#039;vim&#039;&#039;.&lt;br /&gt;
** Beim Wechsel von Einfüge- nach Kommandomodus ließ sich der Cursor nicht mehr instant bewegen, sondern brauchte eine knappe halbe Sekunde Bedenkzeit.&lt;br /&gt;
** Beim Scrollen durch längere Texte ruckelte und stockte die Darstellung immer mal wieder.&lt;br /&gt;
** Speichern einer wenige KiB großen Datei hat eine knappe halbe Sekunde Verzögerung bis zum Prompt nach sich gezogen.&lt;br /&gt;
* beim Aufrufen von eher kleinen Programmen wie &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sed&amp;lt;/code&amp;gt;, u.&amp;amp;thinsp;Ä. bei denen ebenfalls nach dem Beenden der Funktion der Shell-Prompt im Vergleich zum Vorgängersystem dann doch einen Ticken zu lange brauchte bis er wieder erschien.&lt;br /&gt;
&lt;br /&gt;
== Analyse ==&lt;br /&gt;
Dank eines guten Freundes, der dies auf dem gegebenen System ebenfalls beobachten konnte, ließ sich das Problem eingrenzen. Das temporäre Verzeichnis &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; ist auf meinem System eine RAM-Disk. Forciert man das Anlegen der &#039;&#039;vim&#039;&#039;-Recoverydateien dort drin, war das Ruckeln im Editor komplett verschwunden. Es konnte sich somit nur um ein I/O-Problem handeln.&lt;br /&gt;
&lt;br /&gt;
Meine Recherchen haben ergeben, dass der Marvell-Chipsatz sich als [[wikipedia:Advanced Host Controller Interface|AHCI]] am System meldet, und das Kernelmodul &#039;&#039;ahci.ko&#039;&#039; noch zwei Parameter beherrscht:&lt;br /&gt;
* &amp;lt;code&amp;gt;marvell_enable&amp;lt;/code&amp;gt; soll dazu da sein, manche Marvell-Chipsätze in den SATA-Mode zu zwingen.&lt;br /&gt;
* &amp;lt;code&amp;gt;mobile_lpm_policy&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;Dies soll &#039;&#039;demnächst&#039;&#039; in &#039;&#039;lpm_policy&#039;&#039; umbenannt werden, weil es nicht nur Notebooks betrifft.&amp;lt;/ref&amp;gt; zur Konfiguration des Standard-Stromsparmodus, der in &amp;lt;code&amp;gt;/sys/class/scsi_host/host&#039;&#039;n&#039;&#039;/link_power_management_policy&amp;lt;/code&amp;gt; eingesehen werden kann.&lt;br /&gt;
&lt;br /&gt;
Da die Ports standardmäßig im Sysfs auf &#039;&#039;max_performance&#039;&#039; standen, habe ich diesen Parameter nicht weiter getestet.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
Der Test mit &#039;&#039;marvell_enable=1&#039;&#039; verlief positiv. Das Ruckelproblem war damit verschwunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;options ahci marvell_enable=1&amp;quot; &amp;gt; /etc/modprobe.d/ahci.conf&lt;br /&gt;
update-initramfs -u&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Hardware]]&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Kategorie:AS/400&amp;diff=3133</id>
		<title>Kategorie:AS/400</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Kategorie:AS/400&amp;diff=3133"/>
		<updated>2026-03-13T19:24:05Z</updated>

		<summary type="html">&lt;p&gt;PoC: +Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Alles über AS/400 und OS/400 bzw. deren Nachfolgesysteme. Innerhalb dieser KB werden&lt;br /&gt;
* IBM AS/400&lt;br /&gt;
* IBM System i&lt;br /&gt;
* IBM i&lt;br /&gt;
synonym verwendet. Ein einzelnen Foren ist zu lesen, dies wäre falsch, allerdings ist der grundlegende Aufbau der Systemarchitektur seit der Einführung der S/38 im Jahre 1978 unverändert, wenn auch wesentlich erweitert.&lt;br /&gt;
&lt;br /&gt;
Die aufgeführten Artikel beziehen sich, soweit nicht anders angegeben, auf OS/400 V4R4 bzw. V4R5.&lt;br /&gt;
&lt;br /&gt;
Weitere Inhalte in Englischer Sprache finden sich in [https://try-as400.pocnet.net/ try-as400.pocnet.net].&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.astradyne.net/manuals.php AS/400 Manuals], Spiegel/Archiv bei Astradyne.net.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Hardware]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:IBM i]]&lt;br /&gt;
[[Kategorie:System i]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Cisco-Router_als_Konsolenserver_konfigurieren&amp;diff=3132</id>
		<title>Cisco-Router als Konsolenserver konfigurieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Cisco-Router_als_Konsolenserver_konfigurieren&amp;diff=3132"/>
		<updated>2026-03-12T16:34:33Z</updated>

		<summary type="html">&lt;p&gt;PoC: Querverlinkung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einige &#039;&#039;&#039;Cisco-Router&#039;&#039;&#039;, wie z.&amp;amp;thinsp;B. 2511 oder neuere Modelle mit entsprechenden Multiseriellkarten (siehe [[#Weblinks|Weblinks]] lassen sich prima als Konsoleserver einrichten. Dies stellt quasi den umgekehrten Fall eines [[Cisco-Router als Terminalserver konfigurieren|Terminalservers]] dar: Per &#039;&#039;telnet&#039;&#039; (oder je nach IOS/Gerätekombination auch &#039;&#039;ssh&#039;&#039; oder exotischere Protokolle wie DEC &#039;&#039;MOP&#039;&#039;) lässt sich ein Seriellport am Gerät ansprechen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Die notwendigen Octal-Breakoutkabel haben an ihrem anderen Ende einen normalen RJ45 (genauer 8P8C)-Stecker mit der passenden Pinbelegung für den Konsolenport der Cisco-Geräte.&lt;br /&gt;
&lt;br /&gt;
Mit dem nachfolgenden Konfigurationsauschnitt genügt ein &#039;&#039;telnet&#039;&#039; auf die jeweilige IP-Adresse, die unten als &#039;&#039;ip alias&#039;&#039; hinterlegt ist, damit die Sitzung ohne weiteres zutun auf den entsprechenden Seriellport verbunden wird. Ich habe hier bewusst auf eine vorherige Passwortabfrage verzichtet, da die dahinterliegenden Geräte selbst auf der Konsole geschützt sein sollten.&lt;br /&gt;
&lt;br /&gt;
Einsatzszenarien sind z.&amp;amp;thinsp;B. Notzugänge via Konsoleport auf beim GAU ansonsten unerreichbare zentrale Infrastrukturkomponenten oder falls mehrere Geräte zeitsparend gleichzeitig konfiguriert werden sollen.&lt;br /&gt;
&lt;br /&gt;
 aaa new-model&lt;br /&gt;
 !&lt;br /&gt;
 aaa authentication login default local&lt;br /&gt;
 aaa authentication login serial-lines none&lt;br /&gt;
 aaa authorization exec default local&lt;br /&gt;
 aaa authorization commands 0 serial-lines none&lt;br /&gt;
 no aaa authorization console&lt;br /&gt;
 !&lt;br /&gt;
 ip alias 172.24.25.91 2001&lt;br /&gt;
 ip alias 172.24.25.92 2002&lt;br /&gt;
 ip alias 172.24.25.93 2003&lt;br /&gt;
 ip alias 172.24.25.94 2004&lt;br /&gt;
 ip alias 172.24.25.95 2005&lt;br /&gt;
 ip alias 172.24.25.96 2006&lt;br /&gt;
 ip alias 172.24.25.97 2007&lt;br /&gt;
 ip alias 172.24.25.98 2008&lt;br /&gt;
 !&lt;br /&gt;
 line 1 8&lt;br /&gt;
  no motd-banner&lt;br /&gt;
  no exec&lt;br /&gt;
  authorization commands 0 serial-lines&lt;br /&gt;
  login authentication serial-lines&lt;br /&gt;
  modem Host&lt;br /&gt;
  international&lt;br /&gt;
  transport input all&lt;br /&gt;
  transport output all&lt;br /&gt;
  escape-character 3&lt;br /&gt;
  flowcontrol hardware&lt;br /&gt;
&lt;br /&gt;
Dieser Vorgang nennt sich &#039;&#039;reverse-telnet&#039;&#039;. Die TCP-Portnummer ergibt sich aus der Line-Nummer + 2000. Ein &#039;&#039;show line&#039;&#039; auf der Kommandozeile gibt hier genauer Auskunft.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Cisco-Router als Terminalserver konfigurieren]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.cisco.com/c/en/us/td/docs/ios/12_2/dial/configuration/guide/fdial_c.html Cisco IOS Dial Technologies Configuration Guide, Release 12.2] auf www.cisco.com&lt;br /&gt;
* [http://www.cisco.com/c/en/us/support/docs/routers/3600-series-multiservice-platforms/7260-hw-as.html Understanding 4-Port and 8-Port Async/Sync Network Modules] auf www.cisco.com&lt;br /&gt;
* [http://www.cisco.com/c/en/us/support/docs/routers/3600-series-multiservice-platforms/7258-hw-async.html Understanding 16- and 32-Port Async Network Modules] auf www.cisco.com&lt;br /&gt;
* [http://ciscofaq.blogspot.de/2005/05/how-to-i-reverse-telnet-out-my-aux.html How do I reverse telnet out my aux port?] auf Ciscofaq.blogspot.de.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Cisco]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Cisco-Router_als_Terminalserver_konfigurieren&amp;diff=3131</id>
		<title>Cisco-Router als Terminalserver konfigurieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Cisco-Router_als_Terminalserver_konfigurieren&amp;diff=3131"/>
		<updated>2026-03-12T16:34:29Z</updated>

		<summary type="html">&lt;p&gt;PoC: Querverlinkung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für einige &#039;&#039;&#039;Cisco-Router&#039;&#039;&#039;, wie z.&amp;amp;thinsp;B. 801/803er ISDN-Router existiert heutzutage fast keine sinnvolle Anwendungsmöglichkeit mehr. Die Geräte lassen sich aber gut als Terminalserver rekonfigurieren: An den Konsole-Port lässt sich ein serielles Terminal wie z.&amp;amp;thinsp;B. das [[MAI DT4315A Serielles Terminal|MAI DT4315A]] anschliessen.&lt;br /&gt;
&lt;br /&gt;
Mit dem nachfolgenden Konfigurationsauschnitt genügt dann auf dem Terminal ein Return und eine Telnet-Verbindung auf den angegebenen Host wird geöffnet. Diese Konfiguration kann sogar seriell vorgenommen werden, ohne dass man aus der Konsolensitzung rausfliegt.&lt;br /&gt;
&lt;br /&gt;
 aaa new-model&lt;br /&gt;
 !&lt;br /&gt;
 aaa authentication login default local&lt;br /&gt;
 aaa authentication login serial-lines none&lt;br /&gt;
 aaa authorization exec default local&lt;br /&gt;
 aaa authorization commands 0 serial-lines none&lt;br /&gt;
 no aaa authorization console&lt;br /&gt;
 !&lt;br /&gt;
 line con 0&lt;br /&gt;
  no motd-banner&lt;br /&gt;
  exec-timeout 0 0&lt;br /&gt;
  authorization commands 0 serial-lines&lt;br /&gt;
  login authentication serial-lines&lt;br /&gt;
  autocommand  telnet 192.168.1.100&lt;br /&gt;
  international&lt;br /&gt;
  transport output telnet&lt;br /&gt;
  stopbits 1&lt;br /&gt;
  flowcontrol software&lt;br /&gt;
&lt;br /&gt;
Leider sind diese Geräte relativ langsam, mit XON/XOFF-Flusssteuerung gibt es mit Geschwindigkeiten &amp;gt; 9600&amp;amp;thinsp;Bps verlorene Zeichen, insbesondere bei Curses-Applikationen. Falls das Terminal Hardwareflusssteuerung beherrscht, ist es sicher eine gute Idee, diese auch einzusetzen.&lt;br /&gt;
&lt;br /&gt;
Falls nach der Konfiguration und abmelden aus dem EXEC nach einem Return wieder der EXEC-Prompt erscheint, muss in der Konfiguration noch ein vorhandenes &amp;lt;code&amp;gt;aaa authorization console&amp;lt;/code&amp;gt; entfernt werden (mit &#039;&#039;no&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Cisco-Router als Konsolenserver konfigurieren]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Cisco]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3130</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3130"/>
		<updated>2026-03-05T17:23:16Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Checkliste */ Besser mit Prüfung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso debian-live-12.2.0-amd64-standard.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten,&lt;br /&gt;
  apt-get install gdisk mdadm dosfstools dump&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,&lt;br /&gt;
 mkfs.fat /dev/sda1,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit&lt;br /&gt;
 ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen:&lt;br /&gt;
 mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
 /dev/sda1	/boot/efi	vfat	defaults	0	0&lt;br /&gt;
* Anlegen des EFI-Bootverzeichnisses,&lt;br /&gt;
 mkdir /boot/efi&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
 mount -a&lt;br /&gt;
* Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub,&lt;br /&gt;
 apt-get install grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
* Sichern der Grub-Defaults,&lt;br /&gt;
 cp -a /etc/default/grub /etc/default/grub~&lt;br /&gt;
* Löschen von altem Grub-PC-Kram, die Frage nach Löschen vom alten Bootloader bejahen,&lt;br /&gt;
 dpkg -P grub-pc grub-pc-bin&lt;br /&gt;
* Restore der Grub-Defaults,&lt;br /&gt;
 mv /etc/default/grub~ /etc/default/grub&lt;br /&gt;
* Restore von gemeinsamen Grub-Dateien durch Reinstallation,&lt;br /&gt;
 apt-get install --reinstall grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten:&lt;br /&gt;
 umount boot/efi* dev/pts dev proc sys/firmware/efi/efivars sys &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; umount mnt&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
Aus der Praxis…&lt;br /&gt;
&lt;br /&gt;
==== Meldung: EFI variables are not supported on this system ====&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11 notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
==== Nach Reboot erscheint nur die Grub-Kommandozeile ====&lt;br /&gt;
Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wurde, hätte &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
abgesetzt werden müssen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht.&lt;br /&gt;
&lt;br /&gt;
Lösung: Die Schritte von oben nochmal wiederholen:&lt;br /&gt;
* Boot von externem Medium,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Mounten der benötigten Partitionen,&lt;br /&gt;
* Grub-Konfiguration neu schreiben:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
* &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Reboot.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3129</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3129"/>
		<updated>2025-11-06T09:28:08Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Weblinks */ +link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
* Ssh-Zugriff ist standardmäßig erstmal nicht möglich. Das ist besonders schmerzhaft für Server mit wackeligem und bocklahmem Remote-Management, die dann Textmode über VNC-ähnliche Protokolle übertragen. Von den Schwierigkeiten mit Sonderzeichen auf der Tastatur ganz zu schweigen.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Danach kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen &amp;quot;Architekturen&amp;quot; zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install debootstrap genisoimage isc-dhcp-server isolinux nfs-kernel-server openbsd-inetd pxelinux squashfs-tools syslinux-common syslinux-efi tftp-hpa tftpd-hpa&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die Konfiguration des bestehenden Servers mit eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.255;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&amp;lt;ref&amp;gt;Dies ist notwendig, damit die später angelegten Symlinks auch aufgelöst werden.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Anmerkungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche Netzwerkinterfacebenennung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian jeweils von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    bookworm &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP.&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving.&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# Generate ISO image for booting.&lt;br /&gt;
# Note: This currently works only for BIOS.&lt;br /&gt;
#genisoimage -rational-rock -cache-inodes -joliet -full-iso9660-filenames \&lt;br /&gt;
#    -input-charset UTF-8 -f -b isolinux/isolinux.bin -c isolinux/boot.cat \&lt;br /&gt;
#    -no-emul-boot -boot-load-size 4 -boot-info-table \&lt;br /&gt;
#    -o /var/tmp/debian-boot-&amp;quot;${DST_ARCH}&amp;quot;.iso /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Anpassungen für ISO-Generation ==&lt;br /&gt;
Als quasi &amp;quot;Abfallprodukt&amp;quot; kann aus dem sowieso schon vorhandenen Squashfs ein ISO-Image erzeugt werden, als zweiter Weg zum Booten von einem System. Falls das gewünscht ist, muss der entsprechende Aufruf von &#039;&#039;genisoimage&#039;&#039; im weiter oben gezeigten Script einkommentiert werden.&lt;br /&gt;
&lt;br /&gt;
Die hierzu notwendigen Pakete &#039;&#039;genisoimage&#039;&#039; und &#039;&#039;isolinux&#039;&#039; wurden bereits oben installiert. Im Endeffekt fehlen eine Handvoll Dateien (Symlinks) und eine Konfigurationsdatei für Isolinux.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration für das Bootmenü beim Boot vom ISO-Image muss in der Datei &#039;&#039;/var/nfsboot/deb-live/isolinux.cfg&#039;&#039; gespeichert werden:&lt;br /&gt;
 prompt 0&lt;br /&gt;
 menu title Boot Menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 timeout 20&lt;br /&gt;
 &lt;br /&gt;
 label linux&lt;br /&gt;
 	menu label ^Debian Live&lt;br /&gt;
 	kernel /boot/vmlinuz&lt;br /&gt;
 	append initrd=/boot/initrd.img net.ifnames=0 biosdevname=0 boot=live live-media-path=/ consoleblank=0&lt;br /&gt;
 	menu default&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
 	menu label Boot ^local disk&lt;br /&gt;
  	localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Danach werden noch ein paar zum Booten notwendige Verzeichnisse und Symlinks zu Dateien angelegt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern. Da &#039;&#039;genisoimage&#039;&#039; mit dem Parameter &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; aufgerufen wird, landen im Image keine Symlinks, sondern die eigentlichen Dateien (dereference).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/nfsboot/deb-live&lt;br /&gt;
mkdir amd64/boot amd64/isolinux i686/boot i686/isolinux&lt;br /&gt;
&lt;br /&gt;
# Symlinks für Kernel und Initrd.&lt;br /&gt;
cd amd64/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/amd64/* .&lt;br /&gt;
cd ../../i686/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/i686/* .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../amd64/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../i686/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
* [https://forum.tinycorelinux.net/index.php/topic,22863.0.html Topic: How To HTTP PXE Boot], Tiny Core Linux&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Benutzer:PoC&amp;diff=3128</id>
		<title>Benutzer:PoC</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Benutzer:PoC&amp;diff=3128"/>
		<updated>2025-10-01T19:16:59Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Von mir verfaßte bzw. überarbeitete Artikel */ -lin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Begriffserklärung ==&lt;br /&gt;
PoC steht in meinem Falle für die genauere Beschreibung meines Vornamens: &#039;&#039;&#039;P&#039;&#039;&#039;atrik &#039;&#039;&#039;o&#039;&#039;&#039;hne &#039;&#039;&#039;C&#039;&#039;&#039; - man schreibt mich Patrik.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.pocnet.net/ Offizielle Heimseite von mir]&lt;br /&gt;
&lt;br /&gt;
== Von mir verfaßte bzw. überarbeitete Artikel ==&lt;br /&gt;
Können [[Spezial:Beiträge/PoC|hier]] nachgelesen werden. Ansonsten finden sich hier auch weniger computerzentrierte Artikel.&lt;br /&gt;
&lt;br /&gt;
* [[Benutzer:PoC/Ursachen von Brummstörungen in Röhrenverstärkern]]&lt;br /&gt;
&lt;br /&gt;
== Was später mal wird ==&lt;br /&gt;
* [[Benutzer:PoC/Solarheizung]]&lt;br /&gt;
* [[Benutzer:PoC/DCF77-Nixie-Röhrenuhr]]&lt;br /&gt;
* [[Benutzer:PoC/Stromversorgungsautarkie]]&lt;br /&gt;
* [[Benutzer:PoC/Mausefalle-Archive mit modernen Mitteln verfügbar machen]]&lt;br /&gt;
* [[Benutzer:PoC/Schlüssel und Zertifikat für AppleMail bereitstellen]]&lt;br /&gt;
* [[Benutzer:PoC/PostScript von LaserWriter 6 konvertieren]]&lt;br /&gt;
* [[Benutzer:PoC/Apple IIgs Netzwerk-Boot]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3127</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3127"/>
		<updated>2025-09-02T21:47:40Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Anpassungen für ISO-Generation */ Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
* Ssh-Zugriff ist standardmäßig erstmal nicht möglich. Das ist besonders schmerzhaft für Server mit wackeligem und bocklahmem Remote-Management, die dann Textmode über VNC-ähnliche Protokolle übertragen. Von den Schwierigkeiten mit Sonderzeichen auf der Tastatur ganz zu schweigen.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Danach kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen &amp;quot;Architekturen&amp;quot; zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install debootstrap genisoimage isc-dhcp-server isolinux nfs-kernel-server openbsd-inetd pxelinux squashfs-tools syslinux-common syslinux-efi tftp-hpa tftpd-hpa&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die Konfiguration des bestehenden Servers mit eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.255;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&amp;lt;ref&amp;gt;Dies ist notwendig, damit die später angelegten Symlinks auch aufgelöst werden.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Anmerkungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche Netzwerkinterfacebenennung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian jeweils von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    bookworm &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP.&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving.&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# Generate ISO image for booting.&lt;br /&gt;
# Note: This currently works only for BIOS.&lt;br /&gt;
#genisoimage -rational-rock -cache-inodes -joliet -full-iso9660-filenames \&lt;br /&gt;
#    -input-charset UTF-8 -f -b isolinux/isolinux.bin -c isolinux/boot.cat \&lt;br /&gt;
#    -no-emul-boot -boot-load-size 4 -boot-info-table \&lt;br /&gt;
#    -o /var/tmp/debian-boot-&amp;quot;${DST_ARCH}&amp;quot;.iso /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Anpassungen für ISO-Generation ==&lt;br /&gt;
Als quasi &amp;quot;Abfallprodukt&amp;quot; kann aus dem sowieso schon vorhandenen Squashfs ein ISO-Image erzeugt werden, als zweiter Weg zum Booten von einem System. Falls das gewünscht ist, muss der entsprechende Aufruf von &#039;&#039;genisoimage&#039;&#039; im weiter oben gezeigten Script einkommentiert werden.&lt;br /&gt;
&lt;br /&gt;
Die hierzu notwendigen Pakete &#039;&#039;genisoimage&#039;&#039; und &#039;&#039;isolinux&#039;&#039; wurden bereits oben installiert. Im Endeffekt fehlen eine Handvoll Dateien (Symlinks) und eine Konfigurationsdatei für Isolinux.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration für das Bootmenü beim Boot vom ISO-Image muss in der Datei &#039;&#039;/var/nfsboot/deb-live/isolinux.cfg&#039;&#039; gespeichert werden:&lt;br /&gt;
 prompt 0&lt;br /&gt;
 menu title Boot Menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 timeout 20&lt;br /&gt;
 &lt;br /&gt;
 label linux&lt;br /&gt;
 	menu label ^Debian Live&lt;br /&gt;
 	kernel /boot/vmlinuz&lt;br /&gt;
 	append initrd=/boot/initrd.img net.ifnames=0 biosdevname=0 boot=live live-media-path=/ consoleblank=0&lt;br /&gt;
 	menu default&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
 	menu label Boot ^local disk&lt;br /&gt;
  	localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Danach werden noch ein paar zum Booten notwendige Verzeichnisse und Symlinks zu Dateien angelegt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern. Da &#039;&#039;genisoimage&#039;&#039; mit dem Parameter &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; aufgerufen wird, landen im Image keine Symlinks, sondern die eigentlichen Dateien (dereference).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/nfsboot/deb-live&lt;br /&gt;
mkdir amd64/boot amd64/isolinux i686/boot i686/isolinux&lt;br /&gt;
&lt;br /&gt;
# Symlinks für Kernel und Initrd.&lt;br /&gt;
cd amd64/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/amd64/* .&lt;br /&gt;
cd ../../i686/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/i686/* .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../amd64/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../i686/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3126</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3126"/>
		<updated>2025-09-02T21:46:42Z</updated>

		<summary type="html">&lt;p&gt;PoC: Überarbeitet, ISO-Image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
* Ssh-Zugriff ist standardmäßig erstmal nicht möglich. Das ist besonders schmerzhaft für Server mit wackeligem und bocklahmem Remote-Management, die dann Textmode über VNC-ähnliche Protokolle übertragen. Von den Schwierigkeiten mit Sonderzeichen auf der Tastatur ganz zu schweigen.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Danach kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen &amp;quot;Architekturen&amp;quot; zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install debootstrap genisoimage isc-dhcp-server isolinux nfs-kernel-server openbsd-inetd pxelinux squashfs-tools syslinux-common syslinux-efi tftp-hpa tftpd-hpa&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die Konfiguration des bestehenden Servers mit eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.255;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&amp;lt;ref&amp;gt;Dies ist notwendig, damit die später angelegten Symlinks auch aufgelöst werden.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Anmerkungen:&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche Netzwerkinterfacebenennung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian jeweils von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    bookworm &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP.&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving.&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# Generate ISO image for booting.&lt;br /&gt;
# Note: This currently works only for BIOS.&lt;br /&gt;
#genisoimage -rational-rock -cache-inodes -joliet -full-iso9660-filenames \&lt;br /&gt;
#    -input-charset UTF-8 -f -b isolinux/isolinux.bin -c isolinux/boot.cat \&lt;br /&gt;
#    -no-emul-boot -boot-load-size 4 -boot-info-table \&lt;br /&gt;
#    -o /var/tmp/debian-boot-&amp;quot;${DST_ARCH}&amp;quot;.iso /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Anpassungen für ISO-Generation ==&lt;br /&gt;
Als quasi &amp;quot;Abfallprodukt&amp;quot; kann aus dem sowieso schon vorhandenen Squashfs ein ISO-Image erzeugt werden, als zweiter Weg zum Booten von einem System. Falls das gewünscht ist, muss der entsprechende Aufruf von &#039;&#039;genisoimage&#039;&#039; im weiter oben gezeigten Script einkommentiert werden.&lt;br /&gt;
&lt;br /&gt;
Die hierzu notwendigen Pakete &#039;&#039;genisoimage&#039;&#039; und &#039;&#039;isolinux&#039;&#039; wurden bereits oben installiert. Im Endeffekt fehlen eine Handvoll Dateien (Symlinks) und eine Konfigurationsdatei für Isolinux.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration für das Bootmenü beim Boot vom ISO-Image muss in der Datei &#039;&#039;/var/nfsboot/deb-live/isolinux.cfg&#039;&#039; gespeichert werden:&lt;br /&gt;
 prompt 0&lt;br /&gt;
 menu title Boot Menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 timeout 20&lt;br /&gt;
 &lt;br /&gt;
 label linux&lt;br /&gt;
	menu label ^Debian Live&lt;br /&gt;
 	kernel /boot/vmlinuz&lt;br /&gt;
 	append initrd=/boot/initrd.img net.ifnames=0 biosdevname=0 boot=live live-media-path=/ consoleblank=0&lt;br /&gt;
 	menu default&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
 	menu label Boot ^local disk&lt;br /&gt;
  	localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
Danach werden noch ein paar zum Booten notwendige Verzeichnisse und Symlinks zu Dateien angelegt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht manuell nachbessern. Da &#039;&#039;genisoimage&#039;&#039; mit dem Parameter &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt; aufgerufen wird, landen im Image keine Symlinks, sondern die eigentlichen Dateien (dereference).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/nfsboot/deb-live&lt;br /&gt;
mkdir amd64/boot amd64/isolinux i686/boot i686/isolinux&lt;br /&gt;
&lt;br /&gt;
# Symlinks für Kernel und Initrd.&lt;br /&gt;
cd amd64/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/amd64/* .&lt;br /&gt;
cd ../../i686/boot&lt;br /&gt;
ln -sf ../../../../tftpboot/deb-live/i686/* .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../amd64/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&lt;br /&gt;
# Boot-Dateien von Isolinux und Syslinux (Menü!) einbauen.&lt;br /&gt;
cd ../../i686/isolinux&lt;br /&gt;
ln -s ../../isolinux.cfg .&lt;br /&gt;
ln -s ../../../../../usr/lib/ISOLINUX/isolinux.bin .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=APC-USV_an_AS/400&amp;diff=3125</id>
		<title>APC-USV an AS/400</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=APC-USV_an_AS/400&amp;diff=3125"/>
		<updated>2025-08-08T16:37:17Z</updated>

		<summary type="html">&lt;p&gt;PoC: +link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME}}&lt;br /&gt;
&#039;&#039;&#039;Artikelrumpf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.apc.com/us/en/faqs/FA159551/ UPS Signalling Bundle for IBM AS/400 &amp;amp; IBMi (IBM Power Systems)] auf &#039;&#039;apc.com&#039;&#039;&lt;br /&gt;
* [https://www.eaton.com/content/dam/eaton/products/backup-power-ups-surge-it-power-distribution/power-management-software-connectivity/eaton-relay-card-ms/eaton-relay-card-ms-user-guide.pdf.pdf Eaton Management Card Contact &amp;amp; RS232 / Serial], PDF&lt;br /&gt;
* [https://www.ibm.com/support/pages/connecting-ups-ibm-power-systems-server Connecting a UPS to an IBM Power Systems Server] auf &#039;&#039;ibm.com&#039;&#039;&lt;br /&gt;
* [https://www.ibm.com/docs/en/i/7.5.0?topic=program-controlled-shutdown-concepts Controlled shutdown concepts] auf &#039;&#039;ibm.com&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;br /&gt;
[[Kategorie: Kabel]]&lt;br /&gt;
[[Kategorie: Pinbelegung]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=APC-USV_an_AS/400&amp;diff=3124</id>
		<title>APC-USV an AS/400</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=APC-USV_an_AS/400&amp;diff=3124"/>
		<updated>2025-08-05T17:11:40Z</updated>

		<summary type="html">&lt;p&gt;PoC: Linkfix/Ergänzung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FIXME}}&lt;br /&gt;
&#039;&#039;&#039;Artikelrumpf&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.apc.com/us/en/faqs/FA159551/ UPS Signalling Bundle for IBM AS/400 &amp;amp; IBMi (IBM Power Systems)] auf &#039;&#039;apc.com&#039;&#039;&lt;br /&gt;
* [https://www.eaton.com/content/dam/eaton/products/backup-power-ups-surge-it-power-distribution/power-management-software-connectivity/eaton-relay-card-ms/eaton-relay-card-ms-user-guide.pdf.pdf Eaton Management Card Contact &amp;amp; RS232 / Serial], PDF&lt;br /&gt;
* [https://www.ibm.com/support/pages/connecting-ups-ibm-power-systems-server Connecting a UPS to an IBM Power Systems Server] auf &#039;&#039;ibm.com&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;br /&gt;
[[Kategorie: Kabel]]&lt;br /&gt;
[[Kategorie: Pinbelegung]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=LTO-Tape_Statistiken_unter_Linux_auslesen&amp;diff=3123</id>
		<title>LTO-Tape Statistiken unter Linux auslesen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=LTO-Tape_Statistiken_unter_Linux_auslesen&amp;diff=3123"/>
		<updated>2025-07-26T12:43:28Z</updated>

		<summary type="html">&lt;p&gt;PoC: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Verschiedene &#039;&#039;&#039;Statistiken von LTO-Laufwerken&#039;&#039;&#039;&amp;lt;ref&amp;gt;… und vermutlich anderen Laufwerkstypen…&amp;lt;/ref&amp;gt; und -Cartridges lassen sich &#039;&#039;&#039;unter Linux&#039;&#039;&#039; mit den sg3-utils auslesen.&lt;br /&gt;
&lt;br /&gt;
Zuvor muss mit &amp;lt;code&amp;gt;lsscsi -g&amp;lt;/code&amp;gt; die Zuordnung von SCSI-Geräten zu SCSI-Generic Gerätedateien ausgegeben werden:&lt;br /&gt;
 [7:0:2:0]    tape    HP       Ultrium 2-SCSI   S63D  /dev/st0   /dev/sg0 &lt;br /&gt;
&lt;br /&gt;
== Laufwerkstemperatur ==&lt;br /&gt;
 sg_logs -t /dev/sg0&lt;br /&gt;
&lt;br /&gt;
== Cartridge-Statistiken ==&lt;br /&gt;
 sg_read_attr /dev/sg0&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datensicherung]]&lt;br /&gt;
[[Kategorie:Hardware]]&lt;br /&gt;
[[Kategorie:Linux]]&lt;br /&gt;
[[Kategorie:Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=LTO-Tape_Statistiken_unter_Linux_auslesen&amp;diff=3122</id>
		<title>LTO-Tape Statistiken unter Linux auslesen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=LTO-Tape_Statistiken_unter_Linux_auslesen&amp;diff=3122"/>
		<updated>2025-07-26T12:43:05Z</updated>

		<summary type="html">&lt;p&gt;PoC: Neu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Verschiedene &#039;&#039;&#039;Statistiken von LTO-Laufwerken&#039;&#039;&#039;&amp;lt;ref&amp;gt;… und vermutlich anderen Laufwerkstypen…&amp;lt;/ref&amp;gt; und -Cartridges lassen sich &#039;&#039;&#039;unter Linux&#039;&#039;&#039; mit den sg3-utils auslesen.&lt;br /&gt;
&lt;br /&gt;
Zuvor muss mit &amp;lt;code&amp;gt;lsscsi -g&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt; die Zuordnung von SCSI-Geräten zu SCSI-Generic Gerätedateien ausgegeben werden:&lt;br /&gt;
 [7:0:2:0]    tape    HP       Ultrium 2-SCSI   S63D  /dev/st0   /dev/sg0 &lt;br /&gt;
&lt;br /&gt;
== Laufwerkstemperatur ==&lt;br /&gt;
 sg_logs -t /dev/sg0&lt;br /&gt;
&lt;br /&gt;
== Cartridge-Statistiken ==&lt;br /&gt;
 sg_read_attr /dev/sg0&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datensicherung]]&lt;br /&gt;
[[Kategorie:Hardware]]&lt;br /&gt;
[[Kategorie:Linux]]&lt;br /&gt;
[[Kategorie:Storage]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Netzwerkperformance_mit_alten_Macs_und_Linux&amp;diff=3120</id>
		<title>Netzwerkperformance mit alten Macs und Linux</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Netzwerkperformance_mit_alten_Macs_und_Linux&amp;diff=3120"/>
		<updated>2025-06-24T09:05:13Z</updated>

		<summary type="html">&lt;p&gt;PoC: Korrekte Syntax für iptables ausfindig gemacht&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Helios_LANTest.png|thumb|right|AFP-Performance nach dem Abschalten von Window Scaling - immerhin knapp 1,6&amp;amp;thinsp;MBytes/s beim Schreiben statt nur knapp 11&amp;amp;thinsp;KBytes/s vorher.]]&lt;br /&gt;
Bei &#039;&#039;&#039;älteren Macs&#039;&#039;&#039; ist feststellbar, dass ab einer bestimmten — älteren — &#039;&#039;&#039;Linux&#039;&#039;&#039;-Kernelversion die Schreibgeschwindigkeit von TCP-Verbindungen (z.&amp;amp;thinsp;B. AFP oder FTP) im unteren zweistelligen Kilobyte/s-Bereich liegt.&lt;br /&gt;
&lt;br /&gt;
Test haben gezeigt, dass MacTCP als auch OpenTransport bis einschliesslich Version 1.2 mit [https://de.wikipedia.org/wiki/TCP_Receive_Window#TCP_Window_Scale_Option TCP Window Scaling] nicht zurechtkommen. Testumgebung war ein PowerMac 7500 mit 400&amp;amp;thinsp;MHz MPC750 (G3)-CPU, einer auf einem DEC-Chipsatz basierenden 100MBit/s Netzwerkkarte von Kingston unter MacOS 7.6.1.&lt;br /&gt;
&lt;br /&gt;
== Lösungswege ==&lt;br /&gt;
Die aufgezeigten Lösungswege berücksichtigen (derzeit) nicht, dass zwischen Lesen und Schreiben noch immer fast eine Größenordnung an Übertragungsgeschwindigkeitsunterschied besteht.&lt;br /&gt;
&lt;br /&gt;
=== Iptables ===&lt;br /&gt;
 iptables -t mangle -A OUTPUT -d 192.168.0.128 -p tcp --tcp-option 3 -j TCPOPTSTRIP --strip-options wscale&lt;br /&gt;
&lt;br /&gt;
=== Global (sysctl) ===&lt;br /&gt;
Global kann Window Scaling deaktiviert werden mit:&lt;br /&gt;
 echo 0 &amp;gt; /proc/sys/net/ipv4/tcp_window_scaling&lt;br /&gt;
bzw.&lt;br /&gt;
 sysctl -w net.ipv4.tcp_window_scaling = 0&lt;br /&gt;
Neustartfest wird der Parameter durch einen entsprechenden Eintrag in &#039;&#039;/etc/sysctl.conf&#039;&#039;:&lt;br /&gt;
 net.ipv4.tcp_window_scaling = 0&lt;br /&gt;
&lt;br /&gt;
Transfers zu anderen Maschinen dürften je nach Übertragungsmedium nun auch langsamer werden.&lt;br /&gt;
&lt;br /&gt;
=== Middlebox ===&lt;br /&gt;
Als Alternative zum harten Abschalten des Window Scaling besteht die Möglichkeit, durch Zwischenschalten z.&amp;amp;thinsp;B. einer [[Cisco PIX Konfigurationsbeispiele|Cisco PIX]] oder ASA den Paketfluss zu modifizieren (Konfigurationsausschnitt):&lt;br /&gt;
 class-map match-any&lt;br /&gt;
  match any&lt;br /&gt;
 !&lt;br /&gt;
 tcp-map preset_tcp_map&lt;br /&gt;
  tcp-options window-scale clear&lt;br /&gt;
 !&lt;br /&gt;
 policy-map global_policy&lt;br /&gt;
  class match-any&lt;br /&gt;
   set connection advanced-options preset_tcp_map&lt;br /&gt;
&lt;br /&gt;
Nachteile dieser Lösung:&lt;br /&gt;
* zusätzlicher Stromverbrauch,&lt;br /&gt;
* Lässt kein AppleTalk durch (auch nicht im Transparentmodus).&lt;br /&gt;
&lt;br /&gt;
=== TCP-Proxy ===&lt;br /&gt;
Eine andere Möglichkeit wäre durch eine virtuelle Maschine mit wie oben gezeigt, global abgeschaltetem Window Scaling gegeben. Über den &#039;&#039;xinetd&#039;&#039; lassen sich Proxydienste auf IP Layer-4-Ebene abbilden. Ausschnitt aus einer Beispielkonfiguration &#039;&#039;/etc/xinetd.d/afp-proxy&#039;&#039;:&lt;br /&gt;
 service afp-proxy&lt;br /&gt;
 {&lt;br /&gt;
        id = afp-proxy&lt;br /&gt;
        type = UNLISTED&lt;br /&gt;
        disable = no&lt;br /&gt;
        wait = no&lt;br /&gt;
        protocol = tcp&lt;br /&gt;
        user = root&lt;br /&gt;
        group = nogroup&lt;br /&gt;
        log_type = syslog daemon info&lt;br /&gt;
        port = 548&lt;br /&gt;
        redirect = 192.168.0.1 548&lt;br /&gt;
 }&lt;br /&gt;
Sprich, eine TCP-Verbindung wird nicht zum eigentlichen AFP-Server auf der 192.168.0.1 aufgebaut, sondern auf zur VM, auf der der &#039;&#039;xinetd&#039;&#039; läuft. Diese erzeugt dann eine neue TCP-Verbindung zum eigentlichen AFP-Server.&lt;br /&gt;
&lt;br /&gt;
Nachteile dieser Lösung:&lt;br /&gt;
* Lästig, weil der AFP-Server via AppleTalk unter anderem Namen angesprochen werden muss als per TCP.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://juljas.net/lpt/post/slow-connection Very slow or dying Internet connection to some hosts]&lt;br /&gt;
* [http://kb.pert.geant.net/PERTKB/WindowScalingProblems The window scaling problem]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Mac OS]]&lt;br /&gt;
[[Kategorie:Linux]]&lt;br /&gt;
[[Kategorie:Netzwerk]]&lt;br /&gt;
[[Kategorie:Cisco]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3118</id>
		<title>Steam-Client auf Debian-Linux optimal einrichten</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3118"/>
		<updated>2025-04-28T23:06:52Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Steam-Client */ update is required&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Steam lädt beim Starten pro Benutzer ggfs. ein Update herunter und installiert dies in &#039;&#039;~/.local/share/Steam/&#039;&#039;. Derzeit fasst dieses Verzeichnis 213&amp;amp;thinsp;MiB. Um diesen unnötigen Overhead abzumildern, verschieben wir die Daten an einen zentralen Platz.&lt;br /&gt;
&lt;br /&gt;
Updates müssen trotzdem als &#039;&#039;root&#039;&#039; erfolgen, da nur dieser Benutzer die Dateien überschreiben darf.&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Die zugehörigen Libraries sind allerdings nicht für 64-Bit x86 verfügbar, weswegen zuvor diese teilweise kompatible Architektur angeknipst werden muss.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --add-architecture i386&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Zuge dessen werden einige benötigte 32-Bit Libraries installiert und eine Bestätigung der Lizenzbedingungen abgefragt.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/games/steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen ein Update. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsamen Datenpool einrichten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir /usr/local/share/games&lt;br /&gt;
mv ~/.local/share/Steam /usr/local/games&lt;br /&gt;
ln -s /usr/local/games/Steam ~/.local/share/Steam&lt;br /&gt;
chgrp -R games /usr/local/games/Steam&lt;br /&gt;
find /usr/local/games/Steam -type d -exec chmod 2755 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -exec chmod 644 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod 755 {} \;&lt;br /&gt;
chmod 755 /usr/local/games/Steam/steamcmd/linux32/steamcmd /usr/local/games/Steam/steamcmd/linux32/steamerrorreporter&lt;br /&gt;
chmod 2770 /usr/local/games/Steam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Symlink in Zeile 3 ist für jeden Benuzer der Steam benutzen darf vorab einzurichten. Ggfs. ist der übrige Verzeichnisbaum &#039;&#039;~/.local/share&#039;&#039; vorher anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Shellscript zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Änderungen in Gruppenzuordnungen und des &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; werden erst nach einem Neulogin aktiv.&lt;br /&gt;
&lt;br /&gt;
Damit sind die Vorbereitungen für die Installation von z.&amp;amp;thinsp;B. &#039;&#039;Dedicated Servern&#039;&#039; abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=UUCP-Mail-News-FAQ&amp;diff=3116</id>
		<title>UUCP-Mail-News-FAQ</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=UUCP-Mail-News-FAQ&amp;diff=3116"/>
		<updated>2024-12-31T17:15:14Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Historie */ Tippfehler in Mailadresse korrigiert.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;… oder wie einfach es sein kann, &#039;&#039;sendmail&#039;&#039;, &#039;&#039;inn&#039;&#039; und &#039;&#039;Taylor uucp&#039;&#039; unter Linux unter einen Hut zu bringen.&lt;br /&gt;
&lt;br /&gt;
==  Was ist UUCP? ==&lt;br /&gt;
UUCP heißt ausgeschrieben &#039;&#039;Unix to Unix CoPy&#039;&#039;, und ist eine Sammlung verschiedener Übertragungsprotokolle, die nicht nur einfach Dateien schaufeln, sondern auch auf dem entfernten Rechner Programme starten können, welche im Allgemeinen die übertragenen Daten gleich weiterverarbeiten. Ursprünglich diente UUCP aber hauptsächlich zur Dateiübertragung.&lt;br /&gt;
&lt;br /&gt;
Im einfachsten Sinne kann man UUCP mit &#039;&#039;rcp&#039;&#039; gleichsetzen, nur dass UUCP bessere Möglichkeiten zum unbeaufsichtigten Betrieb hat und keine bestehende IP-Verbindung voraussetzt, sowie weitergehende Authentisierungsmöglichkeiten als &#039;&#039;.rhosts&#039;&#039; ermöglicht. Es wurde ursprünglich für Modem-Strecken entwickelt, funktioniert aber auch problemlos über IP.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;uucp&#039;&#039;- oder &#039;&#039;uux&#039;&#039;-Programm macht allerdings nicht die eigentliche Arbeit, es legt normalerweise nur die Jobs (oder eine Referenz darauf, je nach Aufrufparameter) in ein Spoolverzeichnis, aus dem der &#039;&#039;uucico&#039;&#039;-Dämon liest und die Jobs entsprechend verarbeitet. Dafür, dass &#039;&#039;uucico&#039;&#039; regelmäßig aufgerufen wird, um die Jobs abzuarbeiten, muß der Administrator selbst Sorge tragen (cron).&lt;br /&gt;
&lt;br /&gt;
=== Wofür braucht man sowas? ===&lt;br /&gt;
Bedeutung hat UUCP heutzutage nur für den Nachrichtenaustausch. Früher wurde fast alles per uucp übertragen, heute wird nur noch selten Mail und News per uucp verschickt, da das Batching auf dem Remote-System erfolgt und keine feste IP benötigt, wie manche SMTP-Expensive-Krücken.&lt;br /&gt;
&lt;br /&gt;
Für diese Mail und News ist uucp bei dial-up Systemen das effizienteste Verfahren, da vor allem (in der Regel) platzintensive News vor der Übertragung gepackt vorliegen können und die Bandbreite so am besten ausgenutzt werden kann. Es gibt auch Möglichkeiten, Mail zu packen (Stichwort &#039;&#039;bsmtp&#039;&#039;), aber es ist weder vernünftig standardisiert noch verbreitet. Andererseits packen Modems seit Generationen die Daten in Hardware, sodaß der Packpunkt bei Dialupstrecken eigentlich nur bei (unkomprimierten) X.75-ISDN-Verbindungen wirklich interessant ist.&lt;br /&gt;
&lt;br /&gt;
Der User braucht sich im Idealfall keine Gedanken mehr um seine Einwahl beim UUCP-Host zu machen, ein Cronjob erledigt das normalerweise, holt die dort liegenden Daten ab und schickt gleichzeitig die lokalen neuen Nachrichten zum Provider. UUCP kann auch problemlos über TCP gefahren werden, man muß dann aber aufpassen, dass kein Protokoll für die Übertragung fest eingestellt ist; das Protokoll &#039;&#039;i&#039;&#039; arbeitet unter Linux ab Kernel 2.4 z.&amp;amp;thinsp;B. nicht mehr zuverlässig bei großen Dateien.&lt;br /&gt;
&lt;br /&gt;
Eine Anbindung per UUCP macht heutzutage nur dann Sinn, wenn eine Einwahl fuer jede einzelne SMTP-Verbindung vermieden werden soll, wie das bei einem System mit einem normal eingerichteten Mailer ohne schmutzige Tricks auch der Fall wäre (egal ob die Mails &#039;raus oder &#039;rein sollen). Durch das Batching von UUCP wird die Effektivität erhöht, die bidirektionalen internen Protokolle nutzen die Verbindungen auch besser aus als SMTP über IP. Eine weitere Einsatzmöglichkeit ist die Übertragung vom Mailgateway in einer DMZ auf den Mailserver im internen Netz, falls firewallseitig kein Paketfilter, sondern reine Proxylösungen zum Einsatz kommen.&lt;br /&gt;
&lt;br /&gt;
=== Auf welchen Plattformen gibt’s das? ===&lt;br /&gt;
So ziemlich auf allen. Manche kommerzielle Unixvarianten haben möglicherweise noch Versionen, die die Features von Taylor UUCP nicht besitzen. In vielen Fällen läßt sich Taylor UUCP aber auch auf diesen Systemen problemlos zusammenkompilieren. Die gängigen modernen Distributionen liefern allerdings alle die entsprechenden Pakete mit.&lt;br /&gt;
&lt;br /&gt;
Auf dem Mac existiert MacUCP, welches aber leider vom Autor nicht mehr gepflegt wird; Es unterstützt zum Beispiel noch kein &#039;&#039;i&#039;&#039;-Protokoll.&lt;br /&gt;
&lt;br /&gt;
Links und Ergänzungen für andere Betriebssysteme werden per Mail gerne angenommen.&lt;br /&gt;
&lt;br /&gt;
== Wie ist es organisiert? ==&lt;br /&gt;
UUCP auf Unix (und bei der hier behandelten Version von Ian Taylor unter der Debian-Distribution von Linux) besteht aus nachfolgenden Dateien und Verzeichnissen:&lt;br /&gt;
&lt;br /&gt;
* Dem Hauptverzeichnis, allgemein &#039;&#039;&#039;/var/spool/uucp/&#039;&#039;&#039;, Rechte normalerweise uucp:uucp 750. Für jedes Remote-System gibt es ein Unterverzeichnis mit dem Namen des Systems (werden automatisch angelegt). Darunter gibt es jeweils drei Verzeichnisse:&lt;br /&gt;
** &#039;&#039;&#039;D./&#039;&#039;&#039;&amp;lt;br /&amp;gt;hier stehen die eigentlichen Daten (deren Inhalt), allerdings nicht mit Originalnamen.&lt;br /&gt;
** &#039;&#039;&#039;C./&#039;&#039;&#039;&amp;lt;br /&amp;gt;hier steht für jede Datei in &#039;&#039;D./&#039;&#039; eine nicht mit der Datenseite gleichnamige Datei, in der die Kommandos drin stehen die auf der Remote Seite ausgeführt werden sollen. Über diesen Dateinamen wir die mit &#039;&#039;uustat&#039;&#039; ausgegebene Job-ID erzeugt.&lt;br /&gt;
** &#039;&#039;&#039;X./&#039;&#039;&#039;&amp;lt;br /&amp;gt;hier steht nach dem Empfang von Daten das Futter für den &#039;&#039;uuxqt&#039;&#039;, den Dämon, der das ausführt, was auf dem Remote-System vorher in &#039;&#039;C./&#039;&#039; gestanden hat.&lt;br /&gt;
&lt;br /&gt;
* Im Logverzeichnis liegen eine Log- und ein Statusdatei, welche Informationen über die UUCP-Tätigkeit enthalten. &#039;&#039;uustat&#039;&#039; benutzt die Statusdatei, ebenfalls der Cronjob für das Reporting.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;/var/spool/uucppublic/&#039;&#039;&#039; ist eine Art &#039;&#039;public directory&#039;&#039; mit den Rechten &amp;lt;code&amp;gt;rwxrwxrwt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;uucp:uucp&amp;lt;/code&amp;gt;. Hier werden z.&amp;amp;thinsp;B. an Benutzer adressierte Kopien abgelegt.&lt;br /&gt;
* &#039;&#039;&#039;/etc/uucp/&#039;&#039;&#039; beherbergt die Konfigurationsdateien.&lt;br /&gt;
* &#039;&#039;&#039;/usr/lib/uucp/&#039;&#039;&#039; beherbergt verschiedene ausführbare Dateien und Dämonen. Manchmal liegen diese auch in &#039;&#039;/usr/libexec/uucp&#039;&#039; (NetBSD).&lt;br /&gt;
* In &#039;&#039;&#039;/usr/bin/&#039;&#039;&#039; liegen die Benutzerprogramme selbst.&lt;br /&gt;
&lt;br /&gt;
Daneben gibt es noch ein paar Verzeichnisse die temporäre Daten enthalten und ein &#039;&#039;/var/spool/uucp/.Failed/&#039;&#039;-Verzeichnis, das die schiefgegangenen Daten und Kommandos für jedes Remote System getrennt enthält. Hier ist die Stelle wo man bei einem Ausführungsfehler der Kommandos seinen Kram retten kann, indem man einfach Daten- und Kommandodateien wieder an Ort und Stelle schafft (nach &#039;&#039;X./&#039;&#039; und &#039;&#039;D./&#039;&#039;) und den &#039;&#039;uuxqt&#039;&#039; von Hand aufruft, was aber auch nicht zwangsweise funktionieren muß, wenn die Daten selbst schadhaft sind oder die Zugriffsrechte nicht stimmen. Es ist sicherlich kein Fehler, sich den Kram vorher anzusehen.&lt;br /&gt;
&lt;br /&gt;
=== Welche Programme gibt es, was tun sie? ===&lt;br /&gt;
Eine Übersicht über die häufigst gebrauchten Programme und ihre Berechtigungen:&lt;br /&gt;
* &#039;&#039;&#039;/usr/lib/uucp/uucico&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Dämon, der die eigentlichen Jobs erledigt, läßt sich z.&amp;amp;thinsp;B. mit Cron regelmäßig aufwecken, damit er nachsehen kann, ob&#039;s Arbeit gibt. Er muß auch als Shell für die Accounts eingetragen sein, die (dann halt ausschließlich) UUCP machen sollen. Besser (sicherer und weniger aufwendig) ist aber, die eingebaute Getty-Funktion zu benutzen.&lt;br /&gt;
* &#039;&#039;&#039;/usr/lib/uucp/uuxqt&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Dämon führt die Kommandos in den übertragenen Dateien aus.&lt;br /&gt;
* &#039;&#039;&#039;/usr/lib/uucp/uuchk&#039;&#039;&#039; (-rwxr-xr-x, root:root)&amp;lt;br /&amp;gt;Das Programm zeigt die gesamte Konfiguration human-readable an und ist angenehmerweise sehr gesprächig, was die Fehlersuche ungemein erleichtert.&lt;br /&gt;
* &#039;&#039;&#039;/usr/bin/uucp&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Setzt einen Kopierjob in die Queue.&lt;br /&gt;
* &#039;&#039;&#039;/usr/bin/uux&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Setzt einen Executejob in die Queue.&lt;br /&gt;
* &#039;&#039;&#039;/usr/bin/uuname&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Zeigt alle in &#039;&#039;sys&#039;&#039; spezifizierten Systeme oder den eigenen Namen an.&lt;br /&gt;
* &#039;&#039;&#039;/usr/bin/uustat&#039;&#039;&#039; (-r-sr-sr-x, uucp:uucp)&amp;lt;br /&amp;gt;Zeigt Informationen über ausstehende Jobs. Damit können Jobs z.&amp;amp;thinsp;B. auch gekillt werden, z.&amp;amp;thinsp;B. falls eine Mail nun doch nicht verschickt werden soll.&lt;br /&gt;
Beispiele:&lt;br /&gt;
 uustat -s pocmail&lt;br /&gt;
zeigt alle Jobs die zur Auslieferung an das System pocmail bereitliegen mit ID an.&lt;br /&gt;
 uustat -k pocmail.CR45hqWAAAgggy&lt;br /&gt;
löscht den zur Übertragung anstehenden Job mit z.B. der ID pocmail.CR45hqWAAAgggy aus der Queue.&lt;br /&gt;
&lt;br /&gt;
=== Welche Konfigurationsdateien gibt es, was tun sie? ===&lt;br /&gt;
Es gibt sechs Konfigurationsdateien, die alle nach demselben Schema aufgebaut sind. Als erstes folgen Defaulteinträge, danach durch bestimmte Schlüsselworte getrennt die spezifischen Einstellungen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;sys&#039;&#039;&#039;&amp;lt;br /&amp;gt;Hier werden die remote Systeme konfiguriert sowie Defaults für alle Remotes definiert. Das Schlüsselwort ist hier &#039;&#039;system&#039;&#039; (beginnt einen neuen Abschnitt). Für einen Sys-Eintrag gibt es z.&amp;amp;thinsp;B. ein Unterschlüsselwort &#039;&#039;alternate&#039;&#039;, um eine alternative Erreichbarkeitsmethode zu definieren sowie &#039;&#039;alias&#039;&#039; für einen alternativen Namen für dieses System.&lt;br /&gt;
* &#039;&#039;&#039;port&#039;&#039;&#039;&amp;lt;br /&amp;gt;Hier werden die Schnittstellen wie &#039;&#039;/dev/ttyS&#039;&#039; oder auch Netzverbindungen mit den entsprechenden Parametern konfiguriert. Schlüsselwort ist &#039;&#039;port&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;dial&#039;&#039;&#039;&amp;lt;br /&amp;gt;Hier stehen die Chatscripte für die an den in Port definierten Geräte (Modems). Schlüsselwort ist &#039;&#039;dialer&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;passwd&#039;&#039;&#039;&amp;lt;br /&amp;gt;Hier stehen die Logins der Systeme die anrufen dürfen mit ihren Passworten im Klartext. &#039;&#039;/etc/passwd&#039;&#039; oder shadow wird nicht benutzt. Wird benötigt, wenn uucico im Getty-Mode läft oder Verbindungen über den &#039;&#039;inetd&#039;&#039; annehmen soll.&lt;br /&gt;
* &#039;&#039;&#039;call&#039;&#039;&#039;&amp;lt;br /&amp;gt;Eine Paßworttabelle für die Systeme, die angerufen werden. So weiß der uucico, welches Login-Paßwort-paar er für welches System zu verwenden hat. Die Paßworte brauchen dann nicht im Klartext in &#039;&#039;sys&#039;&#039; stehen, die dann wiederum für jeden lesbar sein darf.&lt;br /&gt;
* &#039;&#039;&#039;config&#039;&#039;&#039;&amp;lt;br /&amp;gt;Hier können einkompilierte Defaults umgebogen werden. Normalerweise beschränkt sich diese Datei auf den UUCP (Node) Namen des lokalen Rechners.&lt;br /&gt;
&lt;br /&gt;
Es wird dringend empfohlen, die Dateien call und passwd auf Mode 640, uucp:uucp zu halten (security)! Besser gleich die Permissions auf 600 stellen, häufig tragen die Leute nämlich diejenigen User, die aufs Modem zugreifen dürfen, in die Gruppe uucp ein und dann dürfen diese Leute plötzlich die Passworte lesen, falls eine Gerätedatei der Gruppe uucp angehört …&lt;br /&gt;
&lt;br /&gt;
=== Wie sieht eine Beispielkonfiguration aus? ===&lt;br /&gt;
In den nicht aufgeführten Dateien stehen meist Defaults, die unverändert übernommen werden können.&lt;br /&gt;
&lt;br /&gt;
==== port ====&lt;br /&gt;
 #&lt;br /&gt;
 # port - Beschreibung der Schnittstellen&lt;br /&gt;
 #&lt;br /&gt;
 speed   38400&lt;br /&gt;
 #&lt;br /&gt;
 port    isdn&lt;br /&gt;
 device  /dev/ttyI2&lt;br /&gt;
 dialer  isdn&lt;br /&gt;
 #&lt;br /&gt;
 port    netz&lt;br /&gt;
 type    tcp&lt;br /&gt;
 #&lt;br /&gt;
 port    seriell&lt;br /&gt;
 device  /dev/ttyS2&lt;br /&gt;
 dialer  generic&lt;br /&gt;
 #&lt;br /&gt;
Ich denke, daß sich hier eine Erklärung erübrigt.&lt;br /&gt;
&lt;br /&gt;
==== config ====&lt;br /&gt;
 #&lt;br /&gt;
 # config - Haupt UUCP-Konfigurations-Datei&lt;br /&gt;
 #&lt;br /&gt;
 nodename poc&lt;br /&gt;
 passwdfile /var/lib/uucp/taylor_config/passwd&lt;br /&gt;
Hier wohl ebenso.&lt;br /&gt;
&lt;br /&gt;
==== sys ====&lt;br /&gt;
 #&lt;br /&gt;
 # sys - Beschreibung der bekannten Systeme&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 # Globale Einstellungen fuer alle Systeme&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 # Passwort und Login aus call lesen&lt;br /&gt;
 call-login      *&lt;br /&gt;
 call-password   *&lt;br /&gt;
 #&lt;br /&gt;
 # Ich darf jederzeit &#039;rausrufen&lt;br /&gt;
 time            any&lt;br /&gt;
 #&lt;br /&gt;
 # Das darf ich ausführen und finde das im command-path&lt;br /&gt;
 commands        uucp rmail rnews&lt;br /&gt;
 command-path    /usr/bin /home/news/bin&lt;br /&gt;
 # Wie führe ich ich einen Login durch&lt;br /&gt;
 chat            ogin: \L word: \P&lt;br /&gt;
 # Grundsätzlich diesen Port benutzen&lt;br /&gt;
 port            netz&lt;br /&gt;
 # Verkettung hier!da!sonstwo erlauben&lt;br /&gt;
 forward         ANY&lt;br /&gt;
 # uucp remote!/tmp/herdamit /tmp erlauben (weil /tmp unterhalb / liegt)&lt;br /&gt;
 local-receive   /&lt;br /&gt;
 #&lt;br /&gt;
 #&lt;br /&gt;
 system          pocmail&lt;br /&gt;
 called-login	pocmail&lt;br /&gt;
 alias           ci&lt;br /&gt;
 address         ci.pocnet.net&lt;br /&gt;
 remote-receive  /home/poc ~   # Darf auf diesem System von fern nur dahin senden&lt;br /&gt;
 remote-send     /home/poc     # Darf auf diesem System von fern nur von da empfangen&lt;br /&gt;
 #&lt;br /&gt;
 system          heiko&lt;br /&gt;
 called-login	heiko&lt;br /&gt;
 time            never         # Der ruft nur hier an&lt;br /&gt;
 remote-receive  /home/heiko ~&lt;br /&gt;
 remote-send     /home/heiko&lt;br /&gt;
 #&lt;br /&gt;
Erläuterung:&lt;br /&gt;
* Commands sind die Kommandos, die ausgeführt werden dürfen. Ohne Pfadangabe eintragen!&lt;br /&gt;
* Command-Path ist der Suchpfad, in dem nach diesen Kommandos gesucht wird. Dieser ist unbedingt richtig anzugeben, da ein &#039;&#039;uux&#039;&#039;-Aufruf mit direkter Pfadangabe ein &amp;lt;code&amp;gt;Permission Denied&amp;lt;/code&amp;gt; provoziert.&lt;br /&gt;
* Chat ist ein wie von PPP bekanntes kleines Expect-Send-Expect … Script, welches den Login durchführt. Nähere Informationen finden sich in der Manpage zu &#039;&#039;chat(8)&#039;&#039;.&lt;br /&gt;
* Called-login ist eine recht nette Sache, um das Faken von Systemen zu unterbinden: So kann man ein System für eingehende Calls an einen Login binden. Normalerweise kann jedes System mit sich jedem in der UUCP-Passwd eingetragenen Login-Paßwort-Paar gegenüber der Gegenseite authentisieren, wenn der Systemname bekannt ist. Wenn man Systemname, Login und Paßwort recht abstrakt wählt, kriegt man UUCP auf diese Weise genau so dicht wie einen normalen POP3 Zugang.&lt;br /&gt;
Aus dieser Beispielkonfiguration lassen sich die wichtigsten eigenen Konfigurationsbedürfnisse befriedigen. Nicht vergessen sollte man allerdings, daß auf der Gegenseite auch ein Eintrag für das eigene System stehen muß!&amp;lt;br /&amp;gt;&lt;br /&gt;
Um zu testen, ob UUCP selbst nun funktioniert, sollte man einen Job in Auftrag geben:&lt;br /&gt;
 uucp -r /bin/bash heiko\!~/poc-bash&lt;br /&gt;
Das nächste Mal, wenn uucico eine Verbindung mit Heiko eingeht (wenn er anruft), wird &#039;&#039;/bin/bash&#039;&#039; nach &#039;&#039;/var/spool/uucppublic/poc-bash&#039;&#039; kopiert. Das Ausrufezeichen muß escaped werden, damit die bash es nicht als Befehlswiederholung (wie sonst üblich) expandiert.&lt;br /&gt;
&lt;br /&gt;
=== Wie funktioniert das mit uucp und Dateien versenden? ===&lt;br /&gt;
Normalerweise expandiert die Shell den UUCP-Pfadtrenner ! als Kommandowiederholung. Daher muß das ! mit \ maskiert werden: \!&amp;lt;br /&amp;gt;&lt;br /&gt;
In der Konfigdatei &#039;&#039;sys&#039;&#039; muß &#039;&#039;uucp&#039;&#039; als Kommando erlaubt sein, falls verkettete Versendungen (&amp;lt;code&amp;gt;uucp hier!da!dort!~user/home/work&amp;lt;/code&amp;gt;) erlaubt sein sollen.&lt;br /&gt;
&lt;br /&gt;
Was in dem Zusammenhang ganz wichtig ist, sind die Zugriffsrechte! Uucp wie auch der uuxqt laufen alle setuid/setgid &#039;&#039;uucp:uucp&#039;&#039;. Sprich, wenn die Konfiguration auch sonstwas erlaubt, je nach setup muß das Directory, aus welchem gelesen werden kann, mindestens Mode 5 (r-x) für &#039;&#039;uucp&#039;&#039; oder dessen Gruppe(n) sein. Für das übergeordnete Directory genügt Mode 1 (--x). Wenn in ein Directory geschrieben werden soll, muß es zusätzlich schreibbar sein, Mode 7 (rwx) oder als Dropbox Mode 3 (-wx), wenn &#039;&#039;uucp&#039;&#039; nicht mehr draus lesen können soll.&lt;br /&gt;
&lt;br /&gt;
Siehe auch die entsprechenden Abschnitte in der UUCP-Dokumentation, Abschnitt &#039;&#039;sys&#039;&#039;-Konfigurationsdatei, Punkte &#039;&#039;local-send&#039;&#039;, &#039;&#039;local-receive&#039;&#039;, &#039;&#039;remote-send&#039;&#039;, &#039;&#039;remote-receive&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== UUCP ist ein Klartextprotokoll. Was ist mit der Security? ===&lt;br /&gt;
Am einfachsten ist es, man tunnelt UUCP über eine SSH-Verbindung.&lt;br /&gt;
&lt;br /&gt;
Zuerst müssen beide beteiligten Seiten per SSH ohne Passwortabfrage einen Login auf die jeweils gegenüberliegende Seite durchführen dürfen. Zum Anlegen der Schlüssel und automatischen hinterlegen des Hostkeys in &#039;&#039;~/.ssh/known_hosts&#039;&#039; empfehle ich, mit &amp;lt;code&amp;gt;su - uucp&amp;lt;/code&amp;gt; als uucp-Benutzer zu arbeiten und nicht als root. Vorteil: Die Dateien landen an den richtigen Stellen und die Zugriffsrechte passen auch von Anfang an.&lt;br /&gt;
&lt;br /&gt;
* Keys auf beiden Hosts anlegen, alle Abfragen mit Return bestätigen.&lt;br /&gt;
 mkdir ~/.ssh&lt;br /&gt;
 ssh-keygen -t rsa -f ~/.ssh/id_rsa -N &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Kopieren des Public-Keys eines Hosts auf den anderen zwecks automatisiertem Login. Das erste &#039;&#039;cat&#039;&#039; gibt die Schlüsselzeile aus, das zweite (muss auf dem jeweils anderen Host ausgeführt werden!) erzeugt die Datei &#039;&#039;authorized_keys&#039;&#039; und hinterlegt den Schlüssel dort. Wichtig, der Key ist und bleibt eine einzige lange Zeile!&lt;br /&gt;
 cat ~/.ssh/id_rsa.pub&lt;br /&gt;
 cat &amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
* Beschränken des Zugriffs mit diesem Schlüssel. Dazu wird vor dem &#039;&#039;ssh-rsa&#039;&#039; noch der folgende Konfiguration ergänzt:&lt;br /&gt;
 &#039;&#039;command=&amp;quot;/usr/sbin/uucico -l&amp;quot;,no-agent-forwarding,no-port-forwarding,no-X11-forwarding&#039;&#039; ssh-rsa AAAAB…&lt;br /&gt;
* Anlegen eines neuen Ports für diese Verbindung in &#039;&#039;/etc/uucp/port&#039;&#039;:&lt;br /&gt;
 port &#039;&#039;uucppeer&#039;&#039;-ssh&lt;br /&gt;
 type pipe&lt;br /&gt;
 command /usr/bin/ssh &#039;&#039;otherside.example.com&#039;&#039;&lt;br /&gt;
 seven-bit false&lt;br /&gt;
 reliable true&lt;br /&gt;
* Änderungen gegenüber einem normalen Host via &#039;&#039;inetd.conf&#039;&#039; in &#039;&#039;/etc/uucp/sys&#039;&#039;:&lt;br /&gt;
 system &#039;&#039;uucppeer&#039;&#039;&lt;br /&gt;
 […]&lt;br /&gt;
 port &#039;&#039;uucppeer&#039;&#039;-ssh&lt;br /&gt;
 protocol t&lt;br /&gt;
* Hinterlegen des Host-Keys in der &#039;&#039;known_hosts&#039;&#039;, Nachfrage bestätigen, beim Loginprompt (von uucico!) dann mit ein paarmal Ctrl-C abbrechen. Es darf kein &amp;quot;nur Passwort&amp;quot;-Prompt erscheinen: Das ist dann ssh und die gegenseitige Auth mit den RSA-Keys funktioniert nicht. Das muss vorher behoben werden.&lt;br /&gt;
 ssh &#039;&#039;otherside.example.com&#039;&#039;&lt;br /&gt;
* Test:&lt;br /&gt;
 uucico -S&#039;&#039;uucppeer&#039;&#039; &amp;amp; tail -f /var/log/uucp/Log&lt;br /&gt;
Im Log steht dann sinngemäß:&lt;br /&gt;
 uucico - - (2018-01-08 13:45:12.79 27991) Incoming call (login &#039;&#039;uucppeer&#039;&#039; port stdin)&lt;br /&gt;
 uucico &#039;&#039;uucppeer2&#039;&#039; - (2018-01-08 13:45:14.80 27991) Handshake successful (protocol &#039;t&#039;)&lt;br /&gt;
 uucico &#039;&#039;uucppeer2&#039;&#039; - (2018-01-08 13:45:14.81 27991) Call complete (2 seconds 0 bytes 0 bps)&lt;br /&gt;
&lt;br /&gt;
== Wie arbeitet UUCP mit Sendmail zusammen? ==&lt;br /&gt;
Mail (und News) Requests werden per &#039;&#039;uux&#039;&#039; übertragen. Sendmail zum Beispiel verfüttert die Mail an dessen &#039;&#039;stdin&#039;&#039; und ein paar Parameter dazu. Auf der Gegenseite ruft nach der Übertragung &#039;&#039;uuxqt&#039;&#039; diese Kommandodatei auf, welche ihrerseits &#039;&#039;rmail&#039;&#039; anwirft, welches dann den Kram in die Sendmail-Queue verschiebt.&amp;lt;br /&amp;gt;&lt;br /&gt;
Sendmail wacht alle paar Minuten aus seinem Dämonenschlaf auf und schaut, ob&#039;s in der Queue was zu schaufeln gibt: Die Mail wird ausgeliefert.&lt;br /&gt;
Wie oft er das tut, wird beim Aufruf von Sendmail mit dem Parameter &amp;lt;code&amp;gt;-q&#039;&#039;xx&#039;&#039;m&amp;lt;/code&amp;gt; festgelegt. Xx ist die Zeit in Minuten zwischen den Queue-Scans. Wenn einen der Delay zwischen &#039;&#039;rmail&#039;&#039; und &amp;lt;code&amp;gt;sendmail -q&amp;lt;/code&amp;gt; nervt, kann man auch &#039;&#039;rmail&#039;&#039; patchen, so daß es nicht mehr &amp;lt;code&amp;gt;sendmail -odq&amp;lt;/code&amp;gt; sondern &amp;lt;code&amp;gt;sendmail -odi&amp;lt;/code&amp;gt; aufruft (entweder im Source ändern oder einfach den einen Buchstaben im Binary patchen), soll mit Emacs gehen (unverified). Der Source liegt sendmail bei.&lt;br /&gt;
&lt;br /&gt;
=== Wie gelangt eine Mail von Sendmail zu UUCP? ===&lt;br /&gt;
In Sendmail gibt es für jede Übertragungsart einen sogenannten Mailer. Das ist das Programm welches die eigentliche Verschiebearbeit tut. Sendmail selbst wurschtelt nur an den Adressen ’rum, bis er weiß, welchen Mailer er benutzen muß. Diese Mailer haben einen symbolischen Namen z.&amp;amp;thinsp;B. &#039;&#039;local&#039;&#039; für das Programm was die Mails lokal auf dem Rechner ausliefert, oder eben auch &#039;&#039;uucp&#039;&#039; für den (oder besser gesagt die) uucp-Mailer. Sendmail ruft als uucp-Mailer direkt &amp;lt;code&amp;gt;/usr/bin/uux&amp;lt;/code&amp;gt; mit bestimmten Parametern auf, die spezifizieren was schlußendlich in der Kommandodatei in &amp;lt;code&amp;gt;/var/spool/uucp/system/C./&amp;lt;/code&amp;gt; drin steht, also den Aufruf von rmail auf der Gegenseite.&lt;br /&gt;
&lt;br /&gt;
Über eine Tabelle, die &#039;&#039;mailertable&#039;&#039;, stellt sendmail fest, daß eine Mail an eine Adresse über UUCP ausgeliefert werden soll und mit welcher Mailer-Spezifikation das geschehen soll. So eine Konfiguration ist zweckmäßig für ein UUCP-Relay, welches Mails per SMTP empfängt und sie per UUCP weiterleitet.&lt;br /&gt;
&lt;br /&gt;
Ein Rechner, der Mails nur über UUCP senden und empfangen kann, braucht einen Defaultmailer, der alle abgesendeten Mails weiterverwurstelt, solange er keine näheren Infos in der &#039;&#039;mailertable&#039;&#039; findet. Im Prinzip kann man das mit der Defaultroute von TCP/IP vergleichen. Findet sich kein Mailer für eine Adresse, wird der Defaultmailer verwendet.&amp;lt;br /&amp;gt;&lt;br /&gt;
Den Defaultmailer in der &#039;&#039;sendmail.cf&#039;&#039; definiert man über den Makro DS: &amp;lt;code&amp;gt;DSuucp-dom:&#039;&#039;remotesys&#039;&#039;&amp;lt;/code&amp;gt;, wobei &#039;&#039;remotesys&#039;&#039; einem Eintrag in &#039;&#039;sys&#039;&#039; entspricht. In der entsprechenden m4-Datei für die Sendmail-Konfigurationszusammenschraubung ist das dann&lt;br /&gt;
 define(`SMART_HOST&#039;, `uucp-dom:remotesys&#039;)dnl.&lt;br /&gt;
&lt;br /&gt;
Beispiel-mailertable zur Sys weiter oben passend:&lt;br /&gt;
 #Domain             mailer:new_domain&lt;br /&gt;
 hk.pocnet.net       uucp-dom:heiko&lt;br /&gt;
Normalerweise muß die Datenbank noch gehasht (indiziert) werden, damit Sendmail ordnungsgemäß darauf zugreifen kann:&lt;br /&gt;
 makemap hash mailertable.db &amp;lt; mailertable&lt;br /&gt;
&lt;br /&gt;
Sendmail merkt durch diese Tabelle, daß Mail an heiko@hk.pocnet.net über UUCP geroutet werden muß, aktiviert den Mailer &#039;&#039;uucp-dom&#039;&#039;, der die Mail im heute üblichen &#039;&#039;user@host.domain&#039;&#039; Stil weiterleitet (in die C./D. Verzeichnisse von uucp legt). &#039;&#039;hk.pocnet.net&#039;&#039; ist in diesem Falle eine Subdomain, uucp funktioniert logischerweise auch mit normalen Domains. Das heißt, im Nameserver für die Zone &#039;&#039;pocnet.net&#039;&#039; müssen entsprechende MX-Einträge stehen, die die Mail an das UUCP-Relay leiten:&lt;br /&gt;
 $ORIGIN pocnet.net.&lt;br /&gt;
 ;For the UUCP-Users&lt;br /&gt;
 hk             IN   MX  1    uucp-host&lt;br /&gt;
&lt;br /&gt;
Als Anmerkung hier nur das Stichwort Replyadresse; eine Mail von &#039;&#039;deep-thought.hk.pocnet.net&#039;&#039; wird zwar richtig ausgeliefert, aber sobald der User einen Reply setzt, funktioniert eine Antwort auf diesen Reply nicht mehr. Das rührt daher, daß es für den Rechner &#039;&#039;deep-thought&#039;&#039; keinen DNS-Eintrag gibt. Lösung: Entweder passende DNS-Zonen mit Rechnernamen anlegen oder den User treten, daß er seine Replyadresse richtig setzt.&lt;br /&gt;
&lt;br /&gt;
Zu beachten ist auch, daß die Hosts nicht in der Klasse &#039;&#039;w&#039;&#039; (lokaler Hostname) auftauchen dürfen, das heißt, ihr darf weder direkt über &#039;&#039;Cwlocalhost andere.dom&#039;&#039; in der &#039;&#039;sendmail.cf&#039;&#039; noch indirekt über die Klassendatei (in der sendmail.cf allgemein über &#039;&#039;Fw/etc/mail/local-host-names&#039;&#039;) ein UUCP-Host zugeordnet werden. Ansonsten würde die Mail lokal ausgeliefert. Wir wollen aber nur weiterleiten (Relaying). Je nach Installation heißt die Datei &#039;&#039;local-host-names&#039;&#039; auch &#039;&#039;sendmail.cw&#039;&#039; und ist unter &#039;&#039;/etc/&#039;&#039; oder &#039;&#039;/etc/mail/&#039;&#039; zu finden.&lt;br /&gt;
&lt;br /&gt;
Ein weiterer interessanter Aspekt zu der Problematik von oben sind wildcard-MXer, Einträge im DNS, der pauschal alle Mail an &#039;&#039;*.pocnet.net&#039;&#039; (Host, nicht User!) an das UUCP-Relay schickt. So eine allgemeine Formulierung ist in der Mailertable auch möglich, der Eintrag muß einfach mit einem Punkt beginnen, um relativ zu sein.&amp;lt;br /&amp;gt;&lt;br /&gt;
Nachteil: Schickt jemand eine Mail an eine nicht existente Subdomain, schicken sich beide UUCP-Systeme die Mail solange zu, bis ein Sendmail aufgibt (normalerweise nach 26 Bounces).&lt;br /&gt;
&lt;br /&gt;
=== Wie kommen die Daten von UUCP zum Sendmail? ===&lt;br /&gt;
[[#Wie gelangt eine Mail von Sendmail zu UUCP?|Weiter oben]] haben wir (ohne Details) gelernt das &#039;&#039;uux&#039;&#039; in der Kommandodatei etwas wie&lt;br /&gt;
 Spezifikation der Daten absender@irgendwo 0 rmail empfänger@irgendwoanders&lt;br /&gt;
einträgt. &#039;&#039;Uuxqt&#039;&#039; macht nun nichts anderes als die empfangene Datei auszuführen, sprich die Daten an &#039;&#039;rmail&#039;&#039; zu verfüttern, welches sie dann brav bei Sendmail abgibt, also in dessen Queue legt. Wie [[#Wie arbeitet UUCP mit Sendmail zusammen?|hier]] bereits beschrieben, schaut Sendmail normalerweise selbständig die Queue regelmäßig durch. Wenn Mails zum Testen sofort ausgeliefert werden sollen, muß Sendmail mit &amp;lt;code&amp;gt;-q&amp;lt;/code&amp;gt; aufgerufen werden, dann schaut er die Queue durch, liefert alles aus und beendet sich wieder. Alternativ kann auch &#039;&#039;rmail&#039;&#039; geändert oder frisch kompiliert werden.&lt;br /&gt;
&lt;br /&gt;
=== Kann mein Sendmail denn UUCP? ===&lt;br /&gt;
Das bleibt festzustellen. Im Zweifelsfalle, testen:&lt;br /&gt;
 leela:/root # fgrep Muucp /etc/mail/sendmail.cf&lt;br /&gt;
 Muucp,          P=/usr/bin/uux, F=DFMhuUd, S=FromU, R=EnvToU/HdrToU,&lt;br /&gt;
 Muucp-old,      P=/usr/bin/uux, F=DFMhuUd, S=FromU, R=EnvToU/HdrToU,&lt;br /&gt;
 Muucp-new,      P=/usr/bin/uux, F=mDFMhuUd, S=FromU, R=EnvToU/HdrToU,&lt;br /&gt;
 Muucp-dom,      P=/usr/bin/uux, F=mDFMhud, S=EnvFromUD/HdrFromSMTP, R=EnvToSMTP,&lt;br /&gt;
 Muucp-uudom,    P=/usr/bin/uux, F=mDFMhud, S=EnvFromUUD/HdrFromSMTP, R=EnvToSMTP,&lt;br /&gt;
&lt;br /&gt;
Wenn da nix erscheint, kann er es nicht. Falls das der Fall sein sollte, nicht verzweifeln, soo schwer ist Sendmail auch nicht.&lt;br /&gt;
&lt;br /&gt;
=== Er kann es nicht, kann ich ihm UUCP beibringen? ===&lt;br /&gt;
Klar! Alle moderneren Distros benutzen einen Weg, aus einer Definitionsdatei (oft &#039;&#039;/etc/mail/sendmail.mc&#039;&#039;) eine entsprechende &#039;&#039;sendmail.cf&#039;&#039; zu generieren.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, dass keinerlei&lt;br /&gt;
 FEATURE(`nouucp&#039;, `nospecial&#039;)dnl&lt;br /&gt;
oder was in der Art in der mc auftaucht.&lt;br /&gt;
&lt;br /&gt;
Folgende Punkte wären noch zu ergänzen, dabei sollten diese entsprechend einsortiert werden, also Feature zu den Features, Mailer zu den Mailern, usw.&lt;br /&gt;
 FEATURE(mailertable)dnl&lt;br /&gt;
 define(`UUCP_MAILER_MAX&#039;, `0&#039;)dnl&lt;br /&gt;
 MAILER(uucp)dnl&lt;br /&gt;
Die verqueren Quotes müssen so übernommen werden, das liegt an m4.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;UUCP_MAILER_MAX&#039;&#039; setzt das Mailgrößenlimit im Beispiel oben auf keins, sonst gehen etwas größere Mails wieder zurück. Danach kann die Mailertable angelegt und gehasht werden (Siehe [[#Wie gelangt eine Mail von Sendmail zu UUCP?|oben]]). Als nächstes gilt es, die Konfigurationsdatei mit m4 zu erstellen, auch das ist wiederum distributionsspezifisch.&lt;br /&gt;
 cd /etc/mail&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Stimmt jetzt alles, kann Sendmail neu gestartet und getestet werden:&lt;br /&gt;
 leela:root # /usr/sbin/sendmail -bv heiko@hk.pocnet.net&lt;br /&gt;
 heiko@hk.pocnet.net… deliverable: mailer uucp-dom, host heiko, user heiko@hk.pocnet.net&lt;br /&gt;
&lt;br /&gt;
Umfangreichere Checks der einzelnen Regelsätze sind mit dem Testmode möglich:&lt;br /&gt;
 ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)&lt;br /&gt;
 Enter &amp;lt;ruleset&amp;gt; &amp;lt;address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach wird explizit Ruleset 3 aufgerufen und die zu testende UUCP-Adresse eingegeben:&lt;br /&gt;
 &amp;gt; 3,0 heiko@hk.pocnet.net&lt;br /&gt;
 canonify           input: heiko @ hk . pocnet . net&lt;br /&gt;
 Canonify2          input: heiko &amp;lt; @ hk . pocnet . net &amp;gt;&lt;br /&gt;
 Canonify2        returns: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 canonify         returns: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 parse              input: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 Parse0             input: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 Parse0           returns: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 ParseLocal         input: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 ParseLocal       returns: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 Parse1             input: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 MailerToTriple     input: &amp;lt; uucp-dom : heiko &amp;gt; heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 MailerToTriple   returns: $# uucp-dom $@ heiko $: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 Parse1           returns: $# uucp-dom $@ heiko $: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
 parse            returns: $# uucp-dom $@ heiko $: heiko &amp;lt; @ hk . pocnet . net . &amp;gt;&lt;br /&gt;
So, das sieht gut aus, der UUCP-DOM-Mailer wird aufgerufen. Sendmail kann UUCP und die Mails werden weitergeroutet. Sendmail kann nun verlassen werden:&lt;br /&gt;
 ^D&lt;br /&gt;
&lt;br /&gt;
=== Eine UUCP-Mail-Client Beispielkonfiguration ===&lt;br /&gt;
[[#Er kann es nicht, kann ich ihm UUCP beibringen?|Oben]] haben wir Sendmail beigebracht, Mails an &#039;&#039;bestimmte&#039;&#039; Domains per UUCP weiterzuleiten. Das paßt wunderbar für eine Site, die Relay spielt, also z.&amp;amp;thinsp;B. für den Rechner beim Provider. Die Rechner, die per UUCP als Clients unter diesem Server hängen, müßten alle möglichen Domains, erst in den Mailertable eintragen, damit Mails ’rausgehen. Das ist natürlich völlig unpraktikabel und deshalb gibt&#039;s da eine Alternative. Man muß einen Default-Mailer deklarieren, der UUCP benutzt. Die m4 Beispielkonfigurationsdatei ohne dann unnötige Mailertable sieht beispielsweise so aus:&lt;br /&gt;
 VERSIONID(`$Id: client.mc, 2.1.3 for sendmail 8.11.0 07/23/00 by PoC Exp $&#039;)dnl&lt;br /&gt;
 OSTYPE(linux)dnl&lt;br /&gt;
 DOMAIN(generic)dnl&lt;br /&gt;
 FEATURE(promiscous_relay)dnl&lt;br /&gt;
 FEATURE(nocanonify)dnl&lt;br /&gt;
 define(`SMART_HOST&#039;, `uucp-dom:&#039;&#039;remotesys&#039;&#039;&#039;)dnl&lt;br /&gt;
 define(`UUCP_MAILER_MAX&#039;, `0&#039;)dnl&lt;br /&gt;
 define(`confTRUSTED_USERS&#039;, `bin&#039;)dnl&lt;br /&gt;
 define(`confPRIVACY_FLAGS&#039;, `goaway&#039;)dnl&lt;br /&gt;
 MAILER(local)dnl&lt;br /&gt;
 MAILER(smtp)dnl&lt;br /&gt;
 MAILER(uucp)dnl&lt;br /&gt;
Das &#039;&#039;Define Smarthost&#039;&#039; definiert den oben beschriebenen Default-Mailer für Mails, die nicht auf dem lokalen Rechner bleiben sollen.&lt;br /&gt;
&lt;br /&gt;
== Wie arbeiten UUCP und INN zusammen? ==&lt;br /&gt;
Das Network News Konzept ist im Vergleich zu Mail komplett anders. News sind Massenartikel und entsprechend diesem massenhaften Auftreten werden News über UUCP auch anders behandelt als Mails.&lt;br /&gt;
&lt;br /&gt;
So werden News normalerweise nicht Artikel für Artikel gesendet sondern als Batch: Mehrere Artikel in einem Archiv, welches häufig noch zusätzlich gepackt (compress) wird, um den Datendurchsatz zu erhöhen.&lt;br /&gt;
&lt;br /&gt;
News werden —ähnlich wie bei Sendmail durch die Mailertable— anhand einer Regeldatei (hier: &#039;&#039;newsfeeds&#039;&#039;) weitergeleitet. Zum anderen werden per UUCP eingegangene News an &#039;&#039;rnews&#039;&#039; verfüttert, der diese gegebenenfalls auspackt, entbatcht und an INN weiterschaufelt.&lt;br /&gt;
&lt;br /&gt;
=== Wie kommen die Daten von UUCP zum INN? ===&lt;br /&gt;
In der Kommandodatei eines Newspaketes steht ein ähnlicher Aufruf wie bei Mail drin, in etwa&lt;br /&gt;
 Spezifikation der Daten 0 rnews.&lt;br /&gt;
&#039;&#039;Uuxqt&#039;&#039; füttert nun &#039;&#039;rnews&#039;&#039; einfach mit den Daten aus dem Datenpaket. Die Daten liegen meist gepackt im Datenpaket vor, send-uucp hat diese beim Versand gepackt (compressed). Das Datenpaket beginnt deshalb mit der Zeile &amp;lt;code&amp;gt;#! cunbatch&amp;lt;/code&amp;gt;, welche dafür sorgt, daß die Datei ordnungsgemäß entpackt wird. Rnews führt nun als erstes dieses Kommando aus. Danach liegt der entpackte Batch vor, alle News aneinandergekleistert und durch eine Zeile &amp;lt;code&amp;gt;#! rnews &#039;&#039;bytes&#039;&#039;&amp;lt;/code&amp;gt; getrennt. Diese Datei wird jetzt von &#039;&#039;rnews&#039;&#039; in einzelne Artikel zerhackt und an INN weitergesendet. Dazu sollte aber ein ME-Eintrag in der &#039;&#039;incoming.conf&#039;&#039; von INN stehen:&lt;br /&gt;
 peer ME {&lt;br /&gt;
    hostname:   &amp;quot;localhost, 127.0.0.1, leela.pocnet.net&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
Details siehe INN-Doku.&lt;br /&gt;
&lt;br /&gt;
=== Wie kommen die Daten vom INN zu uucp? ===&lt;br /&gt;
In &#039;&#039;/etc/news/newsfeeds&#039;&#039; sollte ein Eintrag für das System, welches News empfangen soll stehen. Ich empfehle den UUCP-Namen und den Eintrag in newsfeeds gleich zu halten.&lt;br /&gt;
&lt;br /&gt;
Wenn jetzt ein Artikel neu über einen Kanal (ein beliebiger Feed) eintrifft, wird in einer Datei &#039;&#039;spool/out.going/name&#039;&#039; ein Eintrag auf den Pfad des neu eingetroffenen Artikels hinzugefügt.&lt;br /&gt;
&lt;br /&gt;
Diese Datei dient in festen Zeitabständen (cron) dem Script &#039;&#039;bin/send-uucp&#039;&#039; dazu, die eigentliche Verpackarbeit und uuxerei der Artikel durchzuführen.&lt;br /&gt;
&lt;br /&gt;
=== Eine INN Beispielkonfiguration ===&lt;br /&gt;
Als Beispiel geht es hier um die Rechner &#039;&#039;leela.pocnet.net&#039;&#039; sowie &#039;&#039;deep-thought.hk.pocnet.net&#039;&#039;. Beide Server müssen eine passende Zeile für das &#039;&#039;gegenüberliegende&#039;&#039; System in ihrer Feeddatei &#039;&#039;newsfeeds&#039;&#039; haben:&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!leela (UUCP-Node: poc)&lt;br /&gt;
!deep-thought (UUCP-Node: heiko)&lt;br /&gt;
|-&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|heiko/deep-thought.hk.pocnet.net:poc.*:Tf,Wn:&lt;br /&gt;
|align=&amp;quot;center&amp;quot;|poc/leela.pocnet.net:poc.*:Tf,Wn:&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Anhand des Domainexcludes nach dem ersten / werden Bounces vermieden, das heißt, daß ein Artikel nicht immer wieder für das betreffende System wieder gebatcht wird, sobald er eingetroffen ist. Artikel, die &#039;&#039;hk.pocnet.net&#039;&#039; in der Path-Zeile stehen haben, werden nicht mehr an &#039;&#039;deep-thought&#039;&#039; geschickt und umgekehrt. Das vermeidet Bounces und schlechte Laune bei den Newsadministratoren.&lt;br /&gt;
&lt;br /&gt;
Ansonsten entspricht die Konfiguration weitestgehend der Defaultmäßigen von INN. Kleinere Abwandlungen wie z.&amp;amp;thinsp;B. Expires oder Moderatorenliste und Ähnliches tun für die UUCP-Konfiguration nicht mal indirekt was zur Sache, dazu existieren weit mehr als genug Manpages und andere Dokumentationen.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist natürlich daß Gruppen, die an ein System gesendet werden, dort auch eingerichtet sind. Damit sollte ein einfacher Feed recht schnell zum Laufen zu bringen sein.&lt;br /&gt;
&lt;br /&gt;
== Was kann ich tun wenn mir die FAQ zu kurz ist? ==&lt;br /&gt;
Ganz einfach, selbst basteln und die offenen Fragen beantworten. :-)&lt;br /&gt;
&lt;br /&gt;
== Disclaimer ==&lt;br /&gt;
Diese FAQ wurde nach bestem Wissen und Gewissen zusammengestellt. Trotzdem kann es immer wieder passieren, daß sich Fehler einschleichen. Ich bitte deshalb um die Zusendung von Korrekturen an [mailto:poc@pocnet.net mich], falls so ein Fehler entdeckt wird! Ansonsten haftet der Leser für seine Handlungen selbst.&lt;br /&gt;
&lt;br /&gt;
Diese FAQ soll kein Ersatz zur Doku der beschriebenen Programmpakete sein! Sie soll zusammenfassen, ergänzen und Lösungen zeigen. Trotzdem gilt nach wie vor: RTFM!&lt;br /&gt;
&lt;br /&gt;
Danke an [mailto:Falk_Sauer@MGN.maus.de Falk Sauer] und [mailto:Ralf_Zehender@ccwn.fido.de Ralf Zehender] für die Initialzündung und erste Tips. Danke auch an die Jungs von O&#039;Reilly Books, ohne die ich den ganzen Krempel wohl nie zum Laufen bekommen hätte. Danke auch an meine Tester [mailto:christophe@saout.de Chtephan], [mailto:dominik@vallendor.de Dominik], [mailto:heiko@wurst-wasser.net Heiko] und [mailto:phranck@phranck.net Phrank] sowie [mailto:roland@spinnaker.rhein.de Roland Rosenfeld] für weitere Tips.&lt;br /&gt;
&lt;br /&gt;
== Historie ==&lt;br /&gt;
Diese FAQ unterliegt der [http://www.gnu.org/licenses/fdl-1.3.html GFDL].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|15.06.97&lt;br /&gt;
|erste offizielle Version.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|21.06.97&lt;br /&gt;
|Client-UUCP ergänzt, Tippfehler bereinigt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|23.06.97&lt;br /&gt;
|Wie verläßt man Sendmail -bt? Sendmail -q, Tippfehler bereinigt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|25.06.97&lt;br /&gt;
|Kleinere Tips von Ralf Zehender eingebaut.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|14.07.97&lt;br /&gt;
|Dicken Bug in der Client-Sendmail-Konfiguration ausgemerzt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|10.09.97&lt;br /&gt;
|Tippfehler und logische Ungereimtheiten ausgebügelt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|23.09.97&lt;br /&gt;
|Navigation verbessert (Backlinks ins Inhaltsverzeichnis um lahme Browserreloads zu vermeiden).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|29.09.97&lt;br /&gt;
|Newsteil ergänzt und bereinigt, Disclaimer erweitert, Tips von Roland eingearbeitet.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|10.10.97&lt;br /&gt;
|Mailteil bereinigt und ergänzt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22.10.97&lt;br /&gt;
|Timegradegeheimnis ausgetüftelt und eingebracht.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|06.03.98&lt;br /&gt;
|Timegrades nochmals besser erklärt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|09.03.99&lt;br /&gt;
|Kleinere Fehler ausgemerzt, Tippfehler bereinigt, Umzug der Seite zum neuen Arbeitgeber.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|23.07.00&lt;br /&gt;
|Größere Überarbeitung, einige Kapitel vereinfacht, Pfadangaben an aktuelle Programmversionen angepaßt, Timegrades &#039;rausgeworfen, weil das bei den heutigen Telefontarifen mehr verwirrt als hilft, uvAm.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22.11.00&lt;br /&gt;
|Layout angepaßt, kleinere Typos behoben, Umzug auf den eigenen Server.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|17.01.01&lt;br /&gt;
|Security mit called-login ergänzt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22.02.01&lt;br /&gt;
|Neue URLs durch Umstrukturierungen.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|14.03.01&lt;br /&gt;
|Copyright-Ergänzung, damit die FAQ auch mal offizielle Wege findet.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|21.05.01&lt;br /&gt;
|Kernel-2.4 Note ergänzt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|16.12.01&lt;br /&gt;
|Ergänzung von Beispielen zu uustat, Tippfehler korrigiert. Danke an [mailto:andre@family-uhl.de André Uhl] für die Verbesserungen!&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|05.04.02&lt;br /&gt;
|URL zur Doku ergänzt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|03.05.04&lt;br /&gt;
|Kernel 2.4/Protokoll besser erklärt (für Götz).&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|22.12.06&lt;br /&gt;
|Mailadresse entfernt.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|18.03.11&lt;br /&gt;
|Überarbeitet: Modernisiert, alten Krempel raus, Tippfehler korrigiert, usw., Umsetzung.&lt;br /&gt;
|-&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|08.01.18&lt;br /&gt;
|Überarbeitet: Abschnitt über Ssh als Transport eingefügt.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Internet]]&lt;br /&gt;
[[Kategorie:Protokoll]]&lt;br /&gt;
[[Kategorie:UNIX]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Satisfactory_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3115</id>
		<title>Satisfactory Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Satisfactory_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3115"/>
		<updated>2024-12-07T15:51:09Z</updated>

		<summary type="html">&lt;p&gt;PoC: Neu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;satisfactory Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist relativ einfach zu erledigen.&lt;br /&gt;
&lt;br /&gt;
Der geneigte Leser möchte deswegen vorab den Artikel [[Steam-Client auf Debian-Linux optimal einrichten]] lesen und durcharbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 4&amp;amp;thinsp;GiB Platz auf der Platte und rund 4&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer satisfactory hinzu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
adduser --ingroup games --disabled-password --gecos &#039;Satisactory Dedicated Server Account&#039; satisfactory&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
su - satisfactory&lt;br /&gt;
mkdir -p ~/.local/share&lt;br /&gt;
ln -s /usr/local/games/Steam ~/.local/share/Steam&lt;br /&gt;
steamcmd +force_install_dir ~/SatisfactoryDedicatedServer +login anonymous +app_update 1690800 validate +quit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;1690800&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/satisfactory&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;1690800&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nun kann der Server gestartet werden.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
cd SatisfactoryDedicatedServer&lt;br /&gt;
screen -d -m -S SatisfactoryServer -- ./FactoryServer.sh&lt;br /&gt;
screen -r&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Screen-Session sieht man die Logeinträge. Mit &amp;lt;tt&amp;gt;Ctrl-A-D&amp;lt;/tt&amp;gt; kommt man aus der Session wieder raus.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;satisfactory&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd SatisfactoryDedicatedServer &amp;amp;&amp;amp; screen -d -m -S SatisfactoryServer -- ./FactoryServer.sh&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
Der Server arbeitet nur über Port 7777, tcp und udp.&lt;br /&gt;
&lt;br /&gt;
=== Server beanspruchen und ein Spiel starten ===&lt;br /&gt;
Bevor der Server ein Spiel starten kann, muss er zunächst beansprucht werden:&lt;br /&gt;
&lt;br /&gt;
* Spiel auf einem Client starten,&lt;br /&gt;
* Vom Server-Manager im Hauptmenü aus den Server hinzufügen,&lt;br /&gt;
* Dort einen Namen für den Server festlegen und dessen Administratorkennwort festlegen.&lt;br /&gt;
&lt;br /&gt;
Jetzt kann ein neues Spiel erstellt werden. Ein vorhandenes Spiel kann auch vom Ingame-Server-Manager aus auf den Server importiert werden.&lt;br /&gt;
&lt;br /&gt;
Der Spielerkennwortschutz ist standardmäßig nicht aktiviert, aber ein Spielerkennwort kann über dieselbe Benutzeroberfläche festgelegt werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://satisfactory.wiki.gg/wiki/Dedicated_servers Dedicated servers], Satisfactory Wiki&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3114</id>
		<title>Steam-Client auf Debian-Linux optimal einrichten</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3114"/>
		<updated>2024-12-07T15:29:12Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Gemeinsamen Datenpool einrichten */ Benötigt dass User installieren dürfen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Steam lädt beim Starten pro Benutzer ggfs. ein Update herunter und installiert dies in &#039;&#039;~/.local/share/Steam/&#039;&#039;. Derzeit fasst dieses Verzeichnis 213&amp;amp;thinsp;MiB. Um diesen unnötigen Overhead abzumildern, verschieben wir die Daten an einen zentralen Platz.&lt;br /&gt;
&lt;br /&gt;
Updates müssen trotzdem als &#039;&#039;root&#039;&#039; erfolgen, da nur dieser Benutzer die Dateien überschreiben darf.&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Die zugehörigen Libraries sind allerdings nicht für 64-Bit x86 verfügbar, weswegen zuvor diese teilweise kompatible Architektur angeknipst werden muss.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --add-architecture i386&lt;br /&gt;
apt-get install steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Zuge dessen werden einige benötigte 32-Bit Libraries installiert und eine Bestätigung der Lizenzbedingungen abgefragt.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/games/steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen ein Update. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsamen Datenpool einrichten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir /usr/local/share/games&lt;br /&gt;
mv ~/.local/share/Steam /usr/local/games&lt;br /&gt;
ln -s /usr/local/games/Steam ~/.local/share/Steam&lt;br /&gt;
chgrp -R games /usr/local/games/Steam&lt;br /&gt;
find /usr/local/games/Steam -type d -exec chmod 2755 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -exec chmod 644 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod 755 {} \;&lt;br /&gt;
chmod 755 /usr/local/games/Steam/steamcmd/linux32/steamcmd /usr/local/games/Steam/steamcmd/linux32/steamerrorreporter&lt;br /&gt;
chmod 2770 /usr/local/games/Steam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Symlink in Zeile 3 ist für jeden Benuzer der Steam benutzen darf vorab einzurichten. Ggfs. ist der übrige Verzeichnisbaum &#039;&#039;~/.local/share&#039;&#039; vorher anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Shellscript zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Änderungen in Gruppenzuordnungen und des &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; werden erst nach einem Neulogin aktiv.&lt;br /&gt;
&lt;br /&gt;
Damit sind die Vorbereitungen für die Installation von z.&amp;amp;thinsp;B. &#039;&#039;Dedicated Servern&#039;&#039; abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3113</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3113"/>
		<updated>2024-12-06T22:21:34Z</updated>

		<summary type="html">&lt;p&gt;PoC: Verweis auf den separaten Artikel für Steam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der geneigte Leser möchte deswegen vorab den Artikel [[Steam-Client auf Debian-Linux optimal einrichten]] lesen und durcharbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 15&amp;amp;thinsp;GiB Platz auf der Platte und rund 3,5&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup games --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht.&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript &#039;&#039;startserver.sh&#039;&#039; eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3112</id>
		<title>Steam-Client auf Debian-Linux optimal einrichten</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Steam-Client_auf_Debian-Linux_optimal_einrichten&amp;diff=3112"/>
		<updated>2024-12-06T22:18:45Z</updated>

		<summary type="html">&lt;p&gt;PoC: Neu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Steam lädt beim Starten pro Benutzer ggfs. ein Update herunter und installiert dies in &#039;&#039;~/.local/share/Steam/&#039;&#039;. Derzeit fasst dieses Verzeichnis 213&amp;amp;thinsp;MiB. Um diesen unnötigen Overhead abzumildern, verschieben wir die Daten an einen zentralen Platz.&lt;br /&gt;
&lt;br /&gt;
Updates müssen trotzdem als &#039;&#039;root&#039;&#039; erfolgen, da nur dieser Benutzer die Dateien überschreiben darf.&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Die zugehörigen Libraries sind allerdings nicht für 64-Bit x86 verfügbar, weswegen zuvor diese teilweise kompatible Architektur angeknipst werden muss.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --add-architecture i386&lt;br /&gt;
apt-get install steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Zuge dessen werden einige benötigte 32-Bit Libraries installiert und eine Bestätigung der Lizenzbedingungen abgefragt.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
/usr/games/steamcmd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen ein Update. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Gemeinsamen Datenpool einrichten ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
mkdir /usr/local/share/games&lt;br /&gt;
mv ~/.local/share/Steam /usr/local/games&lt;br /&gt;
ln -s /usr/local/games/Steam ~/.local/share/Steam&lt;br /&gt;
chgrp -R games /usr/local/games/Steam&lt;br /&gt;
find /usr/local/games/Steam -type d -exec chmod 2755 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -exec chmod 644 {} \;&lt;br /&gt;
find /usr/local/games/Steam -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod 755 {} \;&lt;br /&gt;
chmod 755 /usr/local/games/Steam/steamcmd/linux32/steamcmd /usr/local/games/Steam/steamcmd/linux32/steamerrorreporter&lt;br /&gt;
chmod 2750 /usr/local/games/Steam&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Symlink in Zeile 3 ist für jeden Benuzer der Steam benutzen darf vorab einzurichten. Ggfs. ist der übrige Verzeichnisbaum &#039;&#039;~/.local/share&#039;&#039; vorher anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
vi /etc/profile&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Shellscript zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot; line&amp;gt;&lt;br /&gt;
if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
  PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
  PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Änderungen in Gruppenzuordnungen und des &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; werden erst nach einem Neulogin aktiv.&lt;br /&gt;
&lt;br /&gt;
Damit sind die Vorbereitungen für die Installation von z.&amp;amp;thinsp;B. &#039;&#039;Dedicated Servern&#039;&#039; abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3110</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3110"/>
		<updated>2024-09-20T15:32:29Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Checkliste */ Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso debian-live-12.2.0-amd64-standard.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten,&lt;br /&gt;
  apt-get install gdisk mdadm dosfstools dump&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,&lt;br /&gt;
 mkfs.fat /dev/sda1,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit&lt;br /&gt;
 ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen:&lt;br /&gt;
 mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
 /dev/sda1	/boot/efi	vfat	defaults	0	0&lt;br /&gt;
* Anlegen des EFI-Bootverzeichnisses,&lt;br /&gt;
 mkdir /boot/efi&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
 mount -a&lt;br /&gt;
* Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub,&lt;br /&gt;
 apt-get install grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
* Sichern der Grub-Defaults,&lt;br /&gt;
 cp -a /etc/default/grub /etc/default/grub~&lt;br /&gt;
* Löschen von altem Grub-PC-Kram, die Frage nach Löschen vom alten Bootloader bejahen,&lt;br /&gt;
 dpkg -P grub-pc grub-pc-bin&lt;br /&gt;
* Restore der Grub-Defaults,&lt;br /&gt;
 mv /etc/default/grub~ /etc/default/grub&lt;br /&gt;
* Restore von gemeinsamen Grub-Dateien durch Reinstallation,&lt;br /&gt;
 apt-get install --reinstall grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten:&lt;br /&gt;
 umount boot/efi* dev/pts dev proc sys/firmware/efi/efivars sys; cd ..; umount mnt&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
Aus der Praxis…&lt;br /&gt;
&lt;br /&gt;
==== Meldung: EFI variables are not supported on this system ====&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11 notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
==== Nach Reboot erscheint nur die Grub-Kommandozeile ====&lt;br /&gt;
Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wurde, hätte &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
abgesetzt werden müssen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht.&lt;br /&gt;
&lt;br /&gt;
Lösung: Die Schritte von oben nochmal wiederholen:&lt;br /&gt;
* Boot von externem Medium,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Mounten der benötigten Partitionen,&lt;br /&gt;
* Grub-Konfiguration neu schreiben:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
* &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Reboot.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3109</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3109"/>
		<updated>2024-09-20T15:31:20Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Checkliste */ Formatierung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso debian-live-12.2.0-amd64-standard.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten,&lt;br /&gt;
  apt-get install gdisk mdadm dosfstools dump&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,&lt;br /&gt;
 mkfs.fat /dev/sda1,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit&lt;br /&gt;
 ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen:&lt;br /&gt;
 mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
 /dev/sda1	/boot/efi	vfat	defaults	0	0&lt;br /&gt;
* Anlegen des EFI-Bootverzeichnisses,&lt;br /&gt;
 mkdir /boot/efi&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
 mount -a&lt;br /&gt;
* Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub,&lt;br /&gt;
 apt-get install grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
* Sichern der Grub-Defaults,&lt;br /&gt;
 cp -a /etc/default/grub /etc/default/grub~&lt;br /&gt;
* Löschen von altem Grub-PC-Kram, die Frage nach Löschen vom alten Bootloader bejahen,&lt;br /&gt;
 dpkg -P grub-pc grub-pc-bin&lt;br /&gt;
* Restore der Grub-Defaults,&lt;br /&gt;
 mv /etc/default/grub~ /etc/default/grub&lt;br /&gt;
* Restore von gemeinsamen Grub-Dateien durch Reinstallation,&lt;br /&gt;
 apt-get install --reinstall grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten: &amp;lt;code&amp;gt;umount boot/efi* dev/pts dev proc sys; cd ..; umount mnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
Aus der Praxis…&lt;br /&gt;
&lt;br /&gt;
==== Meldung: EFI variables are not supported on this system ====&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11 notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
==== Nach Reboot erscheint nur die Grub-Kommandozeile ====&lt;br /&gt;
Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wurde, hätte &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
abgesetzt werden müssen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht.&lt;br /&gt;
&lt;br /&gt;
Lösung: Die Schritte von oben nochmal wiederholen:&lt;br /&gt;
* Boot von externem Medium,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Mounten der benötigten Partitionen,&lt;br /&gt;
* Grub-Konfiguration neu schreiben:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
* &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Reboot.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Passwortreset_Innovaphone_IP200_und_IP202&amp;diff=3108</id>
		<title>Passwortreset Innovaphone IP200 und IP202</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Passwortreset_Innovaphone_IP200_und_IP202&amp;diff=3108"/>
		<updated>2024-07-27T20:08:12Z</updated>

		<summary type="html">&lt;p&gt;PoC: Default-Credentials&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Für einen Reset auf Herstellergrundeinstellungen: Alt drücken und gedrückt halten, Stromversorgung anstecken und ca. 3&amp;amp;thinsp;s warten bis die rote Hörer-LED aufhört zu blinken. Alt loslassen und nochmal Stromversorgung ab- und wieder anstecken.&lt;br /&gt;
&lt;br /&gt;
Der Standardbenutzer zur Anmeldung ist &#039;&#039;admin&#039;&#039;. Das Standardpasswort ist der Gerätetyp, also &#039;&#039;ip200&#039;&#039; bzw. &#039;&#039;ip202&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Passwort-Reset]]&lt;br /&gt;
[[Kategorie: VoIP‏]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3102</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3102"/>
		<updated>2024-05-13T00:18:16Z</updated>

		<summary type="html">&lt;p&gt;PoC: Genauer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 15&amp;amp;thinsp;GiB Platz auf der Platte und rund 3,5&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Das passiert am Besten als &#039;&#039;root&#039;&#039;, um den Client systemweit für alle Benutzer anbieten zu können.&lt;br /&gt;
&lt;br /&gt;
=== Download und Auspacken ===&lt;br /&gt;
Im Zielverzeichnis müssen rund 285&amp;amp;thinsp;MiB Platz vorhanden sein.&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;http://media.steampowered.com/installer/steamcmd_linux.tar.gz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 mkdir /opt/steamcmd&lt;br /&gt;
 cd /opt/steamcmd&lt;br /&gt;
 tar xzf /tmp/steamcmd_linux.tar.gz &amp;amp;&amp;amp; rm -f /tmp/steamcmd_linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
Alternativ kann mit &amp;lt;code&amp;gt;apt-get install steamcmd&amp;lt;/code&amp;gt; das zugehörige Debian-Paket installiert werden. Die weiteren Ausführungen für Berechtigungen und Suchpfad können hier dann aber nicht angewendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
 ./steamcmd&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen über Downloads und Pakete. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Berechtigungen einrichten ===&lt;br /&gt;
 groupadd steam&lt;br /&gt;
 chgrp -R steam /opt/steamcmd&lt;br /&gt;
 find /opt/steamcmd -type d -exec chmod 2775 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -exec chmod 664 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod -v 755 {} \;&lt;br /&gt;
 chmod a+x /opt/steamcmd/linux32/*&lt;br /&gt;
 chmod 2770 /opt/steamcmd&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
 vi /etc/profile&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Client zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/opt/steamcmd&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/steamcmd&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Optional können nun bereits auf dem System angelegte Benutzer in die Gruppe &#039;&#039;steam&#039;&#039; aufgenommen werden.&lt;br /&gt;
 useradd reiner steam&lt;br /&gt;
(Im Beispiel heißt der vorhandene Benutzer &#039;&#039;reiner&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Damit sind die vorbereitenden Arbeiten für den Client abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup steam --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht.&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd.sh&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
Weiteres wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript &#039;&#039;startserver.sh&#039;&#039; eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3101</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3101"/>
		<updated>2024-05-12T23:54:58Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Automatischer Start */ Wie heißt das Ding?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 6,4&amp;amp;thinsp;GiB Platz auf der Platte und rund 2&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Das passiert am Besten als &#039;&#039;root&#039;&#039;, um den Client systemweit für alle Benutzer anbieten zu können.&lt;br /&gt;
&lt;br /&gt;
=== Download und Auspacken ===&lt;br /&gt;
Im Zielverzeichnis müssen rund 285&amp;amp;thinsp;MiB Platz vorhanden sein.&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;http://media.steampowered.com/installer/steamcmd_linux.tar.gz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 mkdir /opt/steamcmd&lt;br /&gt;
 cd /opt/steamcmd&lt;br /&gt;
 tar xzf /tmp/steamcmd_linux.tar.gz &amp;amp;&amp;amp; rm -f /tmp/steamcmd_linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
Alternativ kann mit &amp;lt;code&amp;gt;apt-get install steamcmd&amp;lt;/code&amp;gt; das zugehörige Debian-Paket installiert werden. Die weiteren Ausführungen für Berechtigungen und Suchpfad können hier dann aber nicht angewendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
 ./steamcmd&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen über Downloads und Pakete. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Berechtigungen einrichten ===&lt;br /&gt;
 groupadd steam&lt;br /&gt;
 chgrp -R steam /opt/steamcmd&lt;br /&gt;
 find /opt/steamcmd -type d -exec chmod 2775 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -exec chmod 664 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod -v 755 {} \;&lt;br /&gt;
 chmod a+x /opt/steamcmd/linux32/*&lt;br /&gt;
 chmod 2770 /opt/steamcmd&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
 vi /etc/profile&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Client zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/opt/steamcmd&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/steamcmd&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Optional können nun bereits auf dem System angelegte Benutzer in die Gruppe &#039;&#039;steam&#039;&#039; aufgenommen werden.&lt;br /&gt;
 useradd reiner steam&lt;br /&gt;
(Im Beispiel heißt der vorhandene Benutzer &#039;&#039;reiner&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Damit sind die vorbereitenden Arbeiten für den Client abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup steam --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht. Ausgepackt bringt der Server derzeit 16&amp;amp;thinsp;GiB an Daten mit!&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd.sh&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
Weiteres wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript &#039;&#039;startserver.sh&#039;&#039; eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3100</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3100"/>
		<updated>2024-05-12T23:34:19Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Installation */ Viel gröer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 6,4&amp;amp;thinsp;GiB Platz auf der Platte und rund 2&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Das passiert am Besten als &#039;&#039;root&#039;&#039;, um den Client systemweit für alle Benutzer anbieten zu können.&lt;br /&gt;
&lt;br /&gt;
=== Download und Auspacken ===&lt;br /&gt;
Im Zielverzeichnis müssen rund 285&amp;amp;thinsp;MiB Platz vorhanden sein.&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;http://media.steampowered.com/installer/steamcmd_linux.tar.gz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 mkdir /opt/steamcmd&lt;br /&gt;
 cd /opt/steamcmd&lt;br /&gt;
 tar xzf /tmp/steamcmd_linux.tar.gz &amp;amp;&amp;amp; rm -f /tmp/steamcmd_linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
Alternativ kann mit &amp;lt;code&amp;gt;apt-get install steamcmd&amp;lt;/code&amp;gt; das zugehörige Debian-Paket installiert werden. Die weiteren Ausführungen für Berechtigungen und Suchpfad können hier dann aber nicht angewendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
 ./steamcmd&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen über Downloads und Pakete. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Berechtigungen einrichten ===&lt;br /&gt;
 groupadd steam&lt;br /&gt;
 chgrp -R steam /opt/steamcmd&lt;br /&gt;
 find /opt/steamcmd -type d -exec chmod 2775 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -exec chmod 664 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod -v 755 {} \;&lt;br /&gt;
 chmod a+x /opt/steamcmd/linux32/*&lt;br /&gt;
 chmod 2770 /opt/steamcmd&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
 vi /etc/profile&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Client zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/opt/steamcmd&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/steamcmd&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Optional können nun bereits auf dem System angelegte Benutzer in die Gruppe &#039;&#039;steam&#039;&#039; aufgenommen werden.&lt;br /&gt;
 useradd reiner steam&lt;br /&gt;
(Im Beispiel heißt der vorhandene Benutzer &#039;&#039;reiner&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Damit sind die vorbereitenden Arbeiten für den Client abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup steam --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht. Ausgepackt bringt der Server derzeit 16&amp;amp;thinsp;GiB an Daten mit!&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd.sh&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
Weiteres wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3099</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3099"/>
		<updated>2024-05-12T23:13:23Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Download und Auspacken */ Genauer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 6,4&amp;amp;thinsp;GiB Platz auf der Platte und rund 2&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Das passiert am Besten als &#039;&#039;root&#039;&#039;, um den Client systemweit für alle Benutzer anbieten zu können.&lt;br /&gt;
&lt;br /&gt;
=== Download und Auspacken ===&lt;br /&gt;
Im Zielverzeichnis müssen rund 285&amp;amp;thinsp;MiB Platz vorhanden sein.&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;http://media.steampowered.com/installer/steamcmd_linux.tar.gz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 mkdir /opt/steamcmd&lt;br /&gt;
 cd /opt/steamcmd&lt;br /&gt;
 tar xzf /tmp/steamcmd_linux.tar.gz &amp;amp;&amp;amp; rm -f /tmp/steamcmd_linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
Alternativ kann mit &amp;lt;code&amp;gt;apt-get install steamcmd&amp;lt;/code&amp;gt; das zugehörige Debian-Paket installiert werden. Die weiteren Ausführungen für Berechtigungen und Suchpfad können hier dann aber nicht angewendet werden.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
 ./steamcmd&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen über Downloads und Pakete. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Berechtigungen einrichten ===&lt;br /&gt;
 groupadd steam&lt;br /&gt;
 chgrp -R steam /opt/steamcmd&lt;br /&gt;
 find /opt/steamcmd -type d -exec chmod 2775 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -exec chmod 664 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod -v 755 {} \;&lt;br /&gt;
 chmod a+x /opt/steamcmd/linux32/*&lt;br /&gt;
 chmod 2770 /opt/steamcmd&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
 vi /etc/profile&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Client zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/opt/steamcmd&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/steamcmd&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Optional können nun bereits auf dem System angelegte Benutzer in die Gruppe &#039;&#039;steam&#039;&#039; aufgenommen werden.&lt;br /&gt;
 useradd reiner steam&lt;br /&gt;
(Im Beispiel heißt der vorhandene Benutzer &#039;&#039;reiner&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Damit sind die vorbereitenden Arbeiten für den Client abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup steam --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht. Ausgepackt bringt der Server derzeit 6,4&amp;amp;thinsp;GiB an Daten mit!&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd.sh&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
Weiteres wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3098</id>
		<title>7 Days To Die Dedicated Server auf Debian Linux via Kommandozeile installieren</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=7_Days_To_Die_Dedicated_Server_auf_Debian_Linux_via_Kommandozeile_installieren&amp;diff=3098"/>
		<updated>2024-05-12T23:07:31Z</updated>

		<summary type="html">&lt;p&gt;PoC: Geht auch als Package&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Installation eines &#039;&#039;&#039;7 Days To Die Dedicated Servers auf auf Debian Linux via Kommandozeile&#039;&#039;&#039; ist nicht ganz trivial. Das gilt vor allem für die Inbetriebnahme des Steam-Clients für die Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
Der Server benötigt rund 6,4&amp;amp;thinsp;GiB Platz auf der Platte und rund 2&amp;amp;thinsp;GiB RAM (ohne Spieler).&lt;br /&gt;
&lt;br /&gt;
== Steam-Client ==&lt;br /&gt;
Als Grundvoraussetzung für alle Steam-Themen muss zuerst mal der Client installiert und grundkonfiguriert werden. Das passiert am Besten als &#039;&#039;root&#039;&#039;, um den Client systemweit für alle Benutzer anbieten zu können.&lt;br /&gt;
&lt;br /&gt;
=== Download und Auspacken ===&lt;br /&gt;
Im Zielverzeichnis müssen rund 250&amp;amp;thinsp;MiB Platz vorhanden sein.&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;http://media.steampowered.com/installer/steamcmd_linux.tar.gz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 mkdir /opt/steamcmd&lt;br /&gt;
 cd /opt/steamcmd&lt;br /&gt;
 tar xzf /tmp/steamcmd_linux.tar.gz &amp;amp;&amp;amp; rm -f /tmp/steamcmd_linux.tar.gz&lt;br /&gt;
&lt;br /&gt;
Alternativ kann mit &amp;lt;code&amp;gt;apt-get install steamcmd&amp;lt;/code&amp;gt; das zugehörige Debian-Paket installiert werden.&lt;br /&gt;
&lt;br /&gt;
=== Initialer Start ===&lt;br /&gt;
 ./steamcmd&lt;br /&gt;
&lt;br /&gt;
Hier scrollt nun eine Menge Text durch mit Hinweisen über Downloads und Pakete. Am Ende muss ein fett gedruckter Prompt da stehen:&lt;br /&gt;
 &#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Der Client kann an dieser Stelle mit &amp;lt;code&amp;gt;quit&amp;lt;/code&amp;gt; verlassen werden.&lt;br /&gt;
&lt;br /&gt;
=== Berechtigungen einrichten ===&lt;br /&gt;
 groupadd steam&lt;br /&gt;
 chgrp -R steam /opt/steamcmd&lt;br /&gt;
 find /opt/steamcmd -type d -exec chmod 2775 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -exec chmod 664 {} \;&lt;br /&gt;
 find /opt/steamcmd -type f -a \( -name &amp;quot;*.sh&amp;quot; -o -name &amp;quot;*.so&amp;quot; -o -name &amp;quot;*.so.*&amp;quot; \) -exec chmod -v 755 {} \;&lt;br /&gt;
 chmod a+x /opt/steamcmd/linux32/*&lt;br /&gt;
 chmod 2770 /opt/steamcmd&lt;br /&gt;
&lt;br /&gt;
=== Suchpfad ergänzen ===&lt;br /&gt;
 vi /etc/profile&lt;br /&gt;
&lt;br /&gt;
Natürlich kann man den Editor seiner Wahl verwenden. Letztendlich kommt es darauf an, in den Zeilen, in denen die &amp;lt;code&amp;gt;PATH&amp;lt;/code&amp;gt;-Variable gesetzt wird, den Pfad zum Steam-Client zu ergänzen.&lt;br /&gt;
&lt;br /&gt;
;Vorher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 if [ &amp;quot;`id -u`&amp;quot; -eq 0 ]; then&lt;br /&gt;
   PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/opt/steamcmd&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   PATH=&amp;quot;/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/opt/steamcmd&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Optional können nun bereits auf dem System angelegte Benutzer in die Gruppe &#039;&#039;steam&#039;&#039; aufgenommen werden.&lt;br /&gt;
 useradd reiner steam&lt;br /&gt;
(Im Beispiel heißt der vorhandene Benutzer &#039;&#039;reiner&#039;&#039;.)&lt;br /&gt;
&lt;br /&gt;
Damit sind die vorbereitenden Arbeiten für den Client abgeschlossen.&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
Sinnvollerweise richtet man den Server so ein, dass er unter einem eigenen Benutzer läuft. Dazu fügen wir den Benutzer sdtd hinzu:&lt;br /&gt;
 adduser --ingroup steam --disabled-password --gecos &#039;Seven Days To Die Dedicated Server Account&#039; sdtd&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
Nun installieren wir den Server. Ganz wichtig ist, dass in &#039;&#039;/home&#039;&#039; genügend freier Platz zu Verfügung steht. Ausgepackt bringt der Server derzeit 6,4&amp;amp;thinsp;GiB an Daten mit!&lt;br /&gt;
 su - sdtd&lt;br /&gt;
 steamcmd.sh&lt;br /&gt;
&lt;br /&gt;
Ab hier ist nun nach jeder Eingabe der &amp;lt;code&amp;gt;&#039;&#039;&#039;Steam&amp;gt;&#039;&#039;&#039;&amp;lt;/code&amp;gt;-Prompt sichtbar.&lt;br /&gt;
 login anonymous&lt;br /&gt;
 app_update 294420 validate&lt;br /&gt;
&lt;br /&gt;
Der Download wird nun durchgeführt und dauert seine Zeit.&lt;br /&gt;
&lt;br /&gt;
Folgende Fehler sind derzeit bekannt:&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x202 after update job.&amp;lt;/code&amp;gt;: Nicht genügend freier Platz in &#039;&#039;/home/sdtd/Steam&#039;&#039;.&lt;br /&gt;
* &amp;lt;code&amp;gt;Error! App &#039;294420&#039; state is 0x426 after update job.&amp;lt;/code&amp;gt;: Servertask läuft noch. Muss vorher beendet werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Update kann der Client wiederum beendet werden:&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Konfiguration ===&lt;br /&gt;
Die Konfiguration findet sich in &#039;&#039;~/Steam/steamapps/common/&amp;quot;7 Days to Die Dedicated Server&amp;quot;/serverconfig.xml&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;telnet localhost 8081&amp;lt;/code&amp;gt; kann der Server via Kommandozeile gesteuert werden (sofern er läuft).&lt;br /&gt;
&lt;br /&gt;
Weiteres wird noch ergänzt.&lt;br /&gt;
&lt;br /&gt;
=== Automatischer Start ===&lt;br /&gt;
Damit der Server nach dem automatischen Start ordnungsgemäß im Hintergrund weiterläuft, muss im Startscript eine Anpassung vorgenommen werden: Die eigentlichen Startzeilen müssen mit einer Leerstelle und Kaufmanns-und (&amp;amp;) abgeschlossen werden:&lt;br /&gt;
;Vorher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS&lt;br /&gt;
&lt;br /&gt;
;Nachher:&lt;br /&gt;
 ./7DaysToDieServer.x86_64 -logfile 7DaysToDieServer_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt -quit -batchmode -nographics -dedicated $PARAMS &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Durch den nachfolgenden Cronjob wird der Server nach einem Reboot automatisch gestartet. Muss mit &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; als Benutzer &#039;&#039;sdtd&#039;&#039; eingefügt werden:&lt;br /&gt;
 @reboot  cd ~/Steam/steamapps/common/&#039;7 Days to Die Dedicated Server&#039; &amp;amp;&amp;amp; ./startserver.sh -configfile=serverconfig.xml&lt;br /&gt;
&lt;br /&gt;
Mit der o.&amp;amp;thinsp;G. Zeile als Benutzer &#039;&#039;sdtd&#039;&#039;, ohne das &#039;&#039;@reboot&#039;&#039; vornedran kann der Server dann gestartet und die Shell alsdann geschlossen werden (logout).&lt;br /&gt;
&lt;br /&gt;
==== Server beenden ====&lt;br /&gt;
Mit dem Konsolen-Kommando (telnet, s.&amp;amp;thinsp;O.) &#039;&#039;shutdown&#039;&#039; kann der Server ordnungsgemäß beendet werden. Ob das auch bei einem normalen &#039;&#039;kill&#039;&#039;-Kommando im Rahmen eines Host-Reboots so ordentlich läuft, ist derzeit unklar.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Im Unterordner &#039;&#039;7DaysToDieServer_Data&#039;&#039; findet sich ein &#039;&#039;output_log&#039;&#039; mit Timestamp hintendran, da landen die Ausgaben vom Server drin.&lt;br /&gt;
&lt;br /&gt;
== Firewall ==&lt;br /&gt;
Der Server öffnet folgende Ports:&lt;br /&gt;
* tcp/127.0.0.1:8081 (Management)&lt;br /&gt;
* tcp/26900&lt;br /&gt;
* udp/26900&lt;br /&gt;
* udp/26902&lt;br /&gt;
&lt;br /&gt;
Die letzten drei müssen in einer ggfs. vorhandenen Firewall bzw. einem NAT-Router entsprechend geöffnet bzw. weitergeleitet werden.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://wiki.dawico.de/display/WIKI/7+Days+To+Die%3A+dedicated+Server+auf+Debian+installieren 7 Days To Die: dedicated Server auf Debian installieren] (fehlerhaft, aber als initialer Start für diesen Artikel gut geeignet)&lt;br /&gt;
* [https://7daystodie.gamepedia.com/Server Server-Dokumentation] im 7 Days to Die Wiki&lt;br /&gt;
* [https://unix.stackexchange.com/questions/463708/uninstall-a-steam-game-with-the-console Uninstall a Steam game with the console], Stack Exchange&lt;br /&gt;
* [https://steamcommunity.com/sharedfiles/filedetails/?l=german&amp;amp;id=360404397 Installing Linux dedicated server for 7 days to die] mit Tips zur Installation von experimentellen Releases.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;br /&gt;
[[Kategorie: Spiel]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3097</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3097"/>
		<updated>2024-05-12T13:33:01Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* TFTP-Server */ Hinweis verschoben.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Dabei kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen Architekturen zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install openbsd-inetd isc-dhcp-server tftp-hpa tftpd-hpa nfs-kernel-server pxelinux syslinux-common syslinux-efi debootstrap squashfs-tools&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die bestehende Konfiguration eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.0;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&amp;lt;ref&amp;gt;Dies ist notwendig, damit die später angelegten Symlinks auch aufgelöst werden.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht mehr manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche, aufsteigende Nummerierung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    stable &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
* [http://grml.org/online-docs/live-initramfs.en.7.html Doku zur live-initramfs] (Manpage im HTML-Format, englisch.)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3096</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3096"/>
		<updated>2024-05-12T13:32:32Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* TFTP-Server */ Hinweis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Dabei kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen Architekturen zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install openbsd-inetd isc-dhcp-server tftp-hpa tftpd-hpa nfs-kernel-server pxelinux syslinux-common syslinux-efi debootstrap squashfs-tools&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die bestehende Konfiguration eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.0;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;Dies ist notwendig, damit die später angelegten Symlinks auch aufgelöst werden.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht mehr manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche, aufsteigende Nummerierung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    stable &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
* [http://grml.org/online-docs/live-initramfs.en.7.html Doku zur live-initramfs] (Manpage im HTML-Format, englisch.)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3095</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3095"/>
		<updated>2024-05-12T13:29:19Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Root-Dateisystem */ +Script&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Dabei kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen Architekturen zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install openbsd-inetd isc-dhcp-server tftp-hpa tftpd-hpa nfs-kernel-server pxelinux syslinux-common syslinux-efi debootstrap squashfs-tools&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die bestehende Konfiguration eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.0;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht mehr manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche, aufsteigende Nummerierung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Das folgende Script kann mit den Parametern &#039;&#039;amd64&#039;&#039; oder &#039;&#039;i686&#039;&#039; aufgerufen werden und erzeugt jeweils ein Squashfs in den zuvor angelegten Verzeichnissen in &#039;&#039;/var/nfsboot&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Must run as root.&lt;br /&gt;
if ! id |grep -Fq &#039;uid=0(root) gid=0(root) groups=0(root)&#039;; then&lt;br /&gt;
    echo &amp;quot;Must run as root.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Must supply what to build.&lt;br /&gt;
if [ -z &amp;quot;${1}&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Check what to build.&lt;br /&gt;
if [ &amp;quot;${1}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;amd64&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${1}&amp;quot; == &amp;quot;i686&amp;quot; ] || [ &amp;quot;${1}&amp;quot; == &amp;quot;i386&amp;quot; ]; then&lt;br /&gt;
    DST_ARCH=&amp;quot;i686&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot;Give arch as argument: amd64 or i686.&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Automatically clean up when we terminate.&lt;br /&gt;
trap &#039;{ umount ${TMPMNT} &amp;amp;&amp;amp; rmdir ${TMPMNT}; rm -f ${TMPIMG}; }&#039; EXIT&lt;br /&gt;
&lt;br /&gt;
# Terminate on error.&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Temporary image file and mount point to work within.&lt;br /&gt;
TMPIMG=$(mktemp --tmpdir=/var/tmp live-image.XXXXXXXXXX)&lt;br /&gt;
TMPMNT=$(mktemp -d --tmpdir=/var/tmp live-root.XXXXXXXXXX)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Prepare image file and mount.&lt;br /&gt;
fallocate -v -l 4GiB &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mke2fs -t ext4 -E lazy_itable_init=0 -O ^has_journal -i 16384 -L live-build -F &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
tune2fs -r0 -c0 -i12m -o &#039;^acl,nobarrier&#039; -e remount-ro -f &amp;quot;${TMPIMG}&amp;quot;&lt;br /&gt;
mount -o loop &amp;quot;${TMPIMG}&amp;quot; &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Install system.&lt;br /&gt;
if [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;amd64&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=amd64&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dosfstools, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-amd-graphics, \&lt;br /&gt;
        firmware-bnx2, \&lt;br /&gt;
        firmware-bnx2x, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        firmware-misc-nonfree, \&lt;br /&gt;
        gdisk, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-amd64, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
elif [ &amp;quot;${DST_ARCH}&amp;quot; == &amp;quot;i686&amp;quot; ]; then&lt;br /&gt;
    ARCH_ARG=&amp;quot;--arch=i386&amp;quot;&lt;br /&gt;
    PKGLIST=&amp;quot;console-setup, \&lt;br /&gt;
        dump, \&lt;br /&gt;
        firmware-linux-free, \&lt;br /&gt;
        ifupdown, \&lt;br /&gt;
        isc-dhcp-client, \&lt;br /&gt;
        kbd, \&lt;br /&gt;
        keyboard-configuration, \&lt;br /&gt;
        linux-image-686-pae, \&lt;br /&gt;
        live-boot, \&lt;br /&gt;
        locales, \&lt;br /&gt;
        lsscsi, \&lt;br /&gt;
        lvm2, \&lt;br /&gt;
        mdadm, \&lt;br /&gt;
        mt-st, \&lt;br /&gt;
        net-tools, \&lt;br /&gt;
        nfs-common, \&lt;br /&gt;
        openssh-client, \&lt;br /&gt;
        openssh-server, \&lt;br /&gt;
        orphan-sysvinit-scripts, \&lt;br /&gt;
        pciutils, \&lt;br /&gt;
        pv, \&lt;br /&gt;
        sg3-utils, \&lt;br /&gt;
        sysvinit-core&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Parameter strings for debootstrap must not include blanks.&lt;br /&gt;
PKGLIST_CLEAN=&amp;quot;$(echo &amp;quot;${PKGLIST}&amp;quot; |tr -d &#039; &#039;)&amp;quot;&lt;br /&gt;
debootstrap &amp;quot;${ARCH_ARG}&amp;quot; --components=main,non-free,non-free-firmware,contrib \&lt;br /&gt;
    --include &amp;quot;${PKGLIST_CLEAN}&amp;quot; \&lt;br /&gt;
    --exclude nano,systemd-sysv,tasksel,tasksel-data \&lt;br /&gt;
    stable &amp;quot;${TMPMNT}&amp;quot; https://debian.inf.tu-dresden.de/debian/&lt;br /&gt;
&lt;br /&gt;
# Prepare system.&lt;br /&gt;
echo &amp;quot;debian-live&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/hostname&lt;br /&gt;
cat &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/default/keyboard &amp;lt;&amp;lt;-EOF&lt;br /&gt;
# Check /usr/share/doc/keyboard-configuration/README.Debian for&lt;br /&gt;
# documentation on what to do after having modified this file.&lt;br /&gt;
&lt;br /&gt;
# The following variables describe your keyboard and can have the same&lt;br /&gt;
# values as the XkbModel, XkbLayout, XkbVariant and XkbOptions options&lt;br /&gt;
# in /etc/X11/xorg.conf.&lt;br /&gt;
&lt;br /&gt;
XKBMODEL=&amp;quot;pc105&amp;quot;&lt;br /&gt;
XKBLAYOUT=&amp;quot;de&amp;quot;&lt;br /&gt;
XKBVARIANT=&amp;quot;&amp;quot;&lt;br /&gt;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# If you don&#039;t want to use the XKB layout on the console, you can&lt;br /&gt;
# specify an alternative keymap.  Make sure it will be accessible&lt;br /&gt;
# before /usr is mounted.&lt;br /&gt;
# KMAP=/etc/console-setup/defkeymap.kmap.gz&lt;br /&gt;
BACKSPACE=&amp;quot;guess&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
# Clean apt lists to save space. They might be outdated anyway and need to be retransferred.&lt;br /&gt;
rm -f &amp;quot;${TMPMNT}&amp;quot;/var/lib/apt/lists/* 2&amp;gt;/dev/null || true&lt;br /&gt;
&lt;br /&gt;
# Set default locale.&lt;br /&gt;
echo &amp;quot;LANG=en_US.UTF-8&amp;quot; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/environment&lt;br /&gt;
&lt;br /&gt;
# Add default password entry.&lt;br /&gt;
sed &#039;/^root:/ d&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~&lt;br /&gt;
echo &#039;root::17852:0:99999:7:::&#039; &amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
cat &amp;quot;${TMPMNT}&amp;quot;/etc/shadow~ &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/shadow&lt;br /&gt;
&lt;br /&gt;
# Help with ssh-remote-logins.&lt;br /&gt;
echo &amp;quot;PermitRootLogin yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
echo &amp;quot;PermitEmptyPasswords yes&amp;quot; &amp;gt;&amp;gt; &amp;quot;${TMPMNT}&amp;quot;/etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Switch initrd to gzip.&lt;br /&gt;
sed -Ei &#039;s/^COMPRESS=zstd$/COMPRESS=gzip/&#039; &amp;quot;${TMPMNT}&amp;quot;/etc/initramfs-tools/initramfs.conf&lt;br /&gt;
&lt;br /&gt;
# Prepare system to rebuild initramfs&lt;br /&gt;
mount -o bind /dev &amp;quot;${TMPMNT}&amp;quot;/dev&lt;br /&gt;
mount -o bind /dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev/pts&lt;br /&gt;
mount -t proc none &amp;quot;${TMPMNT}&amp;quot;/proc&lt;br /&gt;
mount -t sysfs none &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
echo &amp;quot;Please run these commands:&amp;quot;&lt;br /&gt;
# FIXME: How to automate this manual process?&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/default_environment_locale	select	en_US.UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &#039; echo &amp;quot;locales	locales/locales_to_be_generated	multiselect	en_US.UTF-8 UTF-8&amp;quot; |debconf-set-selections&#039;&lt;br /&gt;
echo &amp;quot; dpkg-reconfigure locales&amp;quot;&lt;br /&gt;
echo &amp;quot; update-initramfs -u&amp;quot;&lt;br /&gt;
echo &amp;quot;then exit chroot.&amp;quot;&lt;br /&gt;
chroot &amp;quot;${TMPMNT}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Script resumes after chroot exit.&lt;br /&gt;
umount &amp;quot;${TMPMNT}&amp;quot;/dev/pts &amp;quot;${TMPMNT}&amp;quot;/dev &amp;quot;${TMPMNT}&amp;quot;/proc &amp;quot;${TMPMNT}&amp;quot;/sys&lt;br /&gt;
&lt;br /&gt;
# Copy Kernel and initramfs for TFTP&lt;br /&gt;
cp -v &amp;quot;${TMPMNT}&amp;quot;/vmlinuz &amp;quot;${TMPMNT}&amp;quot;/initrd.img /var/tftpboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Compress into a file for NFS serving&lt;br /&gt;
mksquashfs &amp;quot;${TMPMNT}&amp;quot; /var/nfsboot/deb-live/&amp;quot;${DST_ARCH}&amp;quot;/filesystem.squashfs -noappend&lt;br /&gt;
&lt;br /&gt;
# vim: tabstop=4 shiftwidth=4 autoindent expandtab&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Paketliste in &#039;&#039;$PKGLIST&#039;&#039; ist darauf zugeschnitten, die für eine schnelle Wiederherstellung notwendigen Komponenten zu beinhalten.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
* [http://grml.org/online-docs/live-initramfs.en.7.html Doku zur live-initramfs] (Manpage im HTML-Format, englisch.)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3094</id>
		<title>Debian-Live Netzbootsystem</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian-Live_Netzbootsystem&amp;diff=3094"/>
		<updated>2024-05-11T22:32:20Z</updated>

		<summary type="html">&lt;p&gt;PoC: Überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Möglichkeit, hinreichend aktuelle Maschinen (allgemein, also VMs oder auch Blech) über das LAN zu booten ist eine feine Sache. Bare Metal Restore, oder auch die Offline-Korrektur von Fehlern wie z.&amp;amp;thinsp;B. zu kleinen Partitionen, etc. wird damit zum Kinderspiel.&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;Debian-Live&#039;&#039;&#039;-Projekt hat für Wiederherstellungszwecke eine Live-Boot CD-Serie bereitgestellt. Allerdings haben diese Images ein paar (teils subjektive) Nachteile:&lt;br /&gt;
* Gewohnte Konfigurationstools wurden durch modernere Varianten mit eigener Syntax abgelöst; ein Paradebeispiel ist das Fehlen von &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Hardware welche proprietäre Firmware-Binärdateien benötigt ist — vor allem wenn es um Netzwerkkarten geht — außen vor; ein Booten vom Netz geht spätestens nach dem Starten des Kernels schief.&lt;br /&gt;
* Viele weitere Pakete mit fast immer benötigten Tools fehlen und müssen immer und immer wieder per Hand nachinstalliert werden.&lt;br /&gt;
&lt;br /&gt;
Der Artikel beschreibt die notwendigen Schritte, dieses Netzbootsystem auf einem existierenden Debian Linux 12 (Bookworm) aufzusetzen. Ob die zu startende Maschine ein älteres BIOS-basiertes System ist oder ein neueres EFI-System, ist egal: Beides wird dynamisch anhand von DHCP-Optionen passend konfiguriert. Dabei kann zum Bootzeitpunkt ausgewählt werden, ob ein 32- oder ein 64-Bit-System gestartet werden soll.&lt;br /&gt;
&lt;br /&gt;
Es ist selbstverständlich möglich, weitere via PXE zu startende Betriebssysteme einzubinden. Wichtig ist zu beachten, dass die via TFTP bereitgestellten Dateien in den entsprechenden Unterverzeichnissen für die verschiedenen Architekturen zu hinterlegen sind (bios, efi32, efi64).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Das von mir benutzte System ist traditionell mit &#039;&#039;SysV-init&#039;&#039; ausgerüstet. &#039;&#039;Systemd&#039;&#039; wird nicht benutzt. Die hier aufgeführten Schritte sind ansonsten so generisch wie möglich gehalten.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Benötigte Komponenten ==&lt;br /&gt;
* &#039;&#039;DHCP-Server&#039;&#039; für die Zuweisung grundlegender Netzwerkparameter,&lt;br /&gt;
* &#039;&#039;TFTP-Server&#039;&#039; für den initialen Download von Bootloader, Menü und anschließend Kernel und Initrd,&lt;br /&gt;
* &#039;&#039;NFS-Server&#039;&#039; für den Zugriff auf das komprimierte Root-Dateisystem,&lt;br /&gt;
* &#039;&#039;Scripte&#039;&#039; zur Erstellung des übers Netz geladenen Root-Dateisystems.&lt;br /&gt;
&lt;br /&gt;
Installation:&lt;br /&gt;
 apt-get install openbsd-inetd isc-dhcp-server tftp-hpa tftpd-hpa nfs-kernel-server pxelinux syslinux-common syslinux-efi debootstrap squashfs-tools&lt;br /&gt;
&lt;br /&gt;
== DHCP-Konfiguration ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Hinweis&#039;&#039;&#039;: Im lokalen Netzwerksegment soll nur &#039;&#039;&#039;ein&#039;&#039;&#039; DHCP-Server aktiv sein. Sind es mehrere, ist es mehr oder weniger Zufall, welches Antwortpaket der anfragende Client zuerst bearbeitet. Sollte also schon ein DHCP-Server existieren, muss die gezeigte Konfiguration in die bestehende Konfiguration eingebaut werden. Durch die Benutzung von DHCP-Klassen (&amp;quot;class&amp;quot;) ist dies im Regelfall aber sehr einfach möglich.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der erste Start des noch nicht unkonfigurierten DHCP-Servers geht erfahrungsgemäß schief, dies kann ignoriert werden.&lt;br /&gt;
&lt;br /&gt;
Weil hier nur IPv4 berücksichtigt wird, muss in &#039;&#039;/etc/default/isc-dhcp-server die Zeile &#039;&#039;INTERFACESv6&#039;&#039; gelöscht werden. Ebenso muss in &#039;&#039;INTERFACESv4&#039;&#039; das für DHCP zu verwendenden Netzwerkinterface eingetragen werden. Beispiel:&lt;br /&gt;
 INTERFACESv4=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein &#039;&#039;&#039;Beispiel&#039;&#039;&#039; für eine DHCP-Konfiguration! Insbesondere der &#039;&#039;group&#039;&#039;-Abschnitt muss auf die lokalen Gegebenheiten angepasst werden!&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
authoritative;&lt;br /&gt;
ddns-updates off;&lt;br /&gt;
default-lease-time 3600;&lt;br /&gt;
log-facility daemon;&lt;br /&gt;
max-lease-time 86400;&lt;br /&gt;
min-lease-time 300;&lt;br /&gt;
min-secs 0;&lt;br /&gt;
&lt;br /&gt;
option architecture-type code 93 = unsigned integer 16; # RFC4578&lt;br /&gt;
&lt;br /&gt;
# Route different kinds of requesting clients to distinct PXE bootloaders.&lt;br /&gt;
class &amp;quot;pxeclients&amp;quot; {&lt;br /&gt;
    match if substring (option vendor-class-identifier, 0, 9) = &amp;quot;PXEClient&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if option architecture-type = 00:00 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/bios/lpxelinux.0&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:06 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi32/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:07 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    } elsif option architecture-type = 00:09 {&lt;br /&gt;
        filename &amp;quot;/var/tftpboot/efi64/syslinux.efi&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    # This is the TFTP server&#039;s IP address.&lt;br /&gt;
    next-server 192.168.111.10;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Ethernet&lt;br /&gt;
group {&lt;br /&gt;
    option broadcast-address 192.168.111.0;&lt;br /&gt;
    option domain-name &amp;quot;pocnet.net&amp;quot;;&lt;br /&gt;
    option domain-name-servers 192.168.111.10;&lt;br /&gt;
    option ntp-servers 192.168.111.10;&lt;br /&gt;
    option routers 192.168.111.1;&lt;br /&gt;
    option subnet-mask 255.255.255.0;&lt;br /&gt;
&lt;br /&gt;
    subnet 192.168.111.0 netmask 255.255.255.0 {&lt;br /&gt;
        range 192.168.111.120 192.168.111.126;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nun kann der DHCP-Server gestartet werden:&lt;br /&gt;
 service isc-dhcp-server start&lt;br /&gt;
&lt;br /&gt;
== TFTP-Server ==&lt;br /&gt;
Die Konfiguration des Servers findet sich in &#039;&#039;/etc/default/tftpd-hpa&#039;&#039;. Dort müssen folgende Änderungen durchgeführt werden:&lt;br /&gt;
* Ändern des Pfades &#039;&#039;/srv/tftp&#039;&#039; nach &#039;&#039;/var/tftpboot&#039;&#039;,&amp;lt;ref&amp;gt;Ist kein Muss, aber in dieser Anleitung wird dieser Pfad vorausgesetzt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Ändern der &#039;&#039;TFTP_OPTIONS&#039;&#039;:&lt;br /&gt;
** Löschen von &amp;lt;code&amp;gt;--secure&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Hinzufügen von &amp;lt;code&amp;gt;--permissive -v&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nun kann der alte Pfad gelöscht werden und der neue angelegt:&lt;br /&gt;
 rmdir /srv/tftp&lt;br /&gt;
 mkdir /var/tftpboot&lt;br /&gt;
&lt;br /&gt;
Als letztes sollte der TFTP-Server neu gestartet werden:&lt;br /&gt;
 service tftpd-hpa restart&lt;br /&gt;
&lt;br /&gt;
=== Inhalte für &amp;lt;code&amp;gt;/var/tftpboot&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Zuerst werden ein paar grundlegende Verzeichnisse für die benötigten Dateien angelegt:&lt;br /&gt;
 cd /var/tftpboot&lt;br /&gt;
 mkdir -p deb-live/amd64 deb-live/i686 bios efi32 efi64 pxelinux.cfg&lt;br /&gt;
&lt;br /&gt;
Für die einzelnen Architekturen werden nun die benötigten Bootdateien über Symlinks bereit gestellt. Symlinks brauchen weniger Speicher und wenn das Original (wegen Aktualisierungen) ausgetauscht wird, braucht man nicht mehr manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&lt;br /&gt;
# BIOS-Loaders&lt;br /&gt;
cd bios&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/ldlinux.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/pxechn.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/bios/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/PXELINUX/lpxelinux.0 .&lt;br /&gt;
&lt;br /&gt;
# EFI32-Loaders&lt;br /&gt;
cd ../efi32&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/ldlinux.e32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi32/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi32/syslinux.efi .&lt;br /&gt;
&lt;br /&gt;
# EFI64-Loaders&lt;br /&gt;
cd ../efi64&lt;br /&gt;
ln -s ../deb-live .&lt;br /&gt;
ln -s ../pxelinux.cfg .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/ldlinux.e64 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libcom32.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/libutil.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/mboot.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/menu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/syslinux/modules/efi64/vesamenu.c32 .&lt;br /&gt;
ln -s ../../../usr/lib/SYSLINUX.EFI/efi64/syslinux.efi .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um die Pflege des PXE-Bootmenüs zu vereinfachen, wird eine &amp;quot;globale&amp;quot; Konfiguration in &#039;&#039;/var/tftpboot/pxelinux.cfg&#039;&#039; (der Standardname, mit dem die PXE-Loader nach der Konfiguration suchen) für alle Architekturen via Symlinks zugänglich gemacht.&lt;br /&gt;
&lt;br /&gt;
Die eigentliche Konfiguration für das Bootmenü findet sich in der Datei &#039;&#039;/var/tftpboot/pxelinux.cfg/default&#039;&#039;:&lt;br /&gt;
 menu title Boot menu&lt;br /&gt;
 menu tabmsg Press ENTER to boot or TAB to edit a menu entry&lt;br /&gt;
 prompt 0&lt;br /&gt;
 timeout 600&lt;br /&gt;
 &lt;br /&gt;
 label deblive64&lt;br /&gt;
     menu label Debian Live ^amd64&lt;br /&gt;
     kernel deb-live/amd64/vmlinuz&lt;br /&gt;
     append initrd=deb-live/amd64/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label deblive32&lt;br /&gt;
     menu label Debian Live ^i686&lt;br /&gt;
     kernel deb-live/i686/vmlinuz&lt;br /&gt;
     append initrd=deb-live/i686/initrd.img net.ifnames=0 biosdevname=0 ip=:::::eth0:dhcp boot=live netboot=nfs root=/dev/nfs nfsroot=192.168.1.10:/var/nfsboot/deb-live/amd64 live-media-path=/ consoleblank=0 nfsrootdebug&lt;br /&gt;
 &lt;br /&gt;
 label bootlocal&lt;br /&gt;
     menu label Boot ^local disk&lt;br /&gt;
     menu default&lt;br /&gt;
     localboot 0&lt;br /&gt;
 &lt;br /&gt;
 ui menu.c32&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;net.ifnames=0 biosdevname=0&amp;lt;/code&amp;gt; stellt die ursprüngliche, aufsteigende Nummerierung vom Kernel wieder her, damit die Netzwerkschnittstelle überall wieder &#039;&#039;eth0&#039;&#039;heißt und diese wiederum in der &amp;lt;code&amp;gt;ip=&amp;lt;/code&amp;gt;-Konfigurationszeile statisch referenziert werden kann.&amp;lt;ref&amp;gt;Früher hat die Autokonfiguration bei mehreren vorhandenen Netzwerkschnittstellen nicht zuverlässig funktioniert, deswegen der gezeigte Workaround.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Das Zirkumflex (&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;) dient als Hervorhebung für einen Buchstaben im Menü. Dieser Buchstabe auf der Tastatur eingegeben aktiviert diesen Menüeintrag.&lt;br /&gt;
&lt;br /&gt;
== NFS-Server ==&lt;br /&gt;
In der Datei &#039;&#039;/etc/exports&#039;&#039; wird definiert, welche Hosts auf welche Verzeichnisse Zugriff haben:&lt;br /&gt;
 /var/nfsboot    192.168.1.0/24(ro,no_root_squash,insecure,no_subtree_check)&lt;br /&gt;
&lt;br /&gt;
Nun müssen die Verzeichnisse für das Rootdateisystem noch angelegt werden:&lt;br /&gt;
 mkdir -p /var/nfsboot/deb-live/amd64 /var/nfsboot/deb-live/i686&lt;br /&gt;
&lt;br /&gt;
Damit die Änderungen ziehen, einmal den (mangels gültiger Einträge in &#039;&#039;exports&#039;&#039; sowieso nicht gestarteten) NFS-Server starten:&lt;br /&gt;
 service nfs-kernel-server start&lt;br /&gt;
&lt;br /&gt;
== Root-Dateisystem ==&lt;br /&gt;
Dies wird über eine &amp;quot;frische&amp;quot; Installation von Debian von Grund auf neu erzeugt:&lt;br /&gt;
* Debootstrap,&lt;br /&gt;
* Konfigurationsanpassungen,&lt;br /&gt;
* Squashfs-Build.&lt;br /&gt;
&lt;br /&gt;
Genaueres, samt einem zugehörigen Script folgt in Kürze.&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
Wenn nichts falsch gemacht wurde, so bezieht der Client nun beim Netzboot eine IP-Adresse vom DHCP-Server und lädt die PXE-Dateien, um im Anschluss ein Menü anzuzeigen, was denn nun gestartet werden soll. Nach der Auswahl eines Punktes werden Kernel und Initrd per TFTP übermittelt und der Kernel gestartet. Per erneuter DHCP-Anfrage erhält der Kernel gültige Netzparameter und mountet nun das per NFS zugängliche Squashfs als &#039;&#039;root&#039;&#039;. Ab dann ist das Debian-Live-System aktiv.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;/var/log/daemon.log&#039;&#039; finden sich Meldungen vom TFTP-Server, was hilfreich bei der Fehlersuche sein kann.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://kb.isc.org/docs/aa-00333 Where to find ISC DHCP documentation?], ISC.org&lt;br /&gt;
* [http://grml.org/online-docs/live-initramfs.en.7.html Doku zur live-initramfs] (Manpage im HTML-Format, englisch.)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=VMware_ESXi-Installation_via_PXE_starten&amp;diff=3093</id>
		<title>VMware ESXi-Installation via PXE starten</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=VMware_ESXi-Installation_via_PXE_starten&amp;diff=3093"/>
		<updated>2024-05-11T16:38:33Z</updated>

		<summary type="html">&lt;p&gt;PoC: Kommt nicht mehr, ich mach nix mehr mit Vmware&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Um eine aktuelle Version von &#039;&#039;&#039;VMware ESXi&#039;&#039;&#039; in eine &#039;&#039;&#039;PXE&#039;&#039;&#039;-Bootumgebung zu integrieren wird zuerst eine bestehende PXE-Umgebung benötigt. Wie diese im Linux-Kontext zu konfigurieren ist, ist im Artikel [[Debian-Live Netzbootsystem]] nachzulesen.&lt;br /&gt;
&lt;br /&gt;
Dabei muss zwischen älteren und neueren Versionen von &#039;&#039;pxelinux&#039;&#039; unterschieden werden. Neuere Versionen können die bei VMware mitgelieferte &#039;&#039;mboot.c32&#039;&#039; nicht mehr starten. Dieses ist eine COM32R-Datei, während alle neueren Versionen das ELF-Format benutzen.&lt;br /&gt;
&lt;br /&gt;
Zuerst muss von VMware das entsprechende Image heruntergeladen werden. Dieses wird dann auf dem Linuxserver gemountet.&lt;br /&gt;
&lt;br /&gt;
== Mit altem Syslinux/pxeboot ==&lt;br /&gt;
Der Inhalt in einen Ordner unterhalb des TFTP-Ordners kopiert (beispielhafte Kommdos, Pfade sind ggfs. anzupassen):&lt;br /&gt;
 mount -o loop,ro /data/VMware-VMvisor-Installer-5.5.0.update02-2068190.x86_64.iso /mnt/cdrom&lt;br /&gt;
 mkdir /var/tftpboot/vmware-install&lt;br /&gt;
 cp -R /mnt/cdrom/* /var/tftpboot/vmware-install/&lt;br /&gt;
&lt;br /&gt;
Als nächster Schritt muss die Bootkonfigurationsdatei angepasst werden:&lt;br /&gt;
 cd /var/tftpboot/vmware-install&lt;br /&gt;
 sed -e &amp;quot;s#/##g&amp;quot; -e &amp;quot;3s#^#prefix=$PWD/\n#&amp;quot; -e &amp;quot;6s#jumpstrt.gz --- useropts.gz --- ##&amp;quot; -i.bak boot.cfg&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Vereinfachung mittels sed erledigt folgende Schritte:&lt;br /&gt;
* Löscht alle führenden / aus allen Pfadangaben,&lt;br /&gt;
* Fügt eine neue Zeile ein mit der &#039;&#039;Prefix&#039;&#039;-Direktive und dem vollen Pfad zum tftp-Ordner, damit nicht alle Dateien mit den vollen Pfadnamen referenziert werden müssen&lt;br /&gt;
* Löscht Referenzen auf &#039;&#039;jumpstrt.gz&#039;&#039; und &#039;&#039;useropts.gz&#039;&#039; – beides leere Dateien im Gzip-Format. Beim Booten von ESXi 5.5 via tftp bleibt der Loader sonst mit einer Fehlermeldung bei diesen Dateien stehen. Bei ESXi 5.1 gibt es &#039;&#039;jumpstrt.gz&#039;&#039; nicht, daher funktioniert o.&amp;amp;thinsp;G. Regexp nicht. Bitte dann manuell nachbessern.&lt;br /&gt;
&lt;br /&gt;
Als letztes muss nun noch ein Eintrag in die PXE-Konfigurationsdatei mit aufgenommen werden, um einen entsprechenden Eintrag im Menü zu erhalten:&lt;br /&gt;
 label esxi55&lt;br /&gt;
 	menu label VMware ESXi 5.5 Install&lt;br /&gt;
 	kernel vmware-install/mboot.c32&lt;br /&gt;
 	append -c /var/tftpboot/vmware-install/boot.cfg&lt;br /&gt;
&lt;br /&gt;
Die Dateien &#039;&#039;s.v00&#039;&#039;, &#039;&#039;sb.v00&#039;&#039; und &#039;&#039;tools.t00&#039;&#039; sind recht groß und benötigen zum Download via tftp ihre Zeit. Nicht verzweifeln, falls es so aussieht als würde sich der Bootvorgang an dieser Stelle aufgehängt haben.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.vcritical.com/2011/07/vmware-esxi-5-interactive-pxe-installation-improvements/ VMware ESXi 5 Interactive PXE Installation Improvements]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:VMware]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Microsoft_Windows_Server_2000_tempor%C3%A4re_Terminaldienstelizenzen_automatisch_erneuern&amp;diff=3092</id>
		<title>Microsoft Windows Server 2000 temporäre Terminaldienstelizenzen automatisch erneuern</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Microsoft_Windows_Server_2000_tempor%C3%A4re_Terminaldienstelizenzen_automatisch_erneuern&amp;diff=3092"/>
		<updated>2024-05-10T09:07:18Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Weblinks */ http-Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Microsoft Windows Server 2000&#039;&#039;&#039; stellt ohne gültige Terminaldienste-Lizenz lediglich temporäre Lizenzen aus. Diese sind nur drei Monate Tage gültig. Durch Löschen des Lizenzspeichers &#039;&#039;C:\WINNT\system32\LServer\TLSLic.edb&#039;&#039; kann man wiederum drei Monate Nutzungszeit in Anspruch nehmen. Allerdings müssen dann auch die temporären Lizenzen der Clients gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
== Automatisierung ==&lt;br /&gt;
Diese Batchdatei kann als geplanter Task benutzt werden:&lt;br /&gt;
 @echo off&lt;br /&gt;
 net stop TermServLicensing&lt;br /&gt;
 del C:\WINNT\system32\LServer\TLSLic.bak&lt;br /&gt;
 rename C:\WINNT\system32\LServer\TLSLic.edb TLSLic.bak&lt;br /&gt;
 del C:\WINNT\system32\LServer\TLSLic.bak&lt;br /&gt;
 del C:\WINNT\system32\LServer\edb.chk&lt;br /&gt;
 net start TermServLicensing&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Lizenzspeicher bei Microsoft Remote Desktop for Mac bereinigen]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://support.microsoft.com/de-de/help/187614/removing-terminal-server-licenses-from-an-rdp-client Entfernen von Terminalserverlizenzen von einem RDP-client]&lt;br /&gt;
* [https://itech-tr.blogspot.com/2010/06/terminal-services-unlimited.html Terminal Services Unlimited]&lt;br /&gt;
* [https://smarterlasopa452.weebly.com/crack-rdp-windows-server-2008-r2.html How to reset Windows Terminal Services three Month Trial]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Windows]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Datei:1x1-transparent.png&amp;diff=3091</id>
		<title>Datei:1x1-transparent.png</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Datei:1x1-transparent.png&amp;diff=3091"/>
		<updated>2024-04-14T15:14:44Z</updated>

		<summary type="html">&lt;p&gt;PoC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Debian_Bullseye_auf_HPE_Microserver_Gen10&amp;diff=3090</id>
		<title>Debian Bullseye auf HPE Microserver Gen10</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Debian_Bullseye_auf_HPE_Microserver_Gen10&amp;diff=3090"/>
		<updated>2024-04-11T19:54:32Z</updated>

		<summary type="html">&lt;p&gt;PoC: Neu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;HPE Microserver Gen10&#039;&#039;&#039; hat einen Onboard Marvell SATA Controller. Mit dem Standardkernel (6.1.0) von &#039;&#039;&#039;Debian Bullseye&#039;&#039;&#039; bleibt der Rechner während des Kernel-Starts beim Erkennen der Festplatten hängen, versucht die Disks mit geringeren Datenraten anzusprechen und beginnt wieder von vorn.&lt;br /&gt;
&lt;br /&gt;
 Marvell Technology Group Ltd. 88SE9230 PCIe 2.0 x2 4-port SATA 6 Gb/s RAID Controller (rev 11)&lt;br /&gt;
&lt;br /&gt;
Kernelmeldungen beinhalten den String &amp;lt;code&amp;gt;failed to IDENTIFY&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Lösung ==&lt;br /&gt;
&amp;lt;code&amp;gt;iommu=pt&amp;lt;/code&amp;gt; zu den Kernelparametern ergänzen.&amp;lt;ref&amp;gt;Das rauszufinden hat mich drei Stunden Recherche, wiederholtes PXE-Booten und Ausprobieren gekostet.&amp;lt;/ref&amp;gt; Es ist nicht notwendig, die MMU mit &amp;lt;code&amp;gt;iommu=off&amp;lt;/code&amp;gt; ganz auszuknipsen.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://lore.kernel.org/linux-iommu/20230328012231.GB21977@lst.de/T/ &amp;lt;nowiki&amp;gt;Re: [regression] Bug 217218 - Trying to boot Linux version 6-2.2 kernel with Marvell SATA controller 88SE9235&amp;lt;/nowiki&amp;gt;], LKML&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Hardware]]&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3083</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3083"/>
		<updated>2023-10-18T16:17:25Z</updated>

		<summary type="html">&lt;p&gt;PoC: Überarbeitet anhand Deb12&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso debian-live-12.2.0-amd64-standard.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten,&lt;br /&gt;
  apt-get install gdisk mdadm dosfstools dump&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,&lt;br /&gt;
 mkfs.fat /dev/sda1,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit&lt;br /&gt;
 ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen: &amp;lt;code&amp;gt;mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
 /dev/sda1	/boot/efi	vfat	defaults	0	0&lt;br /&gt;
* Anlegen des EFI-Bootverzeichnisses,&lt;br /&gt;
 mkdir /boot/efi&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
 mount -a&lt;br /&gt;
* Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub,&lt;br /&gt;
 apt-get install grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
* Sichern der Grub-Defaults,&lt;br /&gt;
 cp -a /etc/default/grub /etc/default/grub~&lt;br /&gt;
* Löschen von altem Grub-PC-Kram, die Frage nach Löschen vom alten Bootloader bejahen,&lt;br /&gt;
 dpkg -P grub-pc grub-pc-bin&lt;br /&gt;
* Restore der Grub-Defaults,&lt;br /&gt;
 mv /etc/default/grub~ /etc/default/grub&lt;br /&gt;
* Restore von gemeinsamen Grub-Dateien durch Reinstallation,&lt;br /&gt;
 apt-get install --reinstall grub-efi-amd64 grub-efi-amd64-bin&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten: &amp;lt;code&amp;gt;umount boot/efi* dev/pts dev proc sys; cd ..; umount mnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
Aus der Praxis…&lt;br /&gt;
&lt;br /&gt;
==== Meldung: EFI variables are not supported on this system ====&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11 notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
==== Nach Reboot erscheint nur die Grub-Kommandozeile ====&lt;br /&gt;
Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wurde, hätte &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
abgesetzt werden müssen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht.&lt;br /&gt;
&lt;br /&gt;
Lösung: Die Schritte von oben nochmal wiederholen:&lt;br /&gt;
* Boot von externem Medium,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Mounten der benötigten Partitionen,&lt;br /&gt;
* Grub-Konfiguration neu schreiben:&lt;br /&gt;
 grub-install&lt;br /&gt;
 update-grub&lt;br /&gt;
* &amp;lt;code&amp;gt;umount&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Reboot.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3082</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3082"/>
		<updated>2023-10-18T16:02:55Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Fallstricke */ Neueres Image&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Fallstricke ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso debian-live-12.2.0-amd64-standard.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
* Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wird, ist &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install dummy&lt;br /&gt;
 update-grub&lt;br /&gt;
abzusetzen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht. Nach einem Reboot gibt&#039;s ansonsten die Grub-Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen, z.&amp;amp;thinsp;B.: &amp;lt;code&amp;gt;mkfs.fat -F32 /dev/sda1&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit z.&amp;amp;thinsp;B. &amp;lt;code&amp;gt;ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen: &amp;lt;code&amp;gt;mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub: &amp;lt;code&amp;gt;apt-get install grub-efi-amd64 grub-efi-amd64-bin&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Löschen von altem Grub-PC-Kram: &amp;lt;code&amp;gt;dpkg -P grub-pc grub-pc-bin&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Prüfen, ob &#039;&#039;/etc/default/grub&#039;&#039; existiert und falls nicht, nochmal vom Backup kopieren.&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install. Statt dessen wird als (leider benötigter Parameter) &#039;&#039;dummy&#039;&#039; übergeben.&lt;br /&gt;
 grub-install dummy&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten: &amp;lt;code&amp;gt;umount boot/efi* dev proc sys; cd ..; umount mnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11  notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Systemd_bei_Debian_loswerden&amp;diff=3081</id>
		<title>Systemd bei Debian loswerden</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Systemd_bei_Debian_loswerden&amp;diff=3081"/>
		<updated>2023-10-18T12:14:39Z</updated>

		<summary type="html">&lt;p&gt;PoC: Test mit Deb 11: Kein shim mehr, Rest funktioniert 1:1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Debian Jessie&#039;&#039;&#039; (8) (und neuer) bringt per Default ein neues Startsystem, mit: Systemd. Nach sorgfältiger Recherche und Abwägen des Für und Wider habe ich mich dazu entschlossen, meine Debian-Installationen ohne &#039;&#039;&#039;Systemd&#039;&#039;&#039; zu betreiben, sondern auf die nach wie vor unterstützte traditionelle Sysv-Umgebung zu setzen. Bei den Betrachtungen ist wichtig, dass es hier nicht um Desktopsysteme geht, sondern um Serverinstallationen.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung wurde mit Debian Buster (10) verifiziert.&lt;br /&gt;
&lt;br /&gt;
Mit Debian 12 (Bookworm) gibt es wohl neue Paketabhängigkeiten, weswegen diese Anleitung nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Gründe ==&lt;br /&gt;
Achtung, dies ist meine subjektive Betrachtungsweise!&lt;br /&gt;
&lt;br /&gt;
* Systemd ist unübersichtlich, weil Systemd alles abdecken möchte, was derzeit von bekannten und gut funktionierenden Subsystemen abgedeckt wird:&lt;br /&gt;
** &#039;&#039;Init&#039;&#039; für Runlevelmanagement und Startvorgang,&lt;br /&gt;
** &#039;&#039;Udev&#039;&#039; für dynamische &#039;&#039;/dev&#039;&#039;-Nodes und Netzwerkinterfaces,&lt;br /&gt;
** Ergänzung/Ablöse von &#039;&#039;(x)inetd&#039;&#039; zwecks Nachstarten von Prozessen,&lt;br /&gt;
** evtl. weiteres, was mir bisher nicht negativ aufgefallen ist.&lt;br /&gt;
&lt;br /&gt;
Welche eigentlich netten und relevanten Features verlieren die Installationen durch den Verzicht?&lt;br /&gt;
* Den beeindruckend schnellen Startvorgang, u.&amp;amp;thinsp;A. durch Parallelisierung von Daemonstarts,&lt;br /&gt;
* Automatische Prozessisolation durch die Integration von &#039;&#039;cgroups&#039;&#039; in den Startvorgang.&lt;br /&gt;
&lt;br /&gt;
Was gewinnt man durch den Verzicht?&lt;br /&gt;
* Eine bekannte, verlässliche und durch jahrelange Erfahrung gestützte Systemumgebung, die alte Hasen im Schlaf und zeitgleichem Vollsuff beherrschen; ein nicht zu unterschätzender Punkt für Serveradministratoren,&lt;br /&gt;
* deutlich näher dran an &#039;&#039;[https://en.wikipedia.org/wiki/Everything_is_a_file everything is a file]&#039;&#039;,&lt;br /&gt;
* erprobtes Logging im ASCII-Format mit allen Vorteilen wie z.&amp;amp;thinsp;B. &#039;&#039;grep&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
 apt-get install sysvinit-core bootlogd systemd-sysv-&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
Danach:&lt;br /&gt;
 apt-get autoremove --purge systemd&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Beim letzten &#039;&#039;apt-get&#039;&#039;-Aufruf sollte geprüft werden, ob eventuell weitere Pakete deinstalliert werden, welche &#039;&#039;Systemd&#039;&#039; als Abhängigkeit besitzen. Bei Serverinstallationen dürfte dies in der Regel nicht der Fall sein.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Debian-Upgrade auf Jessie ohne Systemd]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.freedesktop.org/wiki/Software/systemd/ Systemd Projektseite] (en)&lt;br /&gt;
* [http://unix.stackexchange.com/questions/5877/what-are-the-pros-cons-of-upstart-and-systemd Darlegung von Für/Wider] bei Stackexchange (en)&lt;br /&gt;
* [http://0pointer.de/blog/projects/the-biggest-myths.html Mythen über Systemd] (en)&lt;br /&gt;
* [http://www.simonrichter.eu/blog/2016-03-03-why-sysvinit.html SimonRichter/ blog/ Why sysvinit?] (en)&lt;br /&gt;
* [https://unix.stackexchange.com/questions/218933/after-switching-to-devuan-how-do-i-remove-systemd After switching to Devuan, how do I remove systemd?] (en)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3080</id>
		<title>Linux von BIOS- auf UEFI-Boot umstellen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Linux_von_BIOS-_auf_UEFI-Boot_umstellen&amp;diff=3080"/>
		<updated>2023-10-18T12:13:43Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Checkliste */ 5MB reichen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ohne zu wissen, was es mit EFI auf sich hat, ist das &#039;&#039;&#039;Umstellen von Linux von BIOS- auf EFI-Boot&#039;&#039;&#039; auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:&lt;br /&gt;
&lt;br /&gt;
== Grundlagen ==&lt;br /&gt;
(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).&lt;br /&gt;
&lt;br /&gt;
== Fallstricke ==&lt;br /&gt;
* Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.&lt;br /&gt;
* Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z.&amp;amp;thinsp;B. [http://cdimage.debian.org/debian-cd/9.6.0-live/amd64/iso-hybrid/debian-live-9.6.0-amd64-xfce.iso debian-live-9.6.0-amd64-xfce.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.&lt;br /&gt;
* Falls das alte BIOS-Grub-Paket mit &amp;lt;code&amp;gt;--purge&amp;lt;/code&amp;gt; gelöscht wird, ist &#039;&#039;&#039;unbedingt&#039;&#039;&#039; danach ein&lt;br /&gt;
 grub-install dummy&lt;br /&gt;
 update-grub&lt;br /&gt;
abzusetzen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht. Nach einem Reboot gibt&#039;s ansonsten die Grub-Kommandozeile.&lt;br /&gt;
&lt;br /&gt;
== Checkliste ==&lt;br /&gt;
* Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),&lt;br /&gt;
* Bootmedium vorbereiten (siehe oben),&lt;br /&gt;
* Boot via EFI-Bootmenü von diesem Medium,&lt;br /&gt;
* Ggfs. manuelle Netzwerkkonfiguration,&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),&lt;br /&gt;
* Vorbereiten der Platten für das OS:&lt;br /&gt;
** Partitionieren (&#039;&#039;gdisk&#039;&#039;), dabei (eine) z.&amp;amp;thinsp;B. 5&amp;amp;thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,&amp;lt;ref&amp;gt;Tatsächlich benötigt werden vom Grub-Loader einige 100&amp;amp;thinsp;KBytes.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ggfs. Erzeugen der gewünschten Arrays mit &#039;&#039;mdadm&#039;&#039;,&lt;br /&gt;
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen, z.&amp;amp;thinsp;B.: &amp;lt;code&amp;gt;mkfs.fat -F32 /dev/sda1&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Mounten des OS-Dateisystems nach z.&amp;amp;thinsp;B. &#039;&#039;/mnt&#039;&#039;, &amp;lt;code&amp;gt;cd /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Kopieren der Installation vom Quellsystem, wie gehabt mit z.&amp;amp;thinsp;B. &amp;lt;code&amp;gt;ssh &#039;&#039;srcsys&#039;&#039; &amp;quot;dump -0a -b 256 -f - /dev/sda1&amp;quot; |restore -r -b 256 -f -&amp;lt;/code&amp;gt;,&lt;br /&gt;
** Vorbereitungen für &#039;&#039;chroot&#039;&#039;: &amp;lt;code&amp;gt;mount -o bind /dev dev/&amp;lt;/code&amp;gt;,&lt;br /&gt;
* &amp;lt;code&amp;gt;chroot /mnt&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Nachmounten von Kernel-Pseudo-Dateisystemen: &amp;lt;code&amp;gt;mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen der EFI-Partition(en),&lt;br /&gt;
* Anpassen der &#039;&#039;/etc/fstab&#039;&#039;, dabei Eintragen von &#039;&#039;efivars&#039;&#039;:&lt;br /&gt;
 none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0&lt;br /&gt;
* Mounten der EFI-Partition(en),&lt;br /&gt;
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),&lt;br /&gt;
* Ggfs. schreiben der RAID-Konfiguration mit &amp;lt;code&amp;gt;/usr/share/mdadm/mkconf &amp;gt; /etc/mdadm/mdadm.conf; update-initramfs -u&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Austauschen von Grub: &amp;lt;code&amp;gt;apt-get install grub-efi-amd64 grub-efi-amd64-bin&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Löschen von altem Grub-PC-Kram: &amp;lt;code&amp;gt;dpkg -P grub-pc grub-pc-bin&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Prüfen, ob &#039;&#039;/etc/default/grub&#039;&#039; existiert und falls nicht, nochmal vom Backup kopieren.&lt;br /&gt;
&lt;br /&gt;
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install. Statt dessen wird als (leider benötigter Parameter) &#039;&#039;dummy&#039;&#039; übergeben.&lt;br /&gt;
 grub-install dummy&lt;br /&gt;
&lt;br /&gt;
* Raus aus der chroot: &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt;,&lt;br /&gt;
* Unmounten: &amp;lt;code&amp;gt;umount boot/efi* dev proc sys; cd ..; umount mnt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Mögliche Fehler ===&lt;br /&gt;
 grub-install: warning: EFI variables are not supported on this system.&lt;br /&gt;
&lt;br /&gt;
Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11  notwendig zu sein, einen weiteren Mountpoint zu setzen:&lt;br /&gt;
&lt;br /&gt;
 none /sys/firmware/efi/efivars  efivarfs  defaults  0  0&lt;br /&gt;
&lt;br /&gt;
Damit funktioniert dann auch ein &amp;lt;code&amp;gt;grub-install&amp;lt;/code&amp;gt; fehlerfrei.&lt;br /&gt;
&lt;br /&gt;
=== Redundanz ===&lt;br /&gt;
Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht&amp;lt;ref&amp;gt;Schlampiger Admin…&amp;lt;/ref&amp;gt; oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.&lt;br /&gt;
&lt;br /&gt;
EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine &#039;&#039;/boot&#039;&#039;-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über &#039;&#039;mdadm&#039;&#039; mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.&amp;lt;br /&amp;gt;&lt;br /&gt;
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in &#039;&#039;/boot/efi2&#039;&#039;, &#039;&#039;/boot/efi3&#039;&#039;, usw. gemounteten FAT32-Partitionen zu kopieren.&lt;br /&gt;
&lt;br /&gt;
Für Debian muss eine Datei angelegt und als ausführbar markiert werden: &#039;&#039;/etc/grub.d/42_update-hook&#039;&#039;:&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync&lt;br /&gt;
 #             contents manually to provide poor man&#039;s redundancy.&lt;br /&gt;
 if mount -t vfat |awk &#039;{print $3}&#039; |grep -q &#039;^/boot/efi$&#039;; then&lt;br /&gt;
 	cat /dev/null &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	for MP in `mount -t vfat |awk &#039;{print $3}&#039; |grep -v &#039;^/boot/efi$&#039;`; do&lt;br /&gt;
 		rsync -av --delete /boot/efi/ ${MP}/ &amp;gt;&amp;gt; /var/log/update-grub.log&lt;br /&gt;
 	done&lt;br /&gt;
 else&lt;br /&gt;
 	echo &amp;quot;No EFI Mount Point detected.&amp;quot; &amp;gt; /var/log/update-grub.log&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 # --EOF--&lt;br /&gt;
&lt;br /&gt;
Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://outflux.net/blog/archives/2018/04/19/uefi-booting-and-raid1/ UEFI booting and RAID1]&lt;br /&gt;
* [https://www.heise.de/newsticker/meldung/Was-Linux-Anwender-ueber-UEFI-wissen-muessen-4204725.html Was Linux-Anwender über UEFI wissen müssen]&lt;br /&gt;
* [https://packages.debian.org/stable/bootcd Run your system from cd without need for disks]&amp;lt;ref&amp;gt;Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [https://wiki.debian.org/EFIStub …it is possible to load the kernel directly, without any additional bootloader]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=BBEdit_Einstellungen_auf_Standard_nach_Update&amp;diff=3054</id>
		<title>BBEdit Einstellungen auf Standard nach Update</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=BBEdit_Einstellungen_auf_Standard_nach_Update&amp;diff=3054"/>
		<updated>2023-09-04T08:41:12Z</updated>

		<summary type="html">&lt;p&gt;PoC: reworked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Seitdem &#039;&#039;TextWrangler&#039;&#039; nicht mehr weiterentwickelt wird und stattdessen eine Light-Version von &#039;&#039;BBEdit&#039;&#039; dessen Funktion übernehmen soll, kommt es immer wieder vor, dass nach einem Upgrade via Appstore die &#039;&#039;&#039;Einstellungen von BBEdit wieder zurück auf Standard gesetzt werden&#039;&#039;&#039;. Ob dies einem Schluckauf der OS X Sandbox geschuldet ist, oder andere Ursachen hat, lässt sich nicht ohne weiteres feststellen.&lt;br /&gt;
&lt;br /&gt;
Jedenfalls ist es ärgerlich, wenn die über längere Zeit etablierten Einstellungen plötzlich weg sind.&lt;br /&gt;
&lt;br /&gt;
== Lokation ==&lt;br /&gt;
Die Einstelllungen selbst befinden sich in &#039;&#039;~/Library/Containers/com.barebones.bbedit/Data/Library/Preferences/com.barebones.bbedit.plist&#039;&#039;. Diese Datei kann man sich recht einfach aus einem Timemachine-Backup zurückholen. Dummerweise sieht die Verzeichnisstruktur im Finder leicht anders aus. Dort ist es &#039;&#039;~/Library/Containers/BBEdit/Data/Library/Preferences/com.barebones.bbedit.plist&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;Am Besten man öffnet sich via Terminal-Kommando den standardmäßig versteckten &#039;&#039;Library&#039;&#039;-Ordner und hangelt sich via Finder-Fenster durch:&lt;br /&gt;
 open ~/Library&lt;br /&gt;
&lt;br /&gt;
Danach markiert man die Prefs-Datei, wählt im Time Machine Menü &#039;&#039;Time Machine öffnen&#039;&#039; und sucht sich einen hinreichend alten Stand raus, definitiv vor dem letzten Upgrade.&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit der Shell hangelt man sich dann durch das Time Machine Backup Volume (unterhalb &#039;&#039;/Volumes/&#039;&#039;) und bis zum o.&amp;amp;thinsp;G. Ordner durch. Mittels &amp;lt;code&amp;gt;cp com.barebones.bbedit.plist ~/Library/Containers/com.barebones.bbedit/Data/Library/Preferences/&amp;lt;/code&amp;gt; kopiert man den alten Stand.&lt;br /&gt;
&lt;br /&gt;
Damit ist das Problem (temporär, bis zu wieder einem anderen Upgrade) gelöst.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Datensicherung]]&lt;br /&gt;
[[Kategorie: Mac OS X]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Systemd_bei_Debian_loswerden&amp;diff=3053</id>
		<title>Systemd bei Debian loswerden</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Systemd_bei_Debian_loswerden&amp;diff=3053"/>
		<updated>2023-06-24T14:12:08Z</updated>

		<summary type="html">&lt;p&gt;PoC: Versionstests, toten Link entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Debian Jessie&#039;&#039;&#039; (8) (und neuer) bringt per Default ein neues Startsystem, mit: Systemd. Nach sorgfältiger Recherche und Abwägen des Für und Wider habe ich mich dazu entschlossen, meine Debian-Installationen ohne &#039;&#039;&#039;Systemd&#039;&#039;&#039; zu betreiben, sondern auf die nach wie vor unterstützte traditionelle Sysv-Umgebung zu setzen. Bei den Betrachtungen ist wichtig, dass es hier nicht um Desktopsysteme geht, sondern um Serverinstallationen.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung wurde mit Debian Buster (10) verifiziert.&lt;br /&gt;
&lt;br /&gt;
Mit Debian 12 (Bookworm) gibt es wohl neue Paketabhängigkeiten, weswegen diese Anleitung nicht mehr funktioniert.&lt;br /&gt;
&lt;br /&gt;
== Gründe ==&lt;br /&gt;
Achtung, dies ist meine subjektive Betrachtungsweise!&lt;br /&gt;
&lt;br /&gt;
* Systemd ist unübersichtlich, weil Systemd alles abdecken möchte, was derzeit von bekannten und gut funktionierenden Subsystemen abgedeckt wird:&lt;br /&gt;
** &#039;&#039;Init&#039;&#039; für Runlevelmanagement und Startvorgang,&lt;br /&gt;
** &#039;&#039;Udev&#039;&#039; für dynamische &#039;&#039;/dev&#039;&#039;-Nodes und Netzwerkinterfaces,&lt;br /&gt;
** Ergänzung/Ablöse von &#039;&#039;(x)inetd&#039;&#039; zwecks Nachstarten von Prozessen,&lt;br /&gt;
** evtl. weiteres, was mir bisher nicht negativ aufgefallen ist.&lt;br /&gt;
&lt;br /&gt;
Welche eigentlich netten und relevanten Features verlieren die Installationen durch den Verzicht?&lt;br /&gt;
* Den beeindruckend schnellen Startvorgang, u.&amp;amp;thinsp;A. durch Parallelisierung von Daemonstarts,&lt;br /&gt;
* Automatische Prozessisolation durch die Integration von &#039;&#039;cgroups&#039;&#039; in den Startvorgang.&lt;br /&gt;
&lt;br /&gt;
Was gewinnt man durch den Verzicht?&lt;br /&gt;
* Eine bekannte, verlässliche und durch jahrelange Erfahrung gestützte Systemumgebung, die alte Hasen im Schlaf und zeitgleichem Vollsuff beherrschen; ein nicht zu unterschätzender Punkt für Serveradministratoren,&lt;br /&gt;
* deutlich näher dran an &#039;&#039;[https://en.wikipedia.org/wiki/Everything_is_a_file everything is a file]&#039;&#039;,&lt;br /&gt;
* erprobtes Logging im ASCII-Format mit allen Vorteilen wie z.&amp;amp;thinsp;B. &#039;&#039;grep&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Vorgehensweise ==&lt;br /&gt;
 apt-get install sysvinit-core systemd-shim bootlogd systemd-sysv-&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
Danach:&lt;br /&gt;
 apt-get autoremove --purge systemd systemd-shim&lt;br /&gt;
&lt;br /&gt;
Fertig.&lt;br /&gt;
&lt;br /&gt;
Beim letzten &#039;&#039;apt-get&#039;&#039;-Aufruf sollte geprüft werden, ob eventuell weitere Pakete deinstalliert werden, welche &#039;&#039;Systemd&#039;&#039; als Abhängigkeit besitzen. Bei Serverinstallationen dürfte dies in der Regel nicht der Fall sein.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Debian-Upgrade auf Jessie ohne Systemd]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.freedesktop.org/wiki/Software/systemd/ Systemd Projektseite] (en)&lt;br /&gt;
* [http://unix.stackexchange.com/questions/5877/what-are-the-pros-cons-of-upstart-and-systemd Darlegung von Für/Wider] bei Stackexchange (en)&lt;br /&gt;
* [http://0pointer.de/blog/projects/the-biggest-myths.html Mythen über Systemd] (en)&lt;br /&gt;
* [http://www.simonrichter.eu/blog/2016-03-03-why-sysvinit.html SimonRichter/ blog/ Why sysvinit?] (en)&lt;br /&gt;
* [https://unix.stackexchange.com/questions/218933/after-switching-to-devuan-how-do-i-remove-systemd After switching to Devuan, how do I remove systemd?] (en)&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Linux]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Apple_TimeMachine_Backup_in_Disk_Image&amp;diff=2999</id>
		<title>Apple TimeMachine Backup in Disk Image</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Apple_TimeMachine_Backup_in_Disk_Image&amp;diff=2999"/>
		<updated>2023-05-07T14:12:22Z</updated>

		<summary type="html">&lt;p&gt;PoC: /* Siehe auch */ +Link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Apple TimeMachine&#039;&#039;&#039; ist ziemlich wählerisch, wohin es Backups macht. Ursprünglich sollte das eine lokal angehängte Disk sein, mit der man im Katastrophenfall starten und dann direkt auf das neue Speichermedium rücksichern kann.&lt;br /&gt;
&lt;br /&gt;
Seit längerer Zeit beherrschen Macs das Starten via Internet bzw. den dort angeschlossenen Apple Servern — sofern man eine funktionierende Internetverbindung hat eine praktische Sache. Damit ist das Thema Starten für Restore vakant.&lt;br /&gt;
&lt;br /&gt;
== Notwendige Schritte ==&lt;br /&gt;
Im Terminal:&lt;br /&gt;
* &#039;&#039;&#039;Lokales&#039;&#039;&#039; Backupimage anlegen. Angelegt wird das im aktuellen Verzeichnis. Im Regelfall ist das das Homeverzeichnis. Die Parameter sollten nach Notwendigkeit angepasst werden.&lt;br /&gt;
 hdiutil create -size 500G -fs HFS+J -volname &#039;Backup Volume&#039; Backupvolume.sparsebundle&lt;br /&gt;
&lt;br /&gt;
* Mounten des Servervolumes (mit &#039;&#039;Cmd-K&#039;&#039;) und Kopieren des Images via Finder.&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;Achtung!&#039;&#039;&#039; Anlegen des Images direkt auf dem Server dauert erheblich länger und legt kein Sparsebundle an, sondern die Datei in voller Größe!&amp;lt;/blockquote&amp;gt;Nach dem Kopieren kann die lokale Version gelöscht werden.&lt;br /&gt;
&lt;br /&gt;
* Image auf dem Server doppelklicken (mounten).&lt;br /&gt;
&lt;br /&gt;
* Timemachine via Kommandozeile im Terminal anweisen, das gemountete Volume zu benutzen. &#039;&#039;Sudo&#039;&#039; wird nach dem Passwort fragen!&lt;br /&gt;
 sudo tmutil setdestination /Volumes/&#039;Backup Volume&#039;&lt;br /&gt;
&lt;br /&gt;
In den TimeMachine Systemeinstellungen bzw. über die Menüleiste kann nun das erste Backup von Hand gestartet werden.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [https://foliovision.com/2010/05/network-backup-apple-timemachine How to create a network backup with Apple’s TimeMachine], FolioVision&lt;br /&gt;
* [https://www.makeuseof.com/tag/turn-nas-windows-share-time-machine-backup/ Turn Your NAS Or Windows Share Into A Time Machine Backup], Makeuseof.com&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: Datensicherung]]&lt;br /&gt;
[[Kategorie: Mac OS X]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=AS/400_DNS-Server_ohne_OpNav&amp;diff=2935</id>
		<title>AS/400 DNS-Server ohne OpNav</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=AS/400_DNS-Server_ohne_OpNav&amp;diff=2935"/>
		<updated>2023-01-23T15:52:10Z</updated>

		<summary type="html">&lt;p&gt;PoC: Typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der &#039;&#039;&#039;DNS-Server&#039;&#039;&#039; von OS/400 kann offiziell nur via &#039;&#039;&#039;OpNav&#039;&#039;&#039; konfiguriert werden. Es geht aber auch anders…&lt;br /&gt;
&lt;br /&gt;
OpNav ist ein Bestandteil von ClientAccess für Windows, was bei einer OS/400-Installation mit installiert wird. Bei alten OS/400-Versionen wird eine entsprechend alte ClientAccess-Version mitgeliefert, die unter aktuellen Windows-Versionen nicht oder nicht mehr sauber läuft. Erschwerend kommt hinzu, dass der SMB-Server dieser alten Versionen nicht mehr mit dem neueren Client-Code in neueren Windows-Versionen harmoniert — Zugriff leider nicht möglich. Somit bleibt nur FTP zum Datenaustausch.&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
Dns DNS von OS/400 V4R2 bis einschliesslich V4R5 basiert auf BIND 4.9.3 vom ISC. Somit gelten auch die Konfigurationsdirektiven unmittelbar. Beim Start wird nach der Hauptkonfiguratiosndatei &#039;&#039;/QIBM/USERDATA/OS400/DNS/BOOT&#039;&#039; gesucht. Diese kann man bequem selbst erstellen:&lt;br /&gt;
&lt;br /&gt;
 EDTF &#039;/QIBM/USERDATA/OS400/DNS/BOOT&#039;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 ; Working Directory&lt;br /&gt;
 directory /QIBM/USERDATA/OS400/DNS&lt;br /&gt;
 ; Root-DNS-File&lt;br /&gt;
 cache . NAMED.ROOT&lt;br /&gt;
 ; Zone Statements&lt;br /&gt;
 secondary myzone.com 192.168.1.11 db.myzone.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;EDTF&#039;&#039; ist in der Bedienung sehr ähnlich zu &#039;&#039;SEU&#039;&#039;. Alternativ kann man diese Datei auch woanders erstellen und im ASCII-Mode per FTP an die passende Stelle laden.&lt;br /&gt;
&lt;br /&gt;
Es empfiehlt sich, eine aktuelle Rootzonen-Datei zu importieren. Diese erhält man z.&amp;amp;thinsp;B. bei [https://www.internic.net/domain/named.root Internic] und kann per FTP nach &#039;&#039;QDNS/QATOCDNSRV.ROOT&#039;&#039; als auch nach — wie in der entsprechenden Direktive angegeben — nach &#039;&#039;/QIBM/USERDATA/OS400/DNS/ROOT.HINT&#039;&#039; übertragen werden.&amp;lt;ref&amp;gt;Der BIND kann mit einer Datei in einer Library nichts anfangen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vor dem Start des DNS-Servers sollten die Verzeichnisrechte angepasst werden:&lt;br /&gt;
 STRQSH CMD(&#039;CHOWN QTCP /QIBM/USERDATA/OS400/DNS&#039;)&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;CHGDNSA&amp;lt;/code&amp;gt; kann der Autostart beim TCP-Start als auch der Debuglevel festgelegt und danach der Server mit &amp;lt;code&amp;gt;STRTCPSVR *DNS&amp;lt;/code&amp;gt; gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Weniger erfreulich ist die Tatsache, dass sich beim Test des DNS als Secondary zu einem BIND 9.10.3 unter Debian Linux keine Sekundärzonen laden lassen. Der Primärserver schiebt die Zonen via AXFR raus, der Slave auf der AS/400 nimmt diese leider nicht an. Gemäß Job Log der AXFRs erwartet BIND mehr Datenbytes als er geliefert bekommt.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.cs.ait.ac.th/~on/O/oreilly/tcpip/dnsbind/ch04_03.htm Setting Up a BIND Configuration File], O&#039;Reilly Books&lt;br /&gt;
* [https://www.redbooks.ibm.com/redbooks/pdfs/sg245147.pdf AS/400 TCP/IP Autoconfiguration: DNS and DHCP Support], IBM RedBooks&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps_Konfiguration_f%C3%BCr_5250-Sitzungen&amp;diff=2934</id>
		<title>Apple SNA•ps Konfiguration für 5250-Sitzungen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps_Konfiguration_f%C3%BCr_5250-Sitzungen&amp;diff=2934"/>
		<updated>2023-01-07T02:31:29Z</updated>

		<summary type="html">&lt;p&gt;PoC: mv =&amp;gt; try-as400&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Artikel ist in englischer Sprache im [https://try-as400.pocnet.net/wiki/Apple_SNA•ps AS/400-Wiki] abrufbar.&lt;br /&gt;
&lt;br /&gt;
Die Pflege von Artikeln in zwei Sprachen ist mir zu aufwendig.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;br /&gt;
[[Kategorie: Mac OS]]&lt;br /&gt;
[[Kategorie: Netzwerk]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps_Konfiguration_f%C3%BCr_5250-Sitzungen&amp;diff=2933</id>
		<title>Apple SNA•ps Konfiguration für 5250-Sitzungen</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Apple_SNA%E2%80%A2ps_Konfiguration_f%C3%BCr_5250-Sitzungen&amp;diff=2933"/>
		<updated>2023-01-06T21:21:07Z</updated>

		<summary type="html">&lt;p&gt;PoC: Gliederung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:5250term.gif|thumb|right|5250 Clientverbindung via SNA•ps]]&lt;br /&gt;
[[Datei:Snagw-run.gif|thumb|right|SNA•ps Gateway Fenster]]&lt;br /&gt;
&#039;&#039;&#039;Apple SNA•ps&#039;&#039;&#039; ist eine Software, welche die Kommunikation von Apple Macs mit System 7.x mit IBM-Rechnersystemen ermöglicht. Die Kommunikation mit den Rechnern findet hierbei nicht wie heutzutage üblich über IP statt, sondern über Protokolle im Rahmen von &#039;&#039;&#039;SNA&#039;&#039;&#039; (Systems Network Architecture).&amp;lt;ref&amp;gt;Neuere Versionen vom SNA•ps 5250 Client unterstützen auch IP/tn5250 als Transportweg.&amp;lt;/ref&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
Das Programmpaket wurde als Ergebnis einer erklärten Zusammenarbeit von IBM und Apple Anfang der 1990er Jahre von Orion Software programmiert.&lt;br /&gt;
&lt;br /&gt;
SNA•ps gibt es zum einen als Gateway mit einer lizenzabhängigen Maximalanzahl von 8, 32 oder 64 [https://en.wikipedia.org/wiki/IBM_Systems_Network_Architecture#Logical_Unit_.28LU.29 LU]-Sessions, zum anderen als Client für 5250-Terminal- und Druckservices als auch 3270-Terminalservices. Dieser Artikel konzentriert sich auf das Thema AS/400 bzw. 5250-Anbindung.&lt;br /&gt;
&lt;br /&gt;
== Funktionsüberblick ==&lt;br /&gt;
Das SNA•ps Gateway macht Ressourcen, die vom Mainframe oder der AS/400 via [https://en.wikipedia.org/wiki/IBM_Systems_Network_Architecture#Physical_Unit_.28PU.29 SNA PUs] bzw. [https://en.wikipedia.org/wiki/IBM_Advanced_Peer-to-Peer_Networking APPN]/[https://en.wikipedia.org/wiki/IBM_Advanced_Program-to-Program_Communication APPC] bereit gestellt werden, im AppleTalk-Netzwerk verfügbar und umgekehrt. Somit muss nicht in jeden Mac eine (teure) Karte zur Anbindung an das SNA-Netzwerk eingebaut werden, zumal das in manchen Fällen gar nicht möglich ist (kompakte Macs wie der Plus haben keine oder nur eingeschränkte Erweiterungsmöglichkeiten. Zudem ist ggfs. die notwendige Netzwerkverkabelung evtl. nicht vorhanden.)&amp;lt;br /&amp;gt;&lt;br /&gt;
Beispiele für Clients sind die Terminalemulationen [https://en.wikipedia.org/wiki/IBM_3270 3270], [https://en.wikipedia.org/wiki/IBM_5250 5250]), die dem SNA•ps-Clientpaket beiliegen: Damit können Macs, die nur im [https://en.wikipedia.org/wiki/AppleTalk AppleTalk]-Netzwerk (z.&amp;amp;thinsp;B. via [https://en.wikipedia.org/wiki/LocalTalk LocalTalk]) verbunden sind, Terminalsitzungen zu den SNA-Hosts aufbauen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ein Beispiel für die umgekehrte Richtung ist die Druckunterstützung. Der SNA•ps-Print Client emuliert einen IBM 8312-Drucker. Druckjobs, die von einer Druckerqueue auf dem Host dort hin versandt werden, können je nach dem über den in der [https://en.wikipedia.org/wiki/Chooser_(Mac_OS) Auswahl] voreingestellten Drucker gedruckt, oder als Text in eine Datei gesichert werden. Dies war ein Weg, den seinerzeit sehr teuren [https://en.wikipedia.org/wiki/LaserWriter Apple LaserWriter] auch für Großrechner nutzbar zu machen.&lt;br /&gt;
&lt;br /&gt;
Das Gegenstück zum SNA•ps Gateway ist eine Systemerweiterung &#039;&#039;SNA•ps Access&#039;&#039;. Die oben genannten Programme benutzen Routinen, welche diese Erweiterung zu Verfügung stellt. Das SNA•ps API kann somit auch von Drittanbietern genutzt werden. Ein Beispiel hierzu ist [https://en.wikipedia.org/wiki/Database_abstraction_layer DAL] für den Macintosh, welches verschiedene Protokolle für die Verbindung zur eigentlichen Datenbank benutzt; unter Anderem IP (via MacTCP) als auch SNA (via SNA•ps Access).&lt;br /&gt;
&lt;br /&gt;
Für die AS/400 existierten in den 1990er Jahren auch LocalTalk-Zusatzkarten und eine Erweiterung für OS/400, um den AppleTalk-Stack auch auf der AS/400 zu implementieren. Die Implementation auf der AS/400 entsprach dem SNA•ps Gateway, so dass kein Mac als Gateway benötigt wurde: Die notwendige Software lief komplett auf der AS/400.&lt;br /&gt;
&lt;br /&gt;
== Systemkompatibilität ==&lt;br /&gt;
Der SNA•ps 5250 Client benötigt zwingend System 7.0 oder höher. Unter System 6 erhält man eine entsprechende Meldung und der Client startet nicht. Der 3270-Terminalclient startet klaglos unter System 6.0.7.&lt;br /&gt;
&lt;br /&gt;
Der Client funktioniert unter Systemen bis inkl. 8.1 und OpenTransport auf 68k-Macs. Er läuft nicht mehr auf PowerPC-Macs, der Start einer Verbindung lässt den Client mit einer &#039;&#039;unimplemented instruction&#039;&#039; abstürzen.&lt;br /&gt;
&lt;br /&gt;
Eine Verbindung via TCP (möglich ab Client Version 1.1) provoziert bereits beim Verbindungsaufbau die Meldung, das Gegenüber könne kein 5250-Protokoll. Nachvollziehbar unter 7.6.1/OT/PPC als auch unter 7.1/MacTCP auf 68k.&lt;br /&gt;
&lt;br /&gt;
Das Gateway selbst verlangt spezielle Hardware für die SNA-Netzwerkverbindung und ist daher eingeschränkt auf NuBus-Systeme.&lt;br /&gt;
&lt;br /&gt;
== Transport ==&lt;br /&gt;
Folgende Verbindungsmöglichkeiten werden unterstützt:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Phy&lt;br /&gt;
! Bemerkungen&lt;br /&gt;
|-&lt;br /&gt;
|SDLC&lt;br /&gt;
|Via Apple Serial NB-Karte&lt;br /&gt;
|-&lt;br /&gt;
|Token Ring&lt;br /&gt;
|Via Apple Token Ring 4/16 NB Karte&lt;br /&gt;
|-&lt;br /&gt;
|Twinax&amp;lt;ref&amp;gt;5250-Sitzungen über Twinax werden nicht unterstützt. Das hätte mal implementiert werden sollen, dazu kam es allerdings nicht mehr.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|Via Apple Koax/Twinax Karte&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Alle diese Karten haben als Besonderheit eine eigene 68000 CPU und lokalen Speicher und entsprechen der Macintosh Coprocessor Platform Spezifikation. Auf der Karte läuft ein kleiner Prozess, welcher über &#039;&#039;Message Passing&#039;&#039; mit dem Gegenstück &#039;&#039;A/ROSE&#039;&#039; im Mac OS kommuniziert und Daten austauscht.&lt;br /&gt;
&lt;br /&gt;
Als Besonderheit läuft ein Teil der SNA•ps-Software auf dem Prozessor der jeweiligen Karte. Zusammen mit dem Rest der Software auf Mac OS-Seite werden APPC-Sitzungen in AppleTalk verpackt und können so auch anderen Macs im lokalen Netzwerk zu Verfügung gestellt werden. Auch über Netzwerkverbindungen, welche kein SNA unterstützen wie z.&amp;amp;thinsp;B. LocalTalk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
Datei:Apple-Token-Ring-NB-Compside.jpg|Apple Token Ring 4/16 NB Karte, vorne&lt;br /&gt;
Datei:Apple-Token-Ring-NB-Solderside.jpg|Apple Token Ring 4/16 NB Karte, hinten&lt;br /&gt;
Datei:Apple-Coax-Twinax-Compside.jpg|Apple Coax/Twinax Karte, vorne&lt;br /&gt;
Datei:Apple-Coax-Twinax-Solderside.jpg|Apple Coax/Twinax Karte, hinten&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfiguration ==&lt;br /&gt;
[[File:Cfg-snaps.gif|thumb|right|183px|Übersicht des Konfigurationsfensters]]&lt;br /&gt;
Als Voraussetzung auf AS/400-Seite muss Autokonfiguration für Controller- und Gerätebeschreibungen erlaubt sein: Siehe dazu den Befehl WRKSYSVAL und die Variablen QAUTOCFG, QAUTORMT und QAUTOVRT. Ggfs. ist es sinnvoll, die Variablen QLMTDEVSSN und QLMTSECOFR anzupassen. Zudem wird eine funktionierende Token Ring-Verbindung vorausgesetzt. In der Leitungsbeschreibung muss der Parameter AUTOCRTCTL auf *YES stehen. Es wird empfohlen, den zugehörigen Parameter AUTODLTCTL auf *NONE zu setzen.&amp;lt;br /&amp;gt;&lt;br /&gt;
Mit dieser Vorbereitung spart man sich die mühsame und fehlerträchtige Konfiguration von OS/400-Controller (*CTLD) und -Gerät (*DEVD) für die Kommunikation mit dem Gateway auf Mac-Seite.&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird mit dem Programm &#039;&#039;SNA•ps Config&#039;&#039; erstellt und schichtweise aufgebaut.&lt;br /&gt;
&lt;br /&gt;
Es ist problemlos möglich, mehrere AS/400 in einem Konfigurationsdokument zu erfassen. Dazu müssen pro Maschine eigene Definitionen für&lt;br /&gt;
* TR Lines,&lt;br /&gt;
* Partners,&lt;br /&gt;
* Remote 6.2 LUs,&lt;br /&gt;
* Modes&lt;br /&gt;
erstellt werden. &#039;&#039;Local 6.2 LUs&#039;&#039; und &#039;&#039;TPs&#039;&#039; gelten für das gesamte Dokument.&lt;br /&gt;
&lt;br /&gt;
Ist eine Maschine im APPN-Verbund als &#039;&#039;Network Node&#039;&#039; konfiguriert, genügt eine Verbindung vom Gateway zu jener Maschine. SNA-APPC Sitzungen werden dann von dort aus weitergeleitet. Es genügt dann, die entsprechenden LUs auf dem Gateway anzulegen.&lt;br /&gt;
&lt;br /&gt;
=== Line ===&lt;br /&gt;
[[File:Cfg-line.gif|thumb|right|183px|Line-Konfiguration]]&lt;br /&gt;
Zuerst wird die &#039;&#039;Line&#039;&#039;-Konfiguration erstellt. Der Name kann frei gewählt werden. Die Vergrößerung des &#039;&#039;Maximum I-Field Length&#039;&#039;-Parameters erhöht den Datendurchsatz und somit die Geschwindigkeit mit welcher Daten durch das Gateway weitergereicht werden. Der höchste akzeptierte Wert ist 4105&amp;amp;thinsp;Bytes. In der &#039;&#039;Line Description&#039;&#039; der AS/400 (was der Line-Konfiguration von SNA•ps entspricht) steht in aller Regel 16393&amp;amp;thinsp;Bytes. Der tatsächlich verwendete Wert wird dynamisch ausgehandelt.&lt;br /&gt;
&lt;br /&gt;
=== Partner ===&lt;br /&gt;
[[File:Cfg-peer.gif|thumb|right|183px|Partnerkonfiguration]]&lt;br /&gt;
Solange die erstellte &#039;&#039;Line&#039;&#039; markiert ist, kann im &#039;&#039;Partners&#039;&#039;-Feld nebenan die Beschreibung für die eigentliche Netzwerkverbindung zur AS/400 definiert werden. Dabei gelten folgende Parallelen zur AS/400-Konfiguration:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Partner-Parameter&lt;br /&gt;
!AS/400-Parameter&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|DSPNETA, Name des lokalen Kontrollpunkts (LCLCPNAME)&lt;br /&gt;
|-&lt;br /&gt;
|Link Address&lt;br /&gt;
|WRKLIND, Lokale Adapteradresse (der Token Ring Line) (ADPTADR)&lt;br /&gt;
|-&lt;br /&gt;
|Partner XID&lt;br /&gt;
|WRKLIND, Austausch-ID (der Token Ring Line) (EXCHID)&lt;br /&gt;
|-&lt;br /&gt;
|Gateway XID&lt;br /&gt;
|Selbst würfeln, muss mit 056 beginnen&amp;lt;ref&amp;gt;Dieser Wert wird beim ersten Start per Autokonfiguration auf die AS/400-seitige Controllerbeschreibung übernommen.&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Gateway Network Name&lt;br /&gt;
|Selbst würfeln, ggfs. den Namen aus dem Kontrollfeld &#039;&#039;Gemeinschaftsfunktionen&#039;&#039; benutzen&lt;br /&gt;
|-&lt;br /&gt;
|Gateway Network Qualifier&lt;br /&gt;
|DSPNETA, Lokale Netzwerk-ID (LCLNETID)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Charakteristik muss auf &#039;&#039;Peer (Node Type 2.1)&#039;&#039; gesetzt werden. Die &#039;&#039;SAP Address&#039;&#039; bleibt auf 4.&lt;br /&gt;
&lt;br /&gt;
=== Local 6.2 LUs ===&lt;br /&gt;
[[File:Cfg-loclu.gif|thumb|right|183px|Lokale 6.2 LUs]]&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!LU-Parameter&lt;br /&gt;
!AS/400-Parameter&lt;br /&gt;
|-&lt;br /&gt;
|Name: PASSTHRU (wird im Kontrollfeld SNA•ps… der Clients benutzt)&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Network LU Name = Gateway Network Name aus der Partner-Konfiguration&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
|Network Qualifier&lt;br /&gt;
|DSPNETA, Lokale Netzwerk-ID (LCLNETID)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== TPs ===&lt;br /&gt;
[[File:Cfg-tp.gif|thumb|right|183px|Transaction Points]]&lt;br /&gt;
Die eben definierte &#039;&#039;Local 6.2 LU&#039;&#039; muss markiert sein, damit ein neuer &#039;&#039;Transaction Point&#039;&#039; erstellt werden kann.&lt;br /&gt;
* Name: * (Sternchen)&lt;br /&gt;
* Network Name = DSPNETA, Lokale Netzwerk-ID der AS/400 (LCLNETID)&lt;br /&gt;
&lt;br /&gt;
Rest belassen.&lt;br /&gt;
&lt;br /&gt;
=== Remote 6.2 LUs ===&lt;br /&gt;
[[File:Cfg-remlu.gif|thumb|right|183px|Ferne 6.2 LUs]]&lt;br /&gt;
Der oben erstellte &#039;&#039;Partner&#039;&#039; muss markiert sein, damit eine zugehörige LU-Konfiguration erstellt werden kann.&lt;br /&gt;
* Name = Name des &#039;&#039;Partner&#039;&#039;s&lt;br /&gt;
* Network LU name = Name des &#039;&#039;Partner&#039;&#039;s&lt;br /&gt;
* Network Qualifier = DSPNETA, Lokale Netzwerk-ID der AS/400 (LCLNETID)&lt;br /&gt;
&lt;br /&gt;
Rest belassen.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
[[File:Cfg-mode.gif|thumb|right|183px|APLSNAPS-Modusbeschreibung]]&lt;br /&gt;
Die oben erstellte &#039;&#039;Remote 6.2 LU&#039;&#039; muss markiert sein, damit eine zugehörige Mode-Konfiguration erstellt werden kann.&lt;br /&gt;
&lt;br /&gt;
Auf der AS/400 gibt es keine passende Modusbeschreibung. Man muss diese daher manuell anlegen:&lt;br /&gt;
 CRTMODD MODD(APLSNAPS) COS(#CONNECT) MAXSSN(32) MAXCNV(32) LCLCTLSSN(0) INPACING(7) OUTPACING(7) TEXT(&#039;Für Apple SNA.ps&#039;)&lt;br /&gt;
&lt;br /&gt;
Es kann passieren, dass das Gateway nicht startet, weil der Speicher (auf der Karte) nicht ausreicht. Dann empfiehlt es sich,  mit &#039;&#039;wrkmodd&#039;&#039; anzupassen: MAXSSN und LCLCTLSSN zu reduzieren. Dies muss logischerweise auch in der SNA ps-Config nachgezogen werden.&lt;br /&gt;
&lt;br /&gt;
== Aktivierung des Gateways ==&lt;br /&gt;
Nachdem die Konfiguration gesichert wurde, wird diese mit dem Programm &#039;&#039;SNA•ps Admin&#039;&#039; der vorhandenen physikalischen Verbindung zugeordnet. Pro SNA-fähiger Verbindungskarte wird im eingeblendeten Fenster &#039;&#039;Network Gateway Status&#039;&#039; eine Zeile angezeigt. Die gewünschte Zeile wird markiert und danach im Menü &#039;&#039;Gateway&#039;&#039; mit &#039;&#039;Select configuration…&#039;&#039; der oben erstellten Konfiguration zugeordnet.&amp;lt;br /&amp;gt;&lt;br /&gt;
Im selben Menü wird empfohlen, über den Punkt &#039;&#039;Change Settings…&#039;&#039;&lt;br /&gt;
* dem Gateway einen schöneren Namen zuzuordnen und&lt;br /&gt;
* alle Checkboxen bis auf &#039;&#039;Initially Log Line Trace&#039;&#039; unter &#039;&#039;Characteristics&#039;&#039; anzuknipsen.&lt;br /&gt;
&lt;br /&gt;
Danach kann im Menü &#039;&#039;Gateway&#039;&#039; mit &#039;&#039;Start Gateway&#039;&#039; die Gatewaysoftware gestartet werden.&lt;br /&gt;
&lt;br /&gt;
Es hat sich gezeigt, dass zumindest mit SNA•ps Version 1.1 das Ausprobieren von Konfigurationsinstellungen mit manuellem Stop und Start manchmal die Meldung provoziert, es wäre zu wenig Speicher vorhanden. Diese Aussage bezieht sich auf den lokalen Speicher auf der entsprechenden Netzwerkkarte. Anscheinend werden Ressourcen dort nicht zuverlässig überschrieben, nach einem Neustart des Rechners ist die Fehlermeldung weg.&lt;br /&gt;
&lt;br /&gt;
Ebenfalls im Menü &#039;&#039;Gateway&#039;&#039; kann nun mit &#039;&#039;Show Gateway&#039;&#039; eine Übersicht über die vorhandenen Ressourcen angezeigt werden. Ein Beispiel ist im zweiten Screenshot ab Artikelbeginn zu sehen.&lt;br /&gt;
&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;nolines&amp;quot;&amp;gt;&lt;br /&gt;
File:Stat-line.gif&lt;br /&gt;
File:Stat-peer.gif&lt;br /&gt;
File:Stat-loclu.gif&lt;br /&gt;
File:Stat-tp.gif&lt;br /&gt;
File:Stat-remlu.gif&lt;br /&gt;
File:Stat-mode-snasvcmg.gif&lt;br /&gt;
File:Stat-mode-aplsnaps.gif&lt;br /&gt;
File:Stat-sess-snasvcmg.gif&lt;br /&gt;
File:Stat-sess-aplsnaps.gif&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Client-Konfiguration SNA•ps 5250 ==&lt;br /&gt;
Im Kontrollfeld &#039;&#039;SNA•ps Access/5250&#039;&#039; kann in der &#039;&#039;Display Configuration&#039;&#039; auf &#039;&#039;Virtual Controller&#039;&#039; umgestellt werden. Der Controllername ist üblicherweise &#039;&#039;QPACTL01&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dft-connsel.gif|right|thumb|Modaler Dialog zur Auswahl einer Standardsitzung]]&lt;br /&gt;
Die Clientkonfiguration beschränkt sich auf die Auswahl der &#039;&#039;Default Connection&#039;&#039; im Menü &#039;&#039;Pref(erence)s&#039;&#039;. Alternativ kann im Client die gewünschte Sitzung direkt konfiguriert werden (&#039;&#039;Session&#039;&#039;, &#039;&#039;Connection…&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Danach wird im Menü &#039;&#039;Session&#039;&#039; mit dem Punkt &#039;&#039;Connect&#039;&#039; die Verbindung zum vorab ausgewählten SNA-Gateway hergestellt. Nach einigen Sekunden wird der AS/400 Signon-Screen angezeigt.&lt;br /&gt;
&lt;br /&gt;
Nebenbei können dann auch noch weitere Parameter gesetzt werden: Größere Schriftart bei entsprechend großen Monitoren, alternative Tastenbelegungen für kleine Mac-Tastaturen (hier bietet sich der Zehnerblock an), usw. Die Einstellungen können in einem Verbindungsdokument gesichert werden. Beim Öffnen eines solchen Dokuments wird die Sitzung automatisch aufgebaut.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Einstellungen können je nach Gusto vorgenommen werden.&lt;br /&gt;
&lt;br /&gt;
== Client-Konfiguration SNA•ps Print ==&lt;br /&gt;
Der Print-Client ist nur in der Paketversion 1.0 enthalten. Damit können Druckjobs flexibel gehandhabt werden.&lt;br /&gt;
&lt;br /&gt;
Im Kontrollfeld &#039;&#039;SNA•ps Access/5250&#039;&#039; muss in der &#039;&#039;Printer Configuration&#039;&#039;, &#039;&#039;Printer Device List…&#039;&#039; ein Drucker konfiguriert werden. Dieser sollte auf der AS/400 nicht existieren, damit er mit den richtigen Parametern angelegt wird.&lt;br /&gt;
&lt;br /&gt;
Nach dem Start von &#039;&#039;SNA•ps Print&#039;&#039; wird nach einem Dateinamen für die nun neu angelegte Druckerverbindung gefragt. Dieses Dokument entsprechend sichern.&lt;br /&gt;
&lt;br /&gt;
Danach wird im Menü &#039;&#039;Session&#039;&#039; mit dem Punkt &#039;&#039;Connect&#039;&#039; die Verbindung zum vorab ausgewählten SNA-Gateway hergestellt. Die AS/400 legt eine Druckergerätedatei (*DEVD) und eine entsprechende Ausgabewarteschlange (*OUTQ) an. Alles was dort reingestellt wird, landet in der Druckroutine von SNA•ps Print.&lt;br /&gt;
&lt;br /&gt;
Es wird ein IBM 3812 Model 1 Drucker (SCS) emuliert.&lt;br /&gt;
&lt;br /&gt;
== Fehlerquellen ==&lt;br /&gt;
* Die Benutzung von &#039;&#039;Trawl&#039;&#039; auf dem Gatewayrechner selbst bringt u.&amp;amp;thinsp;U. AppleTalk ins Schleudern, sodass das Gateway nicht mehr im Managertool auftaucht. Dann hilft nur ein Reboot des Gateway-Rechners.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* Wikipedia (en):&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Systems_Network_Architecture IBM Systems Network Architecture]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Advanced_Program-to-Program_Communication IBM Advanced Program-to-Program Communication]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/IBM_Advanced_Peer-to-Peer_Networking IBM Advanced Peer-to-Peer Networking]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/Synchronous_Data_Link_Control Synchronous Data Link Control]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/A/ROSE Apple Real-time Operating System Environment]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/Message_passing Message Passing]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/AppleTalk AppleTalk]&lt;br /&gt;
** [https://en.wikipedia.org/wiki/LocalTalk LocalTalk]&lt;br /&gt;
* [http://www.mactech.com/articles/develop/issue_04/coprocessor.html Inside The Macintosh Coprocessor Platform And A/ROSE]&lt;br /&gt;
* [https://www.computerwoche.de/a/terminalemulation-bindet-apple-welt-an-as-400-mac-user-haben-direkten-zugriff-auf-as-400-daten,1128406 Terminalemulation bindet Apple-Welt an AS/400], Computerwoche 1993-06-11&lt;br /&gt;
* [https://www.ibm.com/support/knowledgecenter/en/SSEQ5Y_5.9.0/com.ibm.pcomm.doc/books/html/admin_guide19.htm Administrator&#039;s Guide and Reference, SNA Client/Server Concepts], IBM&lt;br /&gt;
* [https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.znetwork/znetwork_6.htm Introduction to networking on the mainframe], IBM&lt;br /&gt;
* [https://web.archive.org/web/20181229140138/http://docwiki.cisco.com/wiki/IBM_Systems_Network_Architecture_Protocols IBM Systems Network Architecture Protocols], Cisco Docwiki (aus dem Archiv)&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;br /&gt;
[[Kategorie: Mac OS]]&lt;br /&gt;
[[Kategorie: Netzwerk]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
	<entry>
		<id>https://kb.pocnet.net/index.php?title=Datei:IPCS-285A.jpg&amp;diff=2926</id>
		<title>Datei:IPCS-285A.jpg</title>
		<link rel="alternate" type="text/html" href="https://kb.pocnet.net/index.php?title=Datei:IPCS-285A.jpg&amp;diff=2926"/>
		<updated>2023-01-05T18:18:59Z</updated>

		<summary type="html">&lt;p&gt;PoC: +Kat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
Zusatzkarte für den IPCS #2850 mit den eigentlichen Schnittstellen und Chipsatz.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AS/400]]&lt;/div&gt;</summary>
		<author><name>PoC</name></author>
	</entry>
</feed>