This commit is contained in:
2024-10-22 18:13:55 +08:00
commit b9352b8595
49 changed files with 1707 additions and 0 deletions

10
content/blog/_index.md Normal file
View File

@@ -0,0 +1,10 @@
---
title: "Blog"
---
<div style="text-align: center; margin-top: 1em;">
{{< hextra/hero-badge link="index.xml" >}}
<span>RSS Feed</span>
{{< icon name="rss" attributes="height=14" >}}
{{< /hextra/hero-badge >}}
</div>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,71 @@
---
title: 桌搭更新
date: 2024-10-02T15:26:17+08:00
draft: false
summary: 俗话说差生文具多,所以我得补充一些文具。
---
花了将近 500 块钱买了一堆在宿舍桌子上用的东西。来分享一下。
## 键盘
型号是 OMO100购自淘宝“DM键帽社”代组好之后发货的茶轴键帽是同一家的无尽夏壳子是紫色的总共 338 块钱。
第一次用机械键盘,也是买的这些东西里面最满意的一个。
详细看[这里](https://xn--s8w913fdga.chn.moe/notes/9yu82qf4rw)。
有个问题我忘了说:它的蓝牙连接不上我的笔记本。
我的笔记本蓝牙连接任何别的设备都没问题,它的蓝牙连接我的任何别的设备也没问题,就是它俩连不上。
我也不知道是谁的问题,就用 2.4G 接收器了。
## 平板支架
用来把 surface 支起来。
因为想用 surface 的时候,总是会觉得没有地方放(因为桌子上已经放了一个笔记本电脑),
所以想买个支架,平时把它丢到支架上插着充电(也就不怕没电了),想在床上用的时候拔下来就能用。
购买于淘宝,价格 31.81。仔细找了一家又便宜又支持比较大平板的。
买到后感觉它其实设计是用于床头的(虽然店铺里描述的是夹在桌子上),
也就是夹在床头上把平板吊下来看的话,它的支架的运动方向是刚好合适的。
夹在桌子上的话,可以调的角度有点太小。
图就不放了,拍出来感觉并不能看清它的结构。
## 笔记本竖放支架
就是两个这个东西卡在C面和D面之间就可以把笔记本竖起来。
买我 37.9 块钱。我也不知道为啥这么贵,但是在网上找了一下没找到更合适的。
卖家描述说是 3D 打印出来的,我也不知道真假。
不过质感还不错。
<img src="IMG20241002154007.jpg" style="zoom: 25%;" />
唯一的问题是我用了一天之后发现不合适:我的笔记本只能打开到差不多 175 度,
但要看得舒服的话,这样竖放时需要打开到 190 度或者 200 度。
所以又买了一个支架,这个就闲置了。
## 第二个笔记本支架
花了 76.5 元,可以这样把笔记本架起来。可以方便地把屏幕拉过来或者推开。
<img src="IMG20241002154445.jpg" style="zoom:25%;" />
这个支架虽然说能用,但是有很多可以吐槽的地方:
* 说明书发错了。没错说明书发错了,说明书是一个显示器支架的说明书。
然后我就发现,这个支架其实就是个显示器支架改装来的,就是加了一个用来支撑电脑的铁板,把铁板当作显示器固定在支架上就行。
* 多发了非常多的零件。多发了很多用不上的**整包**的螺丝和垫片,我甚至都不用撕开螺丝的包装袋就装好了。
我怀疑我买的是某个型号的阉割版,去掉了一些功能,但多余的零件没去掉(这些螺丝的包装是连在一起的,可能不方便去掉)。
* 但是上一条不能解释为什么卖家还给我发了一个玩具扳手。
支架全身没有任何一个螺母能匹配得上这个扳手的尺寸。
而且这个玩具扳手没有任何包装,就是直接丢在快递盒子里发过来的。
我都怀疑是卖家家里的小孩子不小心把玩具扳手丢了进来。
<img src="IMG20241002125815.jpg" style="zoom:25%;" />
* 电脑放上去是斜的,需要手动调平。因为柱子在左边,电脑(重量)在右边,整体会压得支架向右倾斜。
其实显示器支架也会有类似的问题,但显示器本身是近似垂直于桌面的,显示器可以在显示器所在平面内旋转,就把这个问题补偿掉了;
而承载笔记本电脑的铁板是近似水平的,它也只能在铁板所在平面内旋转,这样旋转并不能补偿这个倾斜。
我只能用卖家送的垫片把铁板下面一半的螺丝垫高,手动调平。
* 做工比较差。铁板上镂空的地方没有磨边,有不知道是切割还是铣出来的边上的毛刺。
总之是觉得这个支架不太行,但也没有不好到需要退货的地步。
很多年前我买的显示器支架,只比这个贵十块钱,质量好很多。

View File

@@ -0,0 +1,50 @@
---
title: Helloworld
date: 2024-08-24T20:13:59+08:00
draft: false
summary: 为什么不问问神奇海螺呢?
---
helloworld
# 一级标题
## 二级标题
### 三级标题
hello world!
* 无序列表1
* 无序列表2
* 无序列表3
1. 有序列表1
2. 有序列表2
3. 有序列表3
> 这是一个引用
> 写了两行
如果段与段之间
没有空行
会怎样?
```c++
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
```
这是一个行内代码`printf("Hello, World!\n");`,和行内公式 $E=mc^2$。
$$
\int_{-\infty}^{+\infty} e^{-x^2} \dd x = \sqrt{\pi}
$$
**这是粗体文本***这是斜体文本*。
[这是一个链接](https://www.example.com)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,92 @@
---
title: 使用 OriginPro 减去基线
date: 2024-09-17T14:58:25+08:00
draft: false
---
让拉曼的小峰看得见。
<!--more-->
# 为什么要减去基线?
拉曼实验测出来的峰高度差别太大。将瑞丽散射的峰去掉,其余的峰(拉曼散射造成的峰)高度也往往差了几个数量级。
这导致很难选择合适的比例尺来展示全图:即使主峰已经飞到了画面外面,小峰也还是很难识别出来。
一个思路是将结果取对数画图,但对于拉曼散射的结果,直接将数值取对数效果并不明显,因为有一个基底的光强,所有的峰都是叠加在这个基底之上的。
这个基底的光强也许来自热噪音,也许来自环境光,也许是光谱仪 CCD 本身的残留电荷什么的,我们暂时不讨论这个基底是哪里来的。但总之,这个基底是存在的。
比方说基底光强是 $100$,有个小峰光强是 $120$,主峰光强是 $1\times10^6$。
不取对数的话,小峰肯定是看不到的。
但即便取了对数之后,$\cfrac{\lg 120}{\lg{1\times10^6}} \approx 0.3465$$\cfrac{\lg 100}{\lg{1\times10^6}} \approx 0.3333$
可以看到小峰和基底的对比度仍然很小,依然很难看到。
而如果把基底值尽可能减去,比如说减去 $90$
那么 $\cfrac{\lg 30}{\lg{1\times10^6 - 90}} \approx 0.2462$$\cfrac{\lg 10}{\lg{1\times10^6 - 90}} \approx 0.1667$
这时小峰和基底就有了明显的对比。
有时减去基线还有一个动机:有的样品中缺陷太多,直接得到的拉曼的结果中基线特别高(相对于主峰),往往还会有一个大大的凸起,整个图就不是水平的。
这时候把基线减掉就能“掩盖”这个问题,让图更美观。
我们的样品没有这个问题,减不减基线肉眼看到的结果完全没有区别,减去基线只是为了让取对数后小峰更明显。
# 怎么减去基线?
不能简单地减去一个常数,一个线性函数也不行,因为基线不是平的。要人眼盯帧去一截截确定一个直线或者几次函数作为基线并手动写程序处理也是可行的。实际上去基线是一个非常普遍的操作,一些商业软件已经做了这个功能(比如 OriginPro动动手指点点鼠标就行草履虫都能学会。
我看的教程是[这个](https://www.bilibili.com/video/BV1NZ4y1B7Zz)。
写这个文章的目的就是自己整理记录一下基本的过程和自己的经验,免得下次再去找教程。
## 简单去基线的步骤
* 先把数据丢掉 OriginPro 里,然后选中数据。似乎是每次只能处理一列 Y 数据,选中多列也只给你处理第一列。
* 然后点分析,点 “Peaks and Baseline”然后 “Peak Analyzer”打开对话框就会见到一个像是流程图一样的东西。
![OrignPro 打开减去基线的对话框](1.png)
* 选择“Subtract Baseline”然后下一步。之后的基线模式选择“User Defined”之后一般使用默认的二阶导数再之后可以调整点的个数。按我的经验默认的八个点足够用。
* 再之后一路下一步最后就会得到数据。在得到的数据中X 也会被重复几遍,没什么用但是也无伤大雅。
然后就有一个啸问题,就是减去基线后的结果中会有负值,导致取对数后会出现许多“谷”(即非常接近于零的值取对数后会变成非常大的负值),甚至不取对数都会有一些小谷。
原因是 OriginPro 选取拟合基线的点时选取得与谱线过于接近,甚至一些选到了峰上,导致减出来了负值。
## 仔细调整基线
我的解决办法是,在指定点的个数之后的那一步中,点 “Modify/Del”手动调整一下各个点的位置。
对于选取到峰上的点,把它挪到别的地方或者直接删掉。对于选取得基本正确的点,也把它往下挪动一点,使得基线与谱线之间至少有一个像素的距离。
挪动的过程中用鼠标拖拉很难操作,可以用鼠标点击一下想挪动的点,再按键盘的方向键来微调。
对于一些不关注的区域(例如,我的实验测得的拉曼谱中,靠近瑞丽散射的那一端有一个凸起,我们认为这个凸起是滤光片导致的误差),
放任它保持负值就可以了。
这样的手动操作其实是不利于科学结果的复现的,但好像也暂时没有更好的办法。
我个人觉得,既然人眼能看出来基线的位置,就应该存在一个算法能更合适地把这些点找出来
(只不过这个算法可能会需要更多的参数,例如高度与半高宽的比例必须达到某个人为设定的阈值就认为是峰)。
但我暂时不知道这样的现成程序。
最后的结果也可以手动再调整一下,用类似于 `Col(E)-Min(Col(E))+10` 来赋值一个新列,将整体向上或者向下平移一点。
反应到对数的图上,就是抉择是把微小的变化放大(下移但不要产生负值),还是把乱七八糟的线条压扁使得看起来没那么乱(上移)。
总结就是大概分下面几步:
* 软件自动寻找几个用于拟合基线的点。
* 手动调整这几个点,把不合适的去掉或者换个位置。
* 软件自动拟合基线,并减去。
* 手动调整结果(可选)。
# 看个结果?
下面第一张图是拉曼光谱直接得到的实验结果,第二张是处理之后。
可以看到,在大概 $350 \mathrm{mm^{-1}}$ 附近,原本隐匿起来的一个小峰现在就特别明显。
![处理之前](2.png)
![处理之后](3.png)
实际上这个峰还是挺大的,即使不减去基线,直接取对数也能看到;更精细的峰才需要减去基线处理。
但这个图当时测得也比较粗糙,不适合去分析更精细的峰。当然这个就和这个主题无关了。
这个峰实际上对应于 4H-SiC 在 $\Gamma$ 点附近的一个振动模式。
单纯从理论上来说(用群表示论分析这个振动对应的表示),这个振动不会导致 z 方向入射的光再拉曼散射到 z 方向。
实际上它也确实比那些对称性允许的散射弱得多,但实验上测到还是有一点的。更具体的物理上的分析暂时不表。
# 局限性
这个方法画出来的图只是为了方便找小峰,方便自己和导师看。
找到的小峰必须回到原图再去仔细确认,发论文的时候也别整这种图,因为减去基线再取对数的过程中显然很可能会人为造一些峰和谷出来。
记不清是谁来着,拿个取了绝对值再取对数的图在组会上说,两条线上的两个峰之间有一定位移,这个位移有如何如何的物理意义。
但其实在取绝对值再取对数之前,数值上整体变动一点点就会导致那个峰发生巨大的位移,对一个接近零的数值取对数就是会这样,很容易放大误差。

View File

@@ -0,0 +1,107 @@
---
title: 声子的拉曼活性与群表示
date: 2024-10-03T18:15:44+08:00
draft: false
summary: 一些群表示论的魔法罢了。
---
每一个声子模式都属于某个群的某个表示。
只要知道表示,不需要知道这个声子具体是怎么振的,就可以知道这个声子是否是拉曼活性的
(当然,是否强到实验中可以看到,那是另外一回事)。
这是怎么做到的呢?
一些特征标表在列出各个表示对应的特征标后,还会列出各个表示对应的一些式子,例如 $x$ 或者 $xy$ 或者 $x^2-y^2$。
网上的教程会告诉你:如果声子对应的表示对应的式子有二次项,那就是拉曼活性的;没有就不是。
——这又是什么魔法?
我翻烂了互联网也没找到这整个一串问题的完整解释。
或许它藏在某个上世纪的教科书里(我看了其中一本,他也没写),因为初次思考起来太抽象,一旦想明白又太简单,并且即使想不明白直接用也太简单了,
导致懂的人懒得解释,不懂的人就不懂了,于是出现了断代。
我自己闷头想了一天算是想明白了,于是写到这里分享出来。
其实想出来之后就很简单了,不知道为啥辣么大个互联网居然只有人提问没有人回答。
## 前置结论
首先说几个具体讨论问题前需要用到的前置结论。这些结论都是网上可以找到证明或者讨论的。
第一个结论是:**具有拉曼活性的声子就是使得电极化性polarizability变化的声子。**
也就是说,一个声子有拉曼活性,等价于:
$$
\pdv{\alpha}{R} \neq 0
$$
其中 $\alpha$ 是极化性张量,$R$ 是振动模式对应的方向向量。$R$ 的长度是 $3n$$n$ 是原胞中的原子数。
这是微扰理论的一个结论,
具体的讨论可以看[这里](https://chem.libretexts.org/Bookshelves/Physical_and_Theoretical_Chemistry_Textbook_Maps/Physical_Chemistry_(LibreTexts)/13%3A_Molecular_Spectroscopy/13.11%3A_Time-Dependent_Perturbation_Theory)。
这里的证明中取的基是原本哈密顿量的本征态,但实际上这个限制是不必要的,你只要把结论中的结果再线性组合一下就能看出来一般的情况了。
注意有时讨论拉曼时有的人用的是电极化率electric susceptibility$\chi$)而不是极化性。
这两个物理量物理意义是一致的,但转换并不只是差一个常数,差的还挺多,具体你可以自己去看看。
一定程度上来讲,电极化性往往用来描述“微观”系统,例如一个分子对外加电场的响应;而电极化率往往用来描述“宏观”系统,例如一个晶体对外加电场的响应。
大多数讨论时使用的是电极化性,只有个别讨论使用电极化率。
可能是因为,做化学的人往往更追求通俗易懂,所以会在网上大致讨论拉曼原理,这时使用电极化性;
而做物理的人往往更追求严谨,但定量讨论拉曼散射要用到量子电磁等高深的理论,于是这些讨论就都藏到上个世纪的教科书里了。
不过这个问题和这里要讨论的问题一分钱关系都没有,你只需要知道声子模式对应于某个对称的二阶张量[^1],并且这个对应关系是线性的就行了。
第二个结论是群表示论中的结论:**物理中许多对称矩阵与它对应的二次型的对称性一致。**
这里“二次型的对称性”是指,这个多项式作为一个函数时(自变量为三维向量),将群元素作用上去,它变化与否与对应的矩阵是一致的。
特征标表中的式子,其实就是将群元素作用到三个空间中(包括一维齐次多项式,旋转,二维齐次多项式),支撑对应表示的子空间的基矢。
或者说,特征标表中的二次齐次多项式,你也可以把它写成一个个对称矩阵,只是矩阵写起来没有多项式方便(一行就能写完),所以才写成多项式。
这里的“许多对称矩阵”是指,当将群元素 $p$ 作用到系统上后,矩阵 $A$ 变为 $p^{-1}Ap$ 或者 $pAp^{-1}$ 这种 $3\times3$ 的矩阵。
极化性就是这样的矩阵。
但并不是所有的矩阵都是这样的,例如如果将格矢(列向量)拼成一个矩阵来描述原胞的形状和大小,这个矩阵 $A$ 在作用 $p$ 后就变成 $pA$
所以就没有这个特点。
这个结论也蛮明显的,只要在矩阵左右都乘上同一个向量就得到对应的二次型了。
第三个结论还是群表示论中的结论:**如果一个群与一个线性映射对易,那么这个线性映射的值域要么是零,要么值域承载的表示是定义域上的表示的子表示。**
这个结论可以这样理解:定义域可以分解成两个空间的直和,一个是核空间,一个是核的正交补空间。
可以证明这两个空间都对群运算封闭(取一个群元素试一下就可以看到这个结论),
并且把核空间去除掉后,剩下的映射就是双射,群在正交补空间上的表示和在值域上的表示一样。
也就是说,群在定义域中的表示,去掉属于核空间的部分,就是在值域上的表示。
万一整个都是核空间,那就去完了,也就是“值域是零”这个特殊情况。
有这三个前置结论就够了。
## 开始变魔法
关注于某个振动模式所属的表示对应的子空间,假定这个空间的维度是 $m$,也就是这个声子模式是 $m$ 重简并的(如果没有偶然简并的话)。
这个子空间对群运算封闭。
这个子空间中每一个向量都会引起极化性的一个变化(可能是零,也可能不是),极化性的变化也组成了一个线性空间,它的维度是一定不超过 $m$。
从振动模式所属的表示空间到极化性所在的线性空间的映射具有下面的性质:
* 这个变换是线性变换。
因为我们只考虑了极化性对原子位置的一次偏导,即可以近似将极化性看作一个超平面(而不是曲面),
几个方向向量先线性组合再求偏导,等于求偏导后再线性组合。
* 群元素的作用与这个变换互易。
因为等价的方向上,极化性的偏导数应该是一样的。
所以它可以套用上面的第三个结论。
考虑群在值域中的表示长什么样子。可以分成三种情况:
* 值域是零,也就是说这一组声子模式不会导致极化性的变化。
* 值域不是零但维度小于 $m$,也就是说值域中的表示是定义域中的表示中,扣掉某些表示(属于核空间)后的表示。
然而定义域的表示已经是不可约的,所以这种情况不会发生。
* 值域的维度等于 $m$,也就是说值域和定义域的表示相同,是同一个不可约表示,这时就可以在特征标表中标出对应的二次型(即对应的对称矩阵)。
如果反过来,从特征标表推导拉曼活性的话,就是:
* 特征标表中这个表示没有齐次二次多项式,说明在对称矩阵组成的全空间中,根本不存在可以承载这个表示的子空间,也就是这第三种情况不会发生,
只能是第一种情况(没有拉曼活性)。
* 特征标表中这个表示有齐次二次多项式,说明在对称矩阵组成的全空间中,存在可以承载这个表示的子空间,也就是这第三种情况可能发生,
也就是这个声子模式可能有拉曼活性。
这个“可能”的意思是说,如果确定点群时已经充分考虑了晶体的对称性,那么大概率这个声子是会导致极化性的变化的,
就像扔一个针在地上,没有特殊原因的话,针大概率(但不是一定)会躺倒在地上而不是竖起来;
但如果确定点群时漏了一些对称性,使用这个方法时就会判断错误
(例如,对于 4H-SiC如果忘记它有个螺旋轴而只用了 $C_{3v}$,那么就会把 $B_1$ 归结到 $A_1$ 中而误判断)。
好了这就是证明了。是不是非常容易。这个玩意儿让我想了一天。
如果要考量红外活性,也是类似的思路,只不过红外活性对应的是电偶极矩(或者电极化强度,总之是一个向量而不是张量)。
从振动模式到电偶极矩的映射也是线性且与群元素互易的,所以包含一次齐次多项式的表示都是红外活性的。
[^1]: 准确说,是一个厄米的二阶三维张量。
声子引起的 $\delta \chi$ 或者 $\delta \alpha$ 并不是厄米的,
但拉曼散射强度实际上是正比于 $\langle i | \delta\chi^\dagger\delta\chi | i\rangle$
而 $\delta\chi^\dagger\delta\chi$ 是厄米的;或者说,如果是实数的话,就是对称的。

View File

@@ -0,0 +1,114 @@
---
title: 使用 NFS 共享家目录
date: 2024-09-17T22:08:11+08:00
draft: false
summary: 我家还蛮大的,算完了直接丢那儿,没问题的。
---
# 起因
在集群上做科学计算时,需要在各个节点之间同步一些文件,例如计算用到的输入文件和计算结果。
虽然 [Slurm](https://slurm.schedmd.com/quickstart.html) 也有诸如 `sbcast` 可以在节点之间复制文件,
但这个方案我并没有见过谁使用。
你只要想一下这个问题:复制过去的文件是否要在作业后删除?如果要,在什么时机删除?如何让它避免删除别的作业或者诸如 `.zshrc` 之类的文件?
你就会发现这种在节点之间复制文件的方案的使用前提是,
要么使用者自己能理解集群是如何工作的,并且有良好的使用习惯,并且熟悉 linux 的操作,自己去主动维护集群的健康;
要么管理者需要是全职的,能够随时处理这些问题,或者对鸡脚旮旯的细节行为有足够的了解,去设计一个自动化的解决方案。
总之,很难行得通。
所以最好的办法就是把用户的家目录共享给各个节点。
Windows 电脑大家都用过,共享之后的家目录对于用户来说就和单台的 Windows 电脑没有太大的区别,完全没有操作门槛。
之所以使用 NFS 而不是更专业的文件系统来共享,是因为我要处理的集群只有四个节点,而且只有千兆网互联
(有万兆网卡,但不知为什么没有配置光纤一直闲置着)。
NFS 应该足够用了。
# 遇到了什么坑?
关于 NixOS 特有的问题(例如 home-manager 和 impermanence这里不讨论实际上这些问题都可以预先想到并且想好解决方案。
这里只讨论一些与发行版无关并且不太容易预料到的问题。
## 挂载 NFS 的目录
和 sshfs 不同NFS 必须先指定一个根目录(不同于系统的根目录,而是暴露给其它节点的根目录,使用 `fsid=0` 指定)
,然后指定要导出的目录(即 `/home`)。
在客户端,指定的目录是相对于这个根目录的,而不是系统的根目录。
举例来说,如果我在服务端指定导出:
```
/home 192.168.178.0/24(fsid=0)
/home/chn 192.168.178.0/24()
```
在客户端要挂载 `/home/chn`,需要写成:
```
192.168.178.1:/chn
```
最终我导出的是:
```
/ 192.168.178.0/24(rw,no_root_squash,fsid=0,sync,crossmnt)
/home 192.168.178.0/24(rw,no_root_squash,sync,crossmnt)
```
其中 `rw` 选项是因为默认 `ro`,我当然要 `rw``sync` 是因为 NFS 默认不会及时地向下层文件系统传递 sync 命令,我觉得还是传过去比较好。
关于其它选项,以及它的安全性,稍后会介绍。
### `no_root_squash` 选项
NFS 默认会把 `root` 用户的权限映射为 `nobody`
这会导致一个初看起来很无厘头的问题:我在客户端用 `root` 居然 `cd` 不到 `/home/chn`,说我权限不够;用 `chn` 却没什么问题。
需要加上 `no_root_squash` 才会恢复更直觉的行为。
按照文档的说法,这个是为了避免轻易地被设置带 suid 的文件。
比如我有某个节点上的 root 权限和另外一个节点上的普通用户权限,我就可以在前者上设置一个带 suid 的文件丢到共享目录里,
然后在后者上执行这个文件,就可以获得 root 权限。
但是我觉得这个问题不是问题,一方面即使限制了 root 其它用户也可以设置所有者为其它用户的 suid 文件。
况且如果黑客都能在某个节点上拿到 root 权限了,那说明这个集群已经被打成筛子了,还有什么保护的必要吗。
### `crossmnt` 选项
在 NixOS 上使用 impermanence 后会导致大量的很多层的挂载。
例如 `/` 是 bind mount 自 `/nix/rootfs/current`
`/home/chn/Desktop` 是 bind mount 自 `/nix/persistent/home/chn/Desktop`
其它发行版可能因为挂载行为没有这样复杂所以不太会遇到这个问题。
默认情况下NFS 的表现行为类似于 `bind` 而不是 `rbind`,也即如果我在 NFS 客户端所在节点上的 `/home/chn/Desktop` 创建一个文件,
这个文件会出现在 NFS 服务端的 `/nix/rootfs/current/home/chn/Desktop`
而不是 `/nix/persistent/home/chn/Desktop``/home/chn/Desktop`
这个选项会让 NFS 表现得像 `rbind`,也即 bind mount 的目录也会被导出。
### 安全性
集群的网络我是这样配置的:其中一个节点插一根网线到路由器(可以上网),一根网线到一个交换机;其它节点都只插一个网线到这个交换机。
这样把内部的网络和外部的网络隔离开来,在内部网络上就可以“为所欲为”了(比如跑 NFS
按照上面的 NFS 的配置,任何能走进这个实验室并在交换机上插一个网线的人都可以随意读写任何一个文件,或者获得任何一个节点的 root 权限。
这个问题看起来很严重,但我觉得单纯地这个问题就也还好:他都可以走进这个实验室了,为什么不能物理地把硬盘拔下来读写呢?
如果一定要给 NFS 加认证的话,我觉得套个 wireguard 是可以的,但是不知道会不会有性能问题。
况且物理接触到交换机还是比较难的,感觉没必要折腾。
我有点担心的是另外一些可能和这里产生联动的网络设置。
比如,为了做 nginx 在三层协议的透明代理,我其实允许了一个不太安全的路由 `net.ipv4.conf.all.route_localnet`
这些设置会不会导致他在门口蹭到 WiFi 就可以访问 NFS我暂时觉得不能但是也不太确定。
这里需要的专业知识太多,说不准哪里会出问题。
诸如 `net.ipv4.conf.all.route_localnet` 这种不太常见但我需要的网络设置,我初期写 NixOS 的配置的时候并没有把它拆分到特定的服务里
(即,不论是否开 nginx 都会设置这个)。
诸如此类的设置叠加起来会不会真的导致安全问题,以我的三脚猫功夫不太能打包票。
## 在 initrd 中联网
我需要在 initrd 中配置好网卡(固定 IP以在 switch root 之前挂载好 home避免之后出现什么 race condition。
如果你搜索互联网,会发现有许多文章提到有个 `ip=xxxx` 的内核参数。
它确实会对网络配置产生影响,但影响是会导致配置的 systemd-networkd 全部失效,按照 `ip` 参数的配置来配置网络。
我之前在别的模块里配置了 `ip=on`,导致 systemd-networkd 配置的静态地址不生效。
实际上完全不写这个参数,只要在 initrd 里启用了 systemd-networkd就可以在 initrd 使用网络。
在 initrd 里配置 systemd-networkd 的方法和 switch root 之后基本一样。
## 在 initrd 中挂载 NFS
有两个点与其它文件系统不同:一个是挂载 NFS 还需要用户态的程序支持,一个是 NFS 不同版本的支持是不同的内核模块和用户态程序。
总之就是两个内核模块 `nfs``nfsv4` (后者依赖前者),两个用户态程序 `mount.nfs``mount.nfs4`
我用的应该是 NFSv4但我把这些都塞进 initrd 里了,能用。