-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.xml
1320 lines (1320 loc) · 110 KB
/
index.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Free at last</title><link>https://churchmice.github.io/</link><description>Recent content on Free at last</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>All Rights Reserved</copyright><lastBuildDate>Sun, 19 May 2024 16:12:10 +0800</lastBuildDate><atom:link href="https://churchmice.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>SECDEC</title><link>https://churchmice.github.io/p/secdec/</link><pubDate>Sun, 19 May 2024 16:12:10 +0800</pubDate><guid>https://churchmice.github.io/p/secdec/</guid><description><h1 id="介绍">介绍
</h1><p>SECDED是single error correction, double bit detection的简称,也就是可以纠正1比特的错误,能够检测2比特的错误。</p>
<h1 id="hamming-code">Hamming Code
</h1><p>原理是借助了hamming code,distance是3,也就是说任意两个codeword之间的差距起码是3,hamming distance的计算方法就是对比两个codeword不一样的地方,并进行累加</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">uint32</span> <span class="nf">hamming_distance</span><span class="p">(</span> <span class="n">unint32</span> <span class="n">a</span><span class="p">,</span> <span class="n">unit32</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="n">uint32</span> <span class="n">num</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">uint32</span> <span class="n">diff</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">diff</span> <span class="o">=</span> <span class="n">a</span> <span class="o">^</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="p">(</span><span class="n">diff</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="n">num</span> <span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="n">diff</span> <span class="o">=</span> <span class="n">diff</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">diff</span> <span class="o">-</span><span class="mi">1</span> <span class="p">);</span> <span class="c1">//remove the leading 1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">num</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>一个典型的hamming(7,4)的意思是原始数据长度是4,parity长度是3,编码后的消息长度是7.
hamming编码有一定的规则产生生成矩阵,示意图如下,其中Pn代表parity, Dn代表的是数据
<img src="Pasted%20image%2020240519162034.png" alt="" />
从这张图,我们不难发现如下规律</p>
<ul>
<li>Pn位于位置是2^i的地方,剩余的位置依次填充Dn</li>
<li>对于Pi行,如果index的i bit是1,则填充yes,否则填充No</li>
<li>从左到右, {p3,p2,p1}呈现从1到7依次递增的序列,这为后面的编码提供了基础</li>
<li>p1 = d1 ^ d2 ^ d4, p2 = d1 ^ d3 ^ d4, p3 = d2 ^ d3 ^ d4</li>
<li>解码的时候如果p1,p2,p3只有一个等式不成立,那出错的bit处于Pi上</li>
<li>解码的时候如果p1,p2,p3有超过一个等式不成立,那出错的bit处于Di上</li>
<li>如果 {p3,p2,p1} = x ( x != 0), 则依次很想查找{p3,p2,p1} =x的那一列,对应的列号就是出错的数据。例如,如果{p3,p2,p1}计算结果是6,那出错的数据就是d3,通过将d3进行flipping就可以把数据纠错回来。原因是p3=1,p2=1,所以出错的数据一定在同时可以被p2和p3 cover的行内,也就是d3和d4,如果是d4出错,那p1也会出错,所以只可能是d3.
对于hamming distance =3的纠错码,只能进行1bit的纠错,因为如果发生了2bit的错误,因为distance是3,有可能和另外一个码的distance是1从而导致误纠错。
一般的,对于distance是d的纠错码,可纠错的bit数是(d-1)/2,可以检错的bit数是d-1</li>
</ul>
<p>parity bits (m)和 data bits (k)以及码长(m)的关系如下
<img src="Pasted%20image%2020240519165452.png" alt="" /></p>
<h1 id="secded">SECDED
</h1><p>为了能够实现检测两比特错误的功能,可以通过额外添加一比特全局parity来实现。
还是以前面的例子为例,p4 = ^ { p1,p2,p3,d1,d2,d3,d4}
解码的时候计算p1,p2,p3,p4</p>
<ul>
<li>^p4 == 0 : 但是p1,p2,p3有不为0的情况,这种时候就说明发生了两比特翻转的情况</li>
<li>^p4 == 0 : 并且p1,p2,p3也是0,这说明没有错误发生</li>
<li>^p4 == 1 : 这种时候说明发生了一比特的翻转,并且是可以纠回来的</li>
</ul>
<h1 id="implementation">Implementation
</h1><h2 id="sw">SW
</h2><p>可以参见
<a href="https://github.com/aa876433/SECDED_hamming_code" target="_blank">https://github.com/aa876433/SECDED_hamming_code</a>
</p>
<h2 id="hw">HW
</h2><p>可以参见
<a href="https://github.com/churchmice/secdec" target="_blank">https://github.com/churchmice/secdec</a>
</p></description></item><item><title>爱在记忆消逝之前(一)</title><link>https://churchmice.github.io/p/%E7%88%B1%E5%9C%A8%E8%AE%B0%E5%BF%86%E6%B6%88%E9%80%9D%E4%B9%8B%E5%89%8D%E4%B8%80/</link><pubDate>Sat, 13 Apr 2024 19:38:28 +0800</pubDate><guid>https://churchmice.github.io/p/%E7%88%B1%E5%9C%A8%E8%AE%B0%E5%BF%86%E6%B6%88%E9%80%9D%E4%B9%8B%E5%89%8D%E4%B8%80/</guid><description><p>要说我生命中的姑娘,最早我觉得可以追溯到我没上小学那会,我记得那是我还住在场口老家的时候,有次隔壁的邻居摆摊,我就过去一起凑热闹,摆摊的是个很好看的小姐姐。</p>
<p>上了小学之后,我对于姑娘的喜欢标准其实就一个,那就是学习成绩好,现在想想也真是无语。所以小学时候就对成绩好的欧姑娘特别有好感,当时全班也起哄,我记得我俩一起唱过歌,最后有一个互相献哈达的场景,算是我俩最亲密的接触了。后来慢慢对欧姑娘失去了兴趣,说出来原因似乎也是很搞笑的。那个时候夏天都会午睡,一般是一个孩子睡桌子,一个孩子睡凳子。在某次午睡的时候我睡在凳子上,撇到了同样睡在凳子上的欧姑娘的红色内裤,这让我幼小的心灵受到了强烈的冲击:这么漂亮的姑娘怎么可以穿这么恶俗的红内裤?自那之后对欧姑娘慢慢就没有了感觉,或许也跟欧姑娘后来成绩慢慢变差有关。因为前面说了,我喜欢成绩好的姑娘。</p>
<p>日子辗转到了小学四年级,隔壁村的孩子并到了我们班里面上学,里面就出现了我第二个喜欢的姑娘,就叫赵姑娘吧。
赵姑娘的特点是比较黑,像个假小子一样,经常会追着男生到处乱窜,毫不意外,我肯定是这些乱窜的男生中的一个。对赵姑娘更多的是暗恋,在小学毕业的那天,我和赵姑娘还有其他人一起留下来打扫卫生,我去倒垃圾,在倒垃圾回来的途中,我突然想到要去表白一下赵姑娘,路上有一些列的心理活动,至于最后为啥没表白,我已经不记得了,也算是小学时期的遗憾吧。</p>
<p>我和赵姑娘上了同一个初中,但是赵姑娘和我不同班,我们都是各自班级的学习委员。那个时候和赵姑娘的交集是有时候年级会召集学习委员一起开会,所以还能见到赵姑娘。有一天晚自习的时候赵姑娘在下楼梯的时候突然摔倒了,但是傻逼一样的我居然呆呆的看着,也没有去扶一下,现在的我真想扇自己两巴掌。</p>
<p>那个时候我有个好朋友小王,小王在场口也有亲戚,有一次场口过节的时候小王就说我们各自把秘密写在纸条上面,然后塞在你家的墙缝里面。我记得那个时候我写的就是&rsquo;我喜欢赵xx&rsquo;。可惜,现在场口的老房子早就拆掉了,一切的一切已经不知道究竟是我自己的一场梦还是真的发生过。</p>
<p>我和赵姑娘再也没有关系更进一步,到了初二下半学期我就转学去了市里面,从此逐渐断了联系。在暑假的时候我也去赵家看过一些老朋友,但是心里还是希望可以偶遇赵姑娘,但是听到的却是赵姑娘如何坐在寝室的床上大谈她初恋的故事。那应该是我最后一次听到赵姑娘的消息,至此之后我和她再也没有了任何联系。</p>
<p>至于欧姑娘,在我上大学的时候偶有朋友提起欧姑娘在当地的超市里面当收银员,我也试图去寻找,但是始终没有找到。我和欧姑娘也算是从此天各一方,各自安好。</p>
<p>最后放一张小学同学的照片,小学现在已经彻底被夷为平地了,村子也从之前富阳垫底的贫困村包装成什么网红村,到处洋溢着各种商业气氛,然而我小时候的那些记忆全部都被掩埋了。</p>
<p>拍摄地点是在梅山下面,拍摄时间的话是一年级或者二年级,所以还是本村的学生,我大概还能认出七七八八。<br>
许东杰 王涛 许洁川 李超晨 许剑波 许晓杰 许凯飞 王超 李刚 张英 许玲 许安<br>
朱恩德 许遒 柴玲华(班主任) 许伟 方杰轩 王银飞<br>
王翔 倪小青 许婷兰 汪燕 朱杨荣 徐晓霓 许锋 许黄明 许杰 陈杰<br>
之后又从其他村里面转过来一批同学<br>
赵家村: 赵鸿 赵存铃 赵恩军 赵书波 赵玉琦 赵建锋<br>
欧家溪: 刘正逻 欧珍芳 汪剑<br>
还有一个一年级转走的插班生 胡勇亮 (永康市古丽镇干塘下村)</p>
<p><img src="Pasted%20image%2020240413200758.png" alt="" /></p></description></item><item><title>Gamble</title><link>https://churchmice.github.io/p/gamble/</link><pubDate>Fri, 22 Mar 2024 09:45:55 +0800</pubDate><guid>https://churchmice.github.io/p/gamble/</guid><description><h1 id="一些原则">一些原则
</h1><ul>
<li>一般来说,如果一加公司的PE只有收益增长率的一半,那这只股票赚钱的可能性就相当大。如果PE是收益增长率的两倍,那这只股票亏钱的可能新就相当大。比如一只股票的PE为20,如果收益增长率有40%,那就可以梭哈。</li>
<li>美股一般10-12月会有大量的卖出</li>
</ul></description></item><item><title>Go_stock</title><link>https://churchmice.github.io/p/go_stock/</link><pubDate>Thu, 21 Mar 2024 09:07:42 +0800</pubDate><guid>https://churchmice.github.io/p/go_stock/</guid><description><h1 id="银行卡">银行卡
</h1><p>持有以下三行</p>
<h2 id="汇丰">汇丰
</h2><p>推荐,一地卓越,全球卓越,同名账户不同地的账户互转没有手续费
唯一的缺点是汇丰的<strong>利率</strong>不太好,这也是被很多人诟病的,另外坊间流传国外账户动不动关户的情况。
大陆可以用卓越员工计划先开大陆的卓越理财,主账户留在大陆,然后见证开户香港账户,最后是自助开户美国账户</p>
<h3 id="美国账户">美国账户
</h3><p>分为checking account和saving accout, 每一个account包括9位数的ABA路由码(标识银行机构)和9位数的账号(标识银行中的不同用户)组成
checking acccout可以理解为活期账户,可以消费转账,和debit card绑定
saving accout可以理解为定期账户,只能和checking account之间进行资金的互转</p>
<h2 id="root的解决方法">Root的解决方法
</h2><p>银行app会检测手机是否root,可以通过安装
<a href="https://github.com/HuskyDG/magisk-files/releases" target="_blank">magisk kitsune</a>
来解决,需要注意的是magisk本身也需要隐藏,防止被app检测出来。</p>
<p><img src="image/Pasted%20image%2020240307075444.png" alt="" /></p>
<h2 id="n26wiseifast">N26/WISE/iFast
</h2><p>具体参考
<a href="https://churchmice.github.io/p/virtual-card/" target="_blank">国外虚拟卡指南</a>
</p>
<h2 id="招行香港">招行香港
</h2><p>扔1w港币买恒生指数,就算这样每个月还是需要缴纳10港币的管理费</p>
<h3 id="root之后闪退">root之后闪退
</h3><p>需要去magiskhide里面把对应的app点开,然后把所有的√都打上即可,如下所示
<img src="image/Pasted%20image%2020240307075530.png" alt="" /></p>
<h1 id="券商">券商
</h1><h2 id="大陆">大陆
</h2><p>东方赢家,好处是万一免五,也就是佣金是万分之一,免除最小五块交易费的要求。</p>
<h2 id="香港">香港
</h2><p>不外乎是长桥,富途和老虎,这三个最为人所知,都开户撸了羊毛。
长桥的好处是佣金偏移,里面买基金有一些管理费的让利,但是也越来越少了,比如0.6%的管理费,一开始我看到是可以让利0.45%个,但是最近打开也只让利了0.2%个,不免让人有种做大了要收割的想法。另外长桥的入金和出金也没有富途来的方便。如果长桥连这个管理费的优势都没有了的话就没有必要用了。</p>
<h3 id="入金">入金
</h3><table>
<thead>
<tr>
<th>券商</th>
<th>币种</th>
<th>方式</th>
<th>时效</th>
<th>手续费</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>长桥</td>
<td>港币</td>
<td>eDDA</td>
<td>秒到</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>富途</td>
<td>港币</td>
<td>eDDA</td>
<td>秒到</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>长桥</td>
<td>美金</td>
<td>E-banking</td>
<td>D0</td>
<td>50HKD</td>
<td>汇到的是工银亚洲,民生银证转账5分钟</td>
</tr>
<tr>
<td>富途</td>
<td>美金</td>
<td>E-bankding</td>
<td>D0</td>
<td>0</td>
<td>直接汇到富途汇丰账号</td>
</tr>
</tbody>
</table>
<h3 id="出金">出金
</h3><table>
<thead>
<tr>
<th>券商</th>
<th>币种</th>
<th>方式</th>
<th>时效</th>
<th>手续费</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>长桥</td>
<td>港币</td>
<td>E-banking</td>
<td>D1</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>富途</td>
<td>港币</td>
<td>E-banking</td>
<td>D1</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>长桥</td>
<td>美金</td>
<td>E-banking</td>
<td>D1</td>
<td>0</td>
<td></td>
</tr>
<tr>
<td>富途</td>
<td>美金</td>
<td>E-banking</td>
<td>D1</td>
<td>0</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="美国">美国
</h2><h3 id="入金-1">入金
</h3><ul>
<li>汇丰环球转到HSBC US,然后用ACH入金</li>
<li>参考
<a href="https://www.flyert.com/forum.php?mod=viewthread&amp;tid=4574717&amp;extra=page%3D1&amp;page=1" target="_blank">盈透入金</a>
,香港汇丰转本地银行美元,不走电汇,走的是chats,不收费。</li>
</ul>
<h3 id="出金-1">出金
</h3><p>出金的话,每个月的第一笔免费,其余的需要支持25美金手续费</p>
<h1 id="资金出海">资金出海
</h1><p>现在的方式是通过兴业银行购汇,其实汇率最优的是南洋商业银行,但是去办卡的时候说汇款境外要提供酒店机票等证明材料,听起来比较麻烦
兴业银行海外汇款的一些注意事项</p>
<ul>
<li>第一次汇款选择用港币,上传港澳通信证,联系人的香港地址找个香港酒店就行,我直接写了汇丰想干的地址也过了</li>
<li>后续汇款可以直接汇美金出去,但是需要在早上9点前操作,这样才能在下午三点前完成审核并汇出,下午三点前走的中转行是香港汇丰,不会收取额外的手续费。如果是三点之后的话会走海外的花旗中转,有额外25美金的手续费。</li>
<li>汇款的时候备注填 <strong>interbank by HSBCHKHH</strong> ,收款人开户银行账号或清算代码填 <strong>HSBCHKHH</strong>, 收款行之代理行swift代码填 <strong>HSBCHKHH</strong>。这个swift代码会被兴业补全成 <strong>HSBCHKHHXXX</strong>.</li>
<li>汇款和非柜金额无关,我的账号非柜5w,但是我单笔1w美刀的汇款也成功了</li>
</ul>
<p>以3/22为例,1w人民币为例,美元汇率7.20635,港币汇率0.921425,IBKR的港币汇率是7.82085
如果直接换成美金出境,能换成1387.665美元
如果换成港币出境,再在IBKR里面换成美金,能换成1387.670 -2 = 1385.670 美元</p></description></item><item><title>CS Wangdao</title><link>https://churchmice.github.io/p/cs-wangdao/</link><pubDate>Sun, 17 Mar 2024 22:04:36 +0800</pubDate><guid>https://churchmice.github.io/p/cs-wangdao/</guid><description><p>虽然我不是CS的,但是王道系列起源于88,也算有点渊源,贴在这里就当存档吧。</p>
<h1 id="考研回忆">考研回忆
</h1><p>以前我天天都想自杀<br>
有一天我在天桥默默走著犹豫要不要直接跳下去的时候</p>
<p>突然眼前一个广告让我眼睛一亮<br>
进入浙大CS 您将拥有全世界</p>
<p>我想姑且试一试 百无赖聊活著不如找件事做<br>
于是我花了一年每天没天没日的念书<br>
直到考研那天 我才发现我袜子已经穿一年没换了<br>
全身都是霉味</p>
<p>终于如愿进入浙大CS<br>
考进之后 每天校门口都有一堆美女等著我<br>
说要找我出去玩 我说我要去教九自修</p>
<p>结果美女门就带在教室陪我 我只有中间休息的时间才抱抱她们亲亲她们<br>
现在我人生充满希望 老师跟我说 我在cell nature SCI的期刊得到全世界的赞赏<br>
已经被提名诺贝尔奖</p>
<p>如今 我常常回去走那个天桥 那个在我人生最低潮时看见的广告<br>
我把他买下来了 放著另外的标题<br>
荣耀 尊绝 不凡 浙大 CS</p>
<p>很多乞丐原本想要在天桥上乞讨的现在也纷纷狂肯大学联考<br>
他们的眼神全都变了<br>
每个都是那么锐利 全身充满冲劲<br>
她们现在每天早上六点聚在天桥前 “CS才是王道!!!”<br>
声音那么的宏亮 阳光洒下来 一切的绝望终将过去</p>
<h1 id="面店老板">面店老板
</h1><p>记的六年前 我还在念研究生的时候<br>
有一次出门忘记带皮包~&quot;~</p>
<p>我就跟老板说 老板! 打个商量好不好 我真的是忘了带皮包出来<br>
不是故意不付帐的@@&quot;</p>
<p>老板说 操 你想吃霸王餐吗?</p>
<p><del>&quot;</del> 我说不是这样子的 我真的是一时忘记带出来..</p>
<p>就这样跟老板僵持很久&hellip;<br>
眼看老板就要发火揍我了<br>
我刚好摸到口袋里有带学生证出来</p>
<p>不然这样子好吗?<br>
老板 我压我的学生证 在这边 我回去拿钱回来付? 可以吗?<br>
老板抢过我的学生证 说 好! 就信你一次</p>
<p>我就匆匆忙忙跨上我的老坦克直奔31舍<br>
等我拿了钱回到店门口<br>
老板 变了一个人似的 微笑热情的跟我打招呼</p>
<p>我怀疑其中有诈 二话不说 把钱赶快想拿给他<br>
顺便拿我的学生证<br>
谁知 老板 的手臂很有力 不管我愿不愿意 硬拉著我到店里?</p>
<p>这时候 店里已经没有客人了 我正感到奇怪</p>
<p>老板往后面喊 小如 小如 你出来<br>
这时候 老板的女儿 正点到爆炸 唇红齿白 又穿低胸装<br>
只穿条牛仔短裤就跑出来了</p>
<p>老板 哈哈一笑对我说<br>
同学请见谅阿 我不知道您是浙大CS的<br>
来来来 这是我的女儿小如 不知道你喜不喜欢?<br>
没关系啦 如果你觉得太快的话 你们可以 从朋友先当起<br>
只看到美女小如 害羞的低头在一旁腆腆的笑著</p>
<h1 id="英雄救美">英雄救美
</h1><p>有一次我有事情要去延安路办点事<br>
想说很久没送女友礼物了就跑到银泰一楼的饰品专柜</p>
<p>这时候门口 驻足很多人<br>
我好奇心驱使下 我也跑过去凑热闹<br>
有一个彪形大汉 正在调戏一个美女店员</p>
<p>操你妈的! 我生平最恨这种好色之徒</p>
<p>我脱口而出 操! 放开那个女孩<br>
这时候惨了 那个大汉 跟他的小弟大概7.8人恶狠狠<br>
得朝我看过来..</p>
<p>他骂到 卖比儿子 你要作啥西?</p>
<p>我再说一次 放开那个女孩!</p>
<p>这时候我才发现 我旁边一堆 外校的学生离我远远的<br>
躲在一旁窃笑 等著看我挨凑的好戏上演<br>
这时候 他的小弟 就要冲动的冲过来教训我了</p>
<p>这时候调戏的大汉 怪叫一声</p>
<p>操! 等一下 大家别冲动</p>
<p>果然不愧是 流氓的头头<br>
毕竟 看过的大风大浪比较多<br>
这时候 他缓缓的朝我走过来</p>
<p>你! 到底啥地方的?</p>
<p>我把嘴巴里的口香糖 吐掉 二话不说 朝他肚子狠踹一脚</p>
<p>操 好痛<br>
他跌坐在 他小弟身上<br>
卖比儿子 寻死阿!</p>
<p>眼看我就要死在 乱棒之下</p>
<p>等! 谁要赶冲过去 我就要谁死!</p>
<p>大汉 收起痛苦的脸<br>
又问了我一句<br>
力! 什么来路?</p>
<p>这时候 我用力撕开我的衣服 露出我的白色卫生衣<br>
面对他们转过来 卫生衣写著 七个英文字母<br>
ZJUCSER</p>
<p>妈的<br>
快闪阿<br>
那堆小弟 搀扶他们大哥 落荒而逃<br>
这时候那个美女跑过来想跟我道谢</p>
<p>我呼了她一巴掌 骂道<br>
以后自己要小心一点!</p>
<p>旁边观看的美女们 直喊 好MEN!</p>
<p>我就走了<br>
旁边的外校学生 尿流了一地&hellip;.</p>
<h1 id="埃及旅行">埃及旅行
</h1><p>不然遇到不同文化是很容易闹出笑话!<br>
前几年我去埃及自助旅行时<br>
跟金字塔附近的摊贩买个小纪念品<br>
但是埃及毕竟不是英语母语国家,而我的憋脚英文就派不上用场了.</p>
<p>我跟他要买一个小法老王钥匙圈,付钱的时候这位埃及人先生却一直叽哩瓜啦不收钱.<br>
他说的听起来像是&quot;ten dollars&quot;<br>
我也跟他复颂&quot;ten dollars??&quot;<br>
他又说&quot;deal doll&quot;<br>
我说&quot;deal?doll?&quot;(十元成交吗doll是指这个钥匙圈吗?)<br>
我拿出钱他却一直摇手推来推去的把钥匙圈拿给我说&quot;thi&rsquo;s i&rsquo;s one doll&quot;</p>
<p>我一头雾水,不是说十元吗?怎么又说是一美圆了?<br>
我怕发生误会然也不敢拿!<br>
两个人就在那里僵持,那个埃及人就一直不断在那里<br>
&ldquo;ten dollar, deal doll,thi&rsquo;s i&rsquo;s one doll!&rdquo;<br>
后来还好有一为当地的华裔阿伯解围,真是出外靠朋友啊!<br>
阿伯说&quot;哈哈,年轻人,拿去吧!埃及人送你的!&quot;<br>
我说&quot;怎么可以!真的吗!这样没问题吗?!!&quot;</p>
<p>阿伯指著我的T恤说&quot;埃及人说的是天道 地道 浙大CS才是王道!你放心收下吧!&quot;<br>
我终于了解了!原来他想说中文,我却跟他鸡同鸭讲!这趟埃及之旅收获很大!<br>
后来总理还有请我到官邸作客!真是太难忘了!</p>
<h1 id="我去我岳父家经历">我去我岳父家经历
</h1><p>我一直深爱著一个女孩<br>
虽然女孩也深爱著我<br>
不过由于他老爸 对于我个人有点意见<br>
一直帮他安排对象<br>
这点让我非常困扰<br>
有天 他爸在他家设下晚宴托我女友跟我说今天务必赏光</p>
<p>我心理知道 其中必定有诈<br>
甚至招来难堪羞辱..<br>
但是为了深爱的女友 我义无反顾的去了</p>
<p>到了他家<br>
开们的是一个高高壮壮的帅哥<br>
说他帅真的一点都不夸张<br>
他只穿一件黑色背心 露出扎实的肌肉<br>
干 还我微笑的时候故意抖动了两下奶子</p>
<p>我入座后 未来的岳父 跟我介绍那个男的<br>
他跟我说 呵呵 人家他是小敏的青梅竹马<br>
刚从美国加州柏克力分校拿到硕士学位回国<br>
可说是 青年才俊阿</p>
<p>我一脸沉默 他老爸得理不饶人开头就劈问我<br>
小子 你多高?<br>
我: 我只有170&hellip;<br>
哈哈 靠 我看你是少了号称两个字吧<br>
人家mike 身高一米九 体格又棒<br>
我女儿若嫁给他不知道有多么幸福喔</p>
<p>这时候我看了看小敏的眼神<br>
他眼神中似乎替我们的未来感到忧心<br>
我知到岳父是故意找我来给我难堪的&hellip;</p>
<p>我越发沉默</p>
<p>你动产不动产加起来多多少?<br>
我: 我有一间两楼的平房 存款两万多吧<br>
哈哈 一间破房子 一点点钞票<br>
人家mike在欧洲有一座自己的城堡 你这个穷小子</p>
<p>可悲..</p>
<p>妈的 我再也受不了这种羞辱正想站起来起身离开<br>
小敏拉了拉我的衣角 .. 眼中含泪求我不要走<br>
不要轻易放弃他..</p>
<p>这时候 岳父问了最后一个问题就要赶我走了的时候</p>
<p>你念哪里毕业的?<br>
我万念俱灰 人家是加州柏克力 我是zju小bb 罢了罢了&hellip;<br>
随便回了一句 我浙大CS本科毕业的&hellip;<br>
操! 突然还很大一声脏话</p>
<p>岳父把桌子掀掉 冲过起来拥抱住我<br>
还叫岳母赶快去买结婚证书让我签<br>
嘴巴直说 我的好学弟阿好学弟<br>
我推开 岳父 说了一句</p>
<p>“CS才是王道!!!!!!!”</p>
<p>岳父感动到哭了</p>
<p>我跟小敏现在过的很幸福 三个小孩也很可爱 ^__^</p></description></item><item><title>Life Goal</title><link>https://churchmice.github.io/p/life-goal/</link><pubDate>Sun, 17 Mar 2024 20:14:21 +0800</pubDate><guid>https://churchmice.github.io/p/life-goal/</guid><description><h1 id="wish-list">wish list
</h1><ul>
<li><input disabled="" type="checkbox"> 美国自驾游,从西海岸<strong>一路高清无码裸奔</strong>到东海岸</li>
<li><input disabled="" type="checkbox"> 西北自驾游,把各种线都走一遍</li>
<li><input disabled="" type="checkbox"> 定居旧金山</li>
<li><input disabled="" type="checkbox"> 有一个可爱的女儿</li>
<li><input disabled="" type="checkbox"> 50岁的时候可以实现<strong>自由</strong>,不一定要很多钱,但是可以活的更加随性一些</li>
<li><input disabled="" type="checkbox"> 未完待续</li>
</ul>
<p><img src="image/Pasted%20image%2020240317214846.png" alt="" /></p>
<p><img src="Pasted%20image%2020240317215256.png" alt="" /></p></description></item><item><title>Virtual Card</title><link>https://churchmice.github.io/p/virtual-card/</link><pubDate>Sun, 17 Mar 2024 19:47:06 +0800</pubDate><guid>https://churchmice.github.io/p/virtual-card/</guid><description><p>这几天把N26/wise/ifast都开户了,也都激活了,不免有点空虚,闲下来了把整个开户过程记录下吧。这三个都是虚拟账户,都有IBAN( International Bank Account Number),直接填写IBAN就可以转账了。</p>
<h1 id="n26">N26
</h1><p>N26是德国的银行,可以在线开户,下载app之后地址选择德国即可。之后要进行一个视频面试,需要有一点点英文的基础,基本问题如下</p>
<ul>
<li>是否本人开户</li>
<li>是否有人强迫你开户
接着回让你们来回挥动护照,让你把护照合上然后问你的生日,证明你是这护照的主人。
视频完了之后就一直&rsquo;verify identity&rsquo;,我算比较久的,大概过了一周之后才通过。
通过之后需要入金激活,每个人的要求不一样,我的是需要入金10 EUR,直接拿香港汇丰转个10 EUR就行了。
入金激活之后需要绑定设备,这样登录不用每次收短信,只有绑定设备之后才能查看卡号。按照步骤进行即可,但是我在最后的视频验证的时候总是拍出来的图像模糊,反反复复10来次,换不同的采光条件都是一样的结果。最后发现是root惹得祸,在magisk hide里面务必把这个app的所有intent都加到hide list里面,这样处理之后视频验证就过了。
这个卡如果要实体卡的话需要有国外收货地址,遂放弃。</li>
</ul>
<h1 id="wise">WISE
</h1><p>wise开户的话全程中国资料,地址啥填的都是中国,开户还是蛮快的。
入金的话用N26就可以,选择debit card,然后去N26里面给的debit 卡号和ccv码填进去就可以了。
如果要实体卡的话据说把地址改成马来西亚就可以了,然后收件地址填国内的,会从新加坡平信寄送到国内,但是不少人反应过了几个月都没收到,而且改地址有被要求地址验证的风险,遂放弃。
这卡用了一次就收到了邮件调查,问我是不是PEP ( politically exposed position ),估计是跟某官员重名了,邮件如实回复就好,回复完之后账号一切正常。</p>
<h1 id="ifast">iFAST
</h1><p>这个是英国公司,用护照注册即可,最后会让你录一段视频,说几句话,审核也挺快的。
可以用WISE入金。</p></description></item><item><title>FPGA Bot</title><link>https://churchmice.github.io/p/fpga-bot/</link><pubDate>Sun, 17 Mar 2024 14:00:22 +0800</pubDate><guid>https://churchmice.github.io/p/fpga-bot/</guid><description><h2 id="起因">起因
</h2><p>公司的服务器如果需要外发需要走外发申请(至安盾),需要有人审批之后才可以将文件进行放行。
FPGA编译是在服务器上进行的,而且经常需要出一些调试版本,如果编译一次就走一遍外发申请的flow,那将是相当废时间的。所以是想用一种自动的方法可以将FPGA编译完成的内容直接让用户可以下载。</p>
<h1 id="原理">原理
</h1><p>这个问题其实分几步走,原理其实和trustzone都有点类似,就是提供一种类似secure monitor的机制,接受用户提交的编译请求,编译完了就自动把文件拷贝到ftp的下载路径下,这样用户就可以直接通过ftp下载编译好的文件了。</p>
<h2 id="ftp">ftp
</h2><p>用的是vsftp,只允许匿名用户下载,不允许上传。请注意千万不要把其他用户的ftp权限打开,尤其是不能打开chroot功能,否则用户就可以直接下载home目录里面的内容了。ftp的下载路径对应于服务器上的/var/ftp目录,在这个下面新建一个bitfile的文件夹,只允许bot用户有写权限。</p>
<h2 id="fpga-auto-build">fpga auto build
</h2><p>一开始想用setuid来做的,虽然可以通过wrapper的方式让perl脚本以setuid的形式运行(EID != UID),但是在perl脚本里面如果还要调用其他脚本(是脚本,不是binary)那么这个setuid就会失效,除非也用类似binary wrapper的方式一层层套用下去。但是问题在于很多EDA工具和用户的接口其实也是个脚本文件,这样套壳的工作量就很大。
接着想到了代理的方式,就是用户提交过来的命令通过http的形式发送给server,server运行在root模式下,可以通过一些手段确定这个命令的确是这个用户提交的,然后su到bot执行命令。这种方式的问题是bot在编译过程中产生的一些终端输出无法实时的给到用户,而且如果要给的话其实要对cmd_server做进一步的加工。
最后想到的是直接用sudo来做,这种方式的话需要在/etc/sudoers里面严格限定用户可以让bot用户sudo的命令。当然为了安全起见,限定了只有在特定组别的用户才能执行sudo命令。</p>
<h1 id="接口">接口
</h1><p>最终提供给用户的是一个bot.cfg的配置文件,用户可以在这个配置文件里面进行配置,比如filelist的路径,xdc的路径等。配置完之后用户执行fpga_bot -c bot.cfg之后就会开始自动编译。</p>
<h2 id="安全">安全
</h2><p>需要注意如下一些安全事项</p>
<ul>
<li>sudo bot只允许特定用户组调用特定命令,可以在/etc/sudoers文件里面加以限制</li>
<li>要防止FPGA编译的tcl文件里面调用exec函数,在编译之前会用脚本去扫描用户提供的tcl文件里面调用的命令,现在采用的是白名单机制,只允许read_xdc和read_ip这两条。</li>
<li>vsftp配置只允许anonymous登录,只允许下载,不允许上传</li>
</ul></description></item><item><title>Building EDA server from scratch</title><link>https://churchmice.github.io/p/eda-server/</link><pubDate>Sun, 03 Mar 2024 13:06:43 +0800</pubDate><guid>https://churchmice.github.io/p/eda-server/</guid><description><h1 id="前言">前言
</h1><p>在<strong>老和山</strong>职业技术学院读书的时候就开始从事实验室的兼职网管,负责实验室的网络建设以及服务器的维护,也是时候写个文章把攒了这么多年的知识科普一下。</p>
<h2 id="硬件">硬件
</h2><ul>
<li><strong>portal</strong>: 登录服务器,也是终端用户唯一可以访问的机器</li>
<li><strong>core</strong>: 核心服务器,上面部署了ipa,jenkins,gitlab,jira,sungrid等服务</li>
<li><strong>grid00</strong>: 运算服务器1,用作sungrid的computing node</li>
<li><strong>grid01</strong>: 运算服务器2,用作sungrid的computing node</li>
<li><strong>netapp</strong>: 存储服务器,做芯片的一般就用netapp</li>
</ul>
<h2 id="网络配置">网络配置
</h2><p>参考的网络拓扑如下</p>
<ul>
<li>一个内网段 <strong>10.0.2.0/24</strong> (用于服务器之间的通信)</li>
<li>一个外网IP <strong>192.168.5.100</strong> 用于终端客户的访问</li>
<li>自定义域名: ic.X.com</li>
</ul>
<h2 id="系统安装">系统安装
</h2><p>系统推荐用centos 7.9, 当然也可以用最新的centos 8 stream。在某些最新的server上面,硬件已经不支持centos 7了,所以只能装centos 8. 8和7的系统稍微在配置上稍微有一些差别。
安装的时候把一些开发者工具都给装上可以避免后续很多问题。</p>
<h3 id="portal">portal
</h3><p>对外的网卡 ext: ip 配置成 192.168.5.100<br>
对内的网卡 int: ip 配置成 10.0.2.1<br>
配置网卡的时候一些注意事项</p>
<ul>
<li>NetworkManager的影响: 如果是直接修改 /etc/sysconfig/network-scripts的方式进行配置的话,记得里面加一行 <strong>NM_CONTROLLED=no</strong> ,或者干脆就把NetworkManger卸载掉得了</li>
<li>网卡的名字: 默认的名字总是奇奇怪怪,早起的叫ethX,后来变成emX,如果是光口,名字可能叫做p1p2这种,这种名字可以在ifcfg-<em>xx</em> 里面进行修改
可以使用以下命令对网卡名字做动态修改</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ip link set old_device_name name new_device_name
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果是要静态修改的话需要对ifcfg-xx做以下修改</p>
<ul>
<li>将ifcfg_old_name重命名为ifcfg_new_name</li>
<li>将文件里面的DEVICE和NAME修改为new_name</li>
<li>HWADDR需要修改成网卡的真实地址</li>
</ul>
<h3 id="core">core
</h3><p>网卡 int: ip 配置成10.0.2.100
额外注意事项</p>
<ul>
<li>该机器最后会当做flexlm的license server,有些license daemon是挑网卡名字的,比如TSMC的一定要求网卡的名字是<strong>eth</strong> 打头,所以请至少保留一块网卡地址用这个名字</li>
<li>如果有改MAC地址需求的,需要再ifcfg-<em>xx</em> 里面需要用<strong>HWADDR</strong>指定网卡之前的MAC地址,让后用<strong>MACADDR</strong>指明需要更改的MAC地址</li>
</ul>
<h3 id="grid00">grid00
</h3><p>网卡 int: ip 配置成 10.0.2.10</p>
<h3 id="grid01">grid01
</h3><p>网卡 int: ip 配置成 10.0.2.12</p>
<h3 id="netapp">netapp
</h3><p>取决于买的型号类型,一般需要配置业务口和管理口,后者仅用于管理功能,带宽需求不大。业务口的话推荐做链路聚合。</p>
<h2 id="软件安装及配置">软件安装及配置
</h2><h3 id="ssh-免密登录">ssh 免密登录
</h3><p>首先产生密钥对</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh-keygen -t ed25519
</span></span></code></pre></td></tr></table>
</div>
</div><p>不用RSA的原因是RSA的密钥长,计算工作量大,而且安全性也不高。题外话,RSA512现在已经可以用普通计算机进行暴力破解了。
然后将公钥复制黏贴进对方机器的 <strong>.ssh/authorized_keys</strong> 即可,当然你也可以用以下命令进行自动拷贝</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh-copy-id -i eda25519.pub core
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ntp">NTP
</h3><p>使用chrony
portal作为NTP server,提供定时服务给到10.0.2.0/24网段</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">root@portal:~ <span class="c1">#-&gt; cat /etc/chrony.conf |grep -v &#39;^#&#39;</span>
</span></span><span class="line"><span class="cl">erver 0.centos.pool.ntp.org iburst
</span></span><span class="line"><span class="cl">server 1.centos.pool.ntp.org iburst
</span></span><span class="line"><span class="cl">server 2.centos.pool.ntp.org iburst
</span></span><span class="line"><span class="cl">server 3.centos.pool.ntp.org iburst
</span></span><span class="line"><span class="cl">driftfile /var/lib/chrony/drift
</span></span><span class="line"><span class="cl">makestep 1.0 <span class="m">3</span>
</span></span><span class="line"><span class="cl">rtcsync
</span></span><span class="line"><span class="cl">allow 10.0.2.0/24
</span></span><span class="line"><span class="cl"><span class="nb">local</span> stratum <span class="m">10</span>
</span></span><span class="line"><span class="cl">logdir /var/log/chrony
</span></span><span class="line"><span class="cl">log measurements statistics tracking
</span></span></code></pre></td></tr></table>
</div>
</div><p>其他服务器需要将upstream设置为portal</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">root@grid00:~ <span class="c1">#-&gt;cat /etc/chrony.conf|grep -v &#39;^#&#39;</span>
</span></span><span class="line"><span class="cl">server 10.0.2.1 iburst
</span></span><span class="line"><span class="cl">driftfile /var/lib/chrony/drift
</span></span><span class="line"><span class="cl">makestep 1.0 <span class="m">3</span>
</span></span><span class="line"><span class="cl">rtcsync
</span></span><span class="line"><span class="cl">logdir /var/log/chrony
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ipa">IPA
</h3><p>这个是一个认证服务器,大家可能听说过nis,nisplus,yellowpage,ldap其实本质都是一个东西,只不过扩展性不一样。IPA的话其实底层走的还是ldap那一套,只不过集成了管理界面,对用户更加友好。</p>
<h4 id="server安装">server安装
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ipa-server-install -N --domain-level <span class="m">0</span> --allow-zone-overlap --idstart <span class="m">2000</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>注意其中的<code>idstart</code> ,根据情况自己修改
安装过程中会提示admin password和directory manager的password
安装过程会提示上游DNS,填10.0.2.1</p>
<h4 id="client安装">client安装
</h4><p>以grid00为例</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ipa-client-install --server<span class="o">=</span>core.ic.X.com --domain<span class="o">=</span>grid00.ic.X.com -N --enable-dns-updates --hostname<span class="o">=</span>grid00.ic.X.com
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="ssl-证书">SSL 证书
</h4><p>在IPA server的安装过程中,会将产生的root CA放在/root/cacert.p12下面,可以用
<a href="https://hohnstaedt.de/xca/" target="_blank">xca</a>
导入进行管理,以后可以用这个root CA签名新的证书。导入过程中会提示你输入密码,这个密码就是安装过程中输入的admin password。
都已经2024年了,推荐所有的服务都上https</p>
<p>IPA的管理界面默认会占用80/443/8080/8443端口,请避免和其他服务冲突
windows电脑登录的时候会跳出一个认证框,这是因为windows支持kerbose login, 可以通过在 /etc/httpd/conf.d/ipa.conf 里面添加如下配置禁用</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-apacheconf" data-lang="apacheconf"><span class="line"><span class="cl"><span class="nb">GssapiSessionKey</span> file:/etc/httpd/alias/ipasession.key
</span></span><span class="line"><span class="cl"><span class="nb">BrowserMatch</span> Windows gssapi-no-negotiate
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="常见操作">常见操作
</h4><h5 id="增加一个dns解析">增加一个DNS解析
</h5><p>如果你只是想增加一个DNS解析的话,可以使用下面的命令(将gitlab.ic.X.com解析成10.0.2.100)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ipa dnsrecord-add ic.X.com. --name gitlab --a-rec 10.0.2.100
</span></span></code></pre></td></tr></table>
</div>
</div><h5 id="缓存刷新">缓存刷新
</h5><p>刷新IPA缓存</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sss_cache -E
</span></span></code></pre></td></tr></table>
</div>
</div><p>刷新系统缓存</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">systemctl restart sssd
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="dns-解析">DNS 解析
</h3><p>在portal上面安装dnsmasq并指定上游,例如 114
修改所有机器的 /etc/resolv.conf</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">search ic.X.com
</span></span><span class="line"><span class="cl">nameserver 10.0.2.100
</span></span></code></pre></td></tr></table>
</div>
</div><p>这里再次吐槽NetworkManager,默认是会去把这个文件给overwrite掉的,需要做一些额外处理。或者就像我一样,不管三七二十一,直接把NetworkManager给干了。
一个典型的查询场景如下所示,需要注意的是如果查询的域名位于ic.X.com,那直接在core就会返回查询结果。</p>
<pre class="mermaid">sequenceDiagram
participant grid00
participant core
participant portal
participant public_dns
grid00 ->> core: DNS query for www.baidu.com
core ->> portal: forward the query
portal ->> public_dns: forward the query
public_dns ->> portal: query result for www.baidu.com
portal ->> core: query result for www.baidu.com
core ->> grid00: query result for www.baidu.com
</pre>
<h3 id="netapp-1">netapp
</h3><p>将netapp的目录以NFS的方式挂载到各台机器上,建议挂载分区如下</p>
<ul>
<li>/proj: 项目相关的文件</li>
<li>/tools: EDA工具</li>
<li>/tmpdir: 临时目录,比如仿真文件等</li>
<li>/home: 用户主目录</li>
<li>/opt/sge: sungrid的共享目录,其实严格意义上来说只有SGE_CELL那个路径才需要共享,但是都共享了也没太大问题。直接用core分享也可以
需要注意的是netapp默认的nfs4版本会进行root_squash,导致root账号被映射成了nobody,解决办法是在挂载的时候选择用nfs3挂载</li>
</ul>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-apacheconf" data-lang="apacheconf"><span class="line"><span class="cl"><span class="err">10</span>.<span class="err">0</span>.<span class="err">2</span>.<span class="err">155:/</span><span class="nb">home</span> <span class="sx">/home</span> nfs defaults,async,nosuid,nodev,hard,intr,nfsvers=3,timeo=60,retrans=5 <span class="m">0</span> <span class="m">0</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>netapp如果要关系,需要使用以下命令,要防止主node被backup node给take over掉</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">system node halt -node * -skip-lif-migration-before-shutdown <span class="nb">true</span> -ignore-quorum-warnings <span class="nb">true</span> -inhibit-takeover <span class="nb">true</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="gcc">gcc
</h3><p>系统如果要安装多个gcc版本,建议下载源码解压之后用如下方式进行编译</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">./contrib/download_prerequisites
</span></span><span class="line"><span class="cl">mkdir build <span class="o">&amp;&amp;</span> <span class="nb">cd</span> build
</span></span><span class="line"><span class="cl">../configure --prefix<span class="o">=</span>/tools/misc/gcc/xx.xx.xx --enable-checking<span class="o">=</span>release --enable-languages<span class="o">=</span>c,c++ --enable-threads<span class="o">=</span>posix --disable-multilib --with-system-zlib
</span></span><span class="line"><span class="cl">make -j64 <span class="o">&amp;&amp;</span> make install
</span></span></code></pre></td></tr></table>
</div>
</div><p>版本之间的切换可以用
<a href="https://modules.readthedocs.io/en/latest/" target="_blank">modules</a>
进行管理。</p>
<h3 id="sungrid">sungrid
</h3><p>sungrid是一个开源的集群运算软件,在core上执行</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">yum install -y jemalloc gridengine gridengine-execd gridengine-guiinst gridengine-qmaster gridengine-qmon
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后通过如下命令启动图形安装界面</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/sge <span class="o">&amp;&amp;</span> ./start_gui_installer
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="gitlab">gitlab
</h3><p>
<a href="https://about.gitlab.com/" target="_blank">gitlab</a>
是一个可以私有部署的程序员内部交友网站,主要的配置文件是/etc/gitlab/gitlab.rb。
最重要的数据文件推荐放在netapp的存储上面,备份文件建议放在core的本地存储上面,对应的配置如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"> <span class="n">git_data_dirs</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;default&#34;</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">&#34;path&#34;</span> <span class="o">=&gt;</span> <span class="s2">&#34;/proj/git&#34;</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;manage_backup_path&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span></span><span class="line"><span class="cl"><span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;backup_path&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&#34;/data/backup/gitlab&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;backup_gitaly_backup_path&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&#34;/opt/gitlab/embedded/bin/gitaly-backup&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;backup_keep_time&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="mi">2592000</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>对gitlab.rb的内容进行更改之后,需要通过如下命令进行配置刷新</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gitlab-ctl reconfigure
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="ssl">ssl
</h4><p>要将CA放到 <strong>/etc/gitlab/trusted-certs</strong> 下面
修改gitlab.rb,关键配置如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">nginx</span><span class="o">[</span><span class="s1">&#39;ssl_certificate&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&#34;/etc/ssl/ic.X.com/server.crt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">nginx</span><span class="o">[</span><span class="s1">&#39;ssl_certificate_key&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&#34;/etc/ssl/ic.X.com/server.key&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">external_url</span> <span class="s1">&#39;https://core.ic.X.com&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">nginx</span><span class="o">[</span><span class="s1">&#39;listen_port&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="mi">1024</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>可以通过下面的rewrite rule将
<a href="https://git.ic.X.com" target="_blank">https://git.ic.X.com</a>
重定向到
<a href="https://core.ic.X.com:1024" target="_blank">https://core.ic.X.com:1024</a>
</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-apacheconf" data-lang="apacheconf"><span class="line"><span class="cl"><span class="err">root@core:~</span> <span class="c">#-&gt; cat /etc/httpd/conf.d/gitlab-rewrite.conf</span>
</span></span><span class="line"><span class="cl"><span class="c"># VERSION 6 - DO NOT REMOVE THIS LINE</span>
</span></span><span class="line"><span class="cl"><span class="nb">RewriteEngine</span> <span class="k">on</span>
</span></span><span class="line"><span class="cl"><span class="nb">RewriteRule</span> ^/gitlab https://core.ic.X.com:1024 [L,R=301]
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="ldap">ldap
</h4><p>修改gitlab.rb.关键配置如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"> <span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;ldap_enabled&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span></span><span class="line"><span class="cl"> <span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;prevent_ldap_sign_in&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="kp">false</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">gitlab_rails</span><span class="o">[</span><span class="s1">&#39;ldap_servers&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;main&#39;</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;label&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;LDAP&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;host&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;core.ic.X.com&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;port&#39;</span> <span class="o">=&gt;</span> <span class="mi">636</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;uid&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;uid&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;bind_dn&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;uid=dummy,cn=users,cn=accounts,dc=ic,dc=X,dc=com&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;base&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;dc=ic,dc=X,dc=com&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;password&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;password for dummy&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;encryption&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;simple_tls&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;verify_certificates&#39;</span> <span class="o">=&gt;</span> <span class="kp">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;smartcard_auth&#39;</span> <span class="o">=&gt;</span> <span class="kp">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;active_directory&#39;</span> <span class="o">=&gt;</span> <span class="kp">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;allow_username_or_email_login&#39;</span> <span class="o">=&gt;</span> <span class="kp">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;lowercase_usernames&#39;</span> <span class="o">=&gt;</span> <span class="kp">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;block_auto_created_users&#39;</span> <span class="o">=&gt;</span> <span class="kp">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;user_filter&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;memberOf=cn=staff,cn=groups,cn=accounts,dc=ic,dc=X,dc=com&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;attributes&#39;</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;username&#39;</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s1">&#39;uid&#39;</span><span class="o">]</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;email&#39;</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s1">&#39;Email&#39;</span><span class="o">]</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;name&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;cn&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;first_name&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;givenName&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;last_name&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;sn&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="c1">## EE only</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;group_base&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;cn=groups,cn=accounts,dc=ic,dc=X,dc=com&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;admin_group&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">&#39;sync_ssh_keys&#39;</span> <span class="o">=&gt;</span> <span class="kp">false</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>配置完之后可以用如下命令进行测试</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">gitlab-rake gitlab:ladap:check
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="migration">migration
</h4><p>可以用如下的方式进行迁移</p>
<ol>
<li>进入旧文件夹,git remote 解除远端reposity的绑定</li>
<li>git remote 添加新远端repository</li>
<li>git push</li>
</ol>
<h3 id="jenkins">jenkins
</h3><h4 id="ssl-1">ssl
</h4><p>jenkins用的是java那一套,所以ssl的支持稍微麻烦一点。
CA: <strong>update-ca-trust</strong> 本身就已经产生了java需要的CA,具体的路径是 <strong>/etc/pki/ca-trust/extracted/java/cacerts</strong>
https证书: 用xca生成p12格式的证书(.pfx),然后用如下命令转换,其中changeit是证书导出的时候设置的密码</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">keytool -importkeystore -srcstorepass changeit -deststorepass changeit -srckeystore ssl.pfx -srcstoretype pkcs12 -destkeystore jenkins.jks -deststoretype JKS
</span></span></code></pre></td></tr></table>
</div>
</div><p>修改配置文件 <strong>/usr/lib/systemd/system/jenkins.service</strong>,关键配置如下:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-apacheconf" data-lang="apacheconf"><span class="line"><span class="cl"><span class="err">root@core:~</span> <span class="c">#-&gt; cat /usr/lib/systemd/system/jenkins.service|grep -v &#39;^#&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c">#jenkins is picky on java version, must use version 17</span>
</span></span><span class="line"><span class="cl"><span class="err">Environment=&#34;JAVA_HOME=/usr/java/jdk-17</span>.<span class="err">0</span>.<span class="err">5&#34;</span>
</span></span><span class="line"><span class="cl"><span class="err">Environment=&#34;JENKINS_JAVA_CMD=/usr/java/jdk-17</span>.<span class="err">0</span>.<span class="err">5/bin/java&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c">#load the CA so we can use ldaps </span>
</span></span><span class="line"><span class="cl"><span class="err">Environment=&#34;JAVA_OPTS=-Djava</span>.<span class="err">awt</span>.<span class="err">headless=</span><span class="nb">true</span> -Djavax.net.ssl.trustStore=/home/jenkins/config/cacerts -Djavax.net.ssl.trustStorePassword=changeit<span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">#turn off http and enable https
</span></span></span><span class="line"><span class="cl"><span class="s2">Environment=&#34;</span>JENKINS_PORT=-1<span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Environment=&#34;</span>JENKINS_HTTPS_LISTEN_ADDRESS=10.0.2.100<span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Environment=&#34;</span>JENKINS_HTTPS_PORT=8888<span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">#specify the https ceritificate
</span></span></span><span class="line"><span class="cl"><span class="s2">Environment=&#34;</span>JENKINS_HTTPS_KEYSTORE=/home/jenkins/config/jenkins.jks<span class="s2">&#34;
</span></span></span><span class="line"><span class="cl"><span class="s2">Environment=&#34;</span>JENKINS_HTTPS_KEYSTORE_PASSWORD=changeit<span class="err">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">[Install]</span>
</span></span><span class="line"><span class="cl"><span class="err">WantedBy=multi-user</span>.<span class="nb">target</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="ldap-1">ldap
</h4><p>需要安装ldap插件,<strong>/home/jenkins/config.xml</strong> 里面的关键配置信息如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;securityRealm</span> <span class="na">class=</span><span class="s">&#34;hudson.security.LDAPSecurityRealm&#34;</span> <span class="na">plugin=</span><span class="s">&#34;[email protected]_544c9d1512&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;disableMailAddressResolver&gt;</span>false<span class="nt">&lt;/disableMailAddressResolver&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;configurations&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;jenkins.security.plugins.ldap.LDAPConfiguration&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;server&gt;</span>ldaps://core.ic.X.com<span class="nt">&lt;/server&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;rootDN&gt;</span>dc=ic,dc=X,dc=com<span class="nt">&lt;/rootDN&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;inhibitInferRootDN&gt;</span>false<span class="nt">&lt;/inhibitInferRootDN&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;userSearchBase&gt;</span>cn=users,cn=accounts<span class="nt">&lt;/userSearchBase&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;userSearch&gt;</span>uid={0}<span class="nt">&lt;/userSearch&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;groupMembershipStrategy</span> <span class="na">class=</span><span class="s">&#34;jenkins.security.plugins.ldap.FromGroupSearchLDAPGroupMembershipStrategy&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;filter&gt;&lt;/filter&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;/groupMembershipStrategy&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;managerDN&gt;</span>uid=dummy,cn=users,cn=accounts,dc=ic,dc=X,dc=com<span class="nt">&lt;/managerDN&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="nt">&lt;managerPasswordSecret&gt;</span>{dummy_password_hash}<span class="nt">&lt;/managerPasswordSecret&gt;</span>