Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
penglei committed Jan 9, 2025
1 parent f808201 commit 47d0212
Showing 1 changed file with 71 additions and 32 deletions.
103 changes: 71 additions & 32 deletions posts/install-nixos/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,10 @@ <h3 id="配置硬件磁盘和网络">配置硬件(磁盘和网络)</h3>
<p>硬件部份配置主要是三部份:</p>
<ul>
<li><p>bootloader</p>
<p>在这里我使用的是efi引导而不是传统的bios,因此在第6行打开systemd-boot</p></li>
<p>在这里我使用的是efi引导而不是传统的bios,因此在第6行打开systemd-boot。在这里我们可能需要特别注意内核模块的配置,如果我们的机器用的是磁盘阵列(raid),NixOS系统也安装到这样的存储中,则可能需要加载想要的kernel
module才能正确识别磁盘,进而找到文件系统,运行stage2启动1号进程。比如我的R630机器就需要
<code>megaraid_sas</code> 内核模块,需要将其添加到
<code>availableKernelModules</code> 配置中。</p></li>
<li><p>文件系统</p>
<p>12~20行,注意18行的device路径是label的形式</p></li>
<li><p>网络</p>
Expand All @@ -348,26 +351,57 @@ <h3 id="配置密码登录">配置密码登录</h3>
<p>安装好NixOS之后如果网络没有配置好,我们就无法通过ssh登录。这时候通过控制台密码登录是很有必要的。</p>
<p>密码登录的验证信息配置在 <code>/etc/shadow</code>
文件中,它的格式类似下面:</p>
<pre><code>mark:$y$.n.:17736:0:99999:7:::
[--] [----] [---] - [---] ----
│ │ │ │ │ │││└────────────► 9. Unused
│ │ │ │ │ ││└─────────────► 8. Expiration date
│ │ │ │ │ │└──────────────► 7. Inactivity period
│ │ │ │ │ ───────────────► 6. Warning period
<pre><code>user:$y$.n.:17736:0:99999:7:::
[--] [----] [---] - [---] ----[-]
│ │ │ │ │ │││───────────► 9. Unused
│ │ │ │ │ ││└─────────────► 8. Account Expiration date
│ │ │ │ │ │└───────────────► 7. Inactivity period
│ │ │ │ │ └────────────────► 6. Warning period
│ │ │ │ └────────────────────► 5. Maximum password age
│ │ │ └────────────────────────► 4. Minimum password age
│ │ └────────────────────────────► 3. Last password change
│ └──────────────────────────────────► 2. Encrypted Password
└─────────────────────────────────────────► 1. Username

$1$ – MD5
$2a$ – Blowfish
$2y$ – Eksblowfish
$5$ – SHA-256
$6$ – SHA-512
$y$ - yescrypt, see https://en.wikipedia.org/wiki/Yescrypt https://en.wikipedia.org/wiki/Scrypt</code></pre>
<p>可参考<a
href="https://en.wikipedia.org/wiki/Crypt_(C)#Key_derivation_functions_supported_by_crypt">文档</a>了解更多细节。</p>

Fields description:

1. Username, same as in /etc/passwd.
2. MCF(Modular Crypt Format), see [Wiki](https://en.wikipedia.org/wiki/Crypt_(C)#Key_derivation_functions_supported_by_crypt).
3. When changed the password? (the number of days since 1970-01-01)
4. Password can&#39;t be modified within the min age days. (Relative to field 3)
5. Password must be modified after the max age days. (Relative to field 3)
6. Days prior to password expiration for notification.
7. The number of grace days after the password expires, and you can still log in during the grace period.
8. When will the account expire, and even if the password has not expired, you will be unable to log in after expiration.
9. Unused reserved extension field</code></pre>
<p>每行记录一个用户的登录配置信息。这些信息总共包含9个字段,每个字段由冒号<code>:</code>进行分割。其中最重要的是前面两个字段,即用户名以及密码。下面的例子是配置root用户的密码,其它字段留空。</p>
<pre><code>root:$y$j9T$JIC4Lr.iMSUQwWfRqQT8I/$BUBtIM0x9xGEk7r65AoWUKr19vMqRd77Cvg3AhYo28B:20013::::::</code></pre>
<p>第二个字段是<a
href="https://passlib.readthedocs.io/en/stable/modular_crypt_format.html">MCF格式</a>的哈希密。它用美元符号<code>$</code>分割出多个字段,其中第一个字段(id)表示hash算法,后面的字段表示具体的配置和密码hash值,不同的hash算法会定义自己的字段格式。通常其格式如下所示:</p>
<pre><code>$&lt;id&gt;[$&lt;param&gt;=&lt;value&gt;(,&lt;param&gt;=&lt;value&gt;)*][$&lt;salt&gt;[$&lt;hash&gt;]]

id: an identifier representing the hashing algorithm (such as 1 for MD5, 5 for SHA-256 etc.)
param name and its value: hash complexity parameters, like rounds/iterations count
salt: salt following the radix-64 alphabet (DES uses the decoded value)
hash: radix-64 encoded result of hashing the password and salt</code></pre>
<p>常见的hash id :</p>
<pre><code>$1$ : MD5
$2a$ : Blowfish
$2y$ : Eksblowfish
$5$ : SHA-256
$6$ : SHA-512
$y$ : yescrypt, see https://en.wikipedia.org/wiki/Yescrypt https://en.wikipedia.org/wiki/Scrypt</code></pre>
<p>如要使密码失效,通常习惯在第MCF前面增加叹号 <code>!</code>
,以及经常使用 <code>!</code> 表示未设置密码,如
<code>nobody:!:1::::::</code></p>
<p>如果我们要手动生成一个密码,比较简单的方式是用openssl工具,例如下面生成一个hash算法为SHA-512,密码为
<code>123456</code> 的MCF。</p>
<pre><code>❯ openssl passwd -6 --salt tlas 123456
$6$tlas$bwAx2Uxe2FPdQnrOaXZv.jsxia5mD14Db3Ymdbk2MAZomqIaT1YJgeWeQZQGnDxSf/YjjRGJ8SfwzvdakPMpr1</code></pre>
<p>补齐用户名(root)和其它字段,写入/etc/shadow文件,root用户便可使用密码<code>123456</code>登录认证。</p>
<pre><code>root:$6$tlas$bwAx2Uxe2FPdQnrOaXZv.jsxia5mD14Db3Ymdbk2MAZomqIaT1YJgeWeQZQGnDxSf/YjjRGJ8SfwzvdakPMpr1:1::::::
</code></pre>
<!-- 在NixOS中如何配置? -->
<h2 id="执行安装">执行安装</h2>
<!-- 安装方法有多种,比较传统的方式是用*光驱*或者*usb设备*或者*iPEX*启动一个临时系统执行安装过程。
Expand Down Expand Up @@ -396,10 +430,10 @@ <h3 id="lustrate">lustrate</h3>
<ol type="1">
<li><p>构建系统</p>
<p>假设我们把flake nixos配置存放在github上,通过如下命令先构建系统:</p>
<div class="sourceCode" id="cb7"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> nix profile install <span class="dt">\</span></span>
<span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a>--profile /nix/var/nix/profiles/system <span class="dt">\</span></span>
<span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a>github:penglei/nixos-example#nixosConfigurations.mynixos.config.system.build.toplevel</span></code></pre></div>
<div class="sourceCode" id="cb12"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb12-1"><a href="#cb12-1" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> nix profile install <span class="dt">\</span></span>
<span id="cb12-2"><a href="#cb12-2" aria-hidden="true" tabindex="-1"></a>--profile /nix/var/nix/profiles/system <span class="dt">\</span></span>
<span id="cb12-3"><a href="#cb12-3" aria-hidden="true" tabindex="-1"></a>github:penglei/nixos-example#nixosConfigurations.mynixos.config.system.build.toplevel</span></code></pre></div>
<p>Tips</p>
<ul>
<li><p>多次执行命令会提醒profile中已经存在该package。使用执行如下命令进行删除:</p>
Expand Down Expand Up @@ -430,9 +464,14 @@ <h3 id="lustrate">lustrate</h3>
</ol>
<!-- 复杂的部份是理解 boot loader和磁盘分区。 -->
<h3 id="kexec">kexec</h3>
<p>如果我们要格式化磁盘,则需要进入一个临时系统,才能卸载掉磁盘对齐进行操作。传统发行版通常在iso镜像中携带一个isolinux系统和installer程序(NixOS也有这种方式),这样来实现重新配置硬件,如磁盘分区。</p>
<p>如果我们已经有正在运行的Linux,一个比启动iso更简单的方式是用kexec拉起一个临时系统。nixos-kexec
是一个拉起NixOS系统的工具。</p>
<p>如果我们要格式化磁盘,则需要进入一个临时系统,才能卸载掉磁盘,然后对其进行格式化操作。传统发行版通常在iso镜像中提供一个isolinux系统和installer程序(NixOS也有这种方式),安装系统时先通过光驱或者网络或者USB设备启动这个临时系统,执行安装程序,实现配置硬件如磁盘分区等动作。</p>
<p>这中方式总是比较麻烦,它通常需要我们直接接触硬件(否则我们不方面进入installer)。进入这些installer具有非常明显的Imperative风格,配置BIOS或网络等等,显得和NixOS格格不如。</p>
<p>从运行时看来,操作系统(内婚)不过内存中是一段程序,如果我们已经有Linux系统了,那其实可以把自己替换掉:在内存中开一个临时文件系统,将操作系统保存到这个临时文件系统中,然后加载运行一个新的内核,重新从头执行运行1号进程的程序,跳过硬件完全运行一个临时的新的系统。这就是kexec的作用。</p>
<p>nixos-kexec
封装了运行临时系统的initrd,可以非常方便地拉起一个纯内存的临时NixOS系统。拉起的临时系统前,我们还可以为其申明网络配置、账户、密码、SSH公钥等,这让我们可以非常方便地通过当前网络进入这个临时系统,进而执行前面的安装流程!</p>
<p>另外,NixOS社区提供了一个申明式工具(<a
href="https://github.com/nix-community/disko">disko</a>)来实现划分磁盘,这里我提供了一个的<a
href="https://github.com/penglei/nixos-example/blob/main/disko-config.nix">示例</a></p>
<h2 id="一些安装探索">一些安装探索</h2>
<h3 id="nixos-iso-image-系统启动流程">NixOS iso-image 系统启动流程</h3>
<p>现代Linux系统的启动比较灵活,它可以粗略地分为两个阶段:</p>
Expand Down Expand Up @@ -590,16 +629,16 @@ <h3 id="nixos-iso-image-系统启动流程">NixOS iso-image 系统启动流程</
<p>nixos-rebuild switch –install-bootloader –flake .</p>
</blockquote>
<h4 id="编辑initrd">编辑initrd</h4>
<div class="sourceCode" id="cb14"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mount /nixos.iso /mnt</span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mkdir ~/edit-initrd <span class="kw">&amp;&amp;</span> <span class="bu">cd</span> ~/edit-initrd</span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> cp /mnt/boot/initrd initrd.zst</span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> umount /mnt</span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> unzstd initrd.zst</span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mkdir initrd-root <span class="kw">&amp;&amp;</span> <span class="bu">cd</span> initrd-root</span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> cpio <span class="at">-imdv</span> <span class="op">&lt;</span> ../initrd</span>
<span id="cb14-8"><a href="#cb14-8" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> find <span class="kw">|</span> <span class="fu">cpio</span> <span class="at">-o</span> <span class="at">-H</span> newc <span class="op">&gt;</span> ../initrd-new</span>
<span id="cb14-9"><a href="#cb14-9" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> zstd ../initrd-new</span></code></pre></div>
<div class="sourceCode" id="cb19"><pre
class="sourceCode sh"><code class="sourceCode bash"><span id="cb19-1"><a href="#cb19-1" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mount /nixos.iso /mnt</span>
<span id="cb19-2"><a href="#cb19-2" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mkdir ~/edit-initrd <span class="kw">&amp;&amp;</span> <span class="bu">cd</span> ~/edit-initrd</span>
<span id="cb19-3"><a href="#cb19-3" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> cp /mnt/boot/initrd initrd.zst</span>
<span id="cb19-4"><a href="#cb19-4" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> umount /mnt</span>
<span id="cb19-5"><a href="#cb19-5" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> unzstd initrd.zst</span>
<span id="cb19-6"><a href="#cb19-6" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> mkdir initrd-root <span class="kw">&amp;&amp;</span> <span class="bu">cd</span> initrd-root</span>
<span id="cb19-7"><a href="#cb19-7" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> cpio <span class="at">-imdv</span> <span class="op">&lt;</span> ../initrd</span>
<span id="cb19-8"><a href="#cb19-8" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> find <span class="kw">|</span> <span class="fu">cpio</span> <span class="at">-o</span> <span class="at">-H</span> newc <span class="op">&gt;</span> ../initrd-new</span>
<span id="cb19-9"><a href="#cb19-9" aria-hidden="true" tabindex="-1"></a><span class="ex"></span> zstd ../initrd-new</span></code></pre></div>
<h2 id="错误记录">错误记录</h2>
<ul>
<li><p>安装nix时提示build-users-group不存在</p>
Expand Down

0 comments on commit 47d0212

Please sign in to comment.