<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Note | Chia-An Lee</title><link>https://calee0219.github.io/tag/note/</link><atom:link href="https://calee0219.github.io/tag/note/index.xml" rel="self" type="application/rss+xml"/><description>Note</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><copyright>©</copyright><lastBuildDate>Mon, 09 Aug 2021 07:48:37 +0800</lastBuildDate><image><url>https://calee0219.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Note</title><link>https://calee0219.github.io/tag/note/</link></image><item><title>Cisco Router 設定</title><link>https://calee0219.github.io/blog/note_cisco_router/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_cisco_router/</guid><description>&lt;h3 id="password-recorivy"&gt;Password Recorivy&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Power ON, CTRL-break&lt;/li&gt;
&lt;li&gt;confreg 0x2142&lt;/li&gt;
&lt;li&gt;reload&lt;/li&gt;
&lt;li&gt;enable&lt;/li&gt;
&lt;li&gt;copy startup-config running-config&lt;/li&gt;
&lt;li&gt;no shutdown: open port&lt;/li&gt;
&lt;li&gt;change password&lt;/li&gt;
&lt;li&gt;config-register 0x2102: get back to normal boot&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="7609"&gt;7609&lt;/h2&gt;
&lt;h3 id="洗掉-config"&gt;洗掉 config&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;enable&lt;/li&gt;
&lt;li&gt;write erase&lt;/li&gt;
&lt;li&gt;reload&lt;/li&gt;
&lt;li&gt;這時候可能 default reboot 會進入 Romman 狀態，繼續下 boot 會來到正常狀態&lt;/li&gt;
&lt;li&gt;下 &lt;code&gt;configreg 0x2102&lt;/code&gt; (或 &lt;code&gt;configreg 0x2101&lt;/code&gt;) 讓開機直接進到正常狀態&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reset"&gt;Reset&lt;/h3&gt;
&lt;h2 id="routing"&gt;Routing&lt;/h2&gt;
&lt;h3 id="vrrp"&gt;vrrp&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;作 gateway 備援使用&lt;/li&gt;
&lt;li&gt;有三種狀態 &lt;code&gt;初始狀態(Initialize)&lt;/code&gt;、&lt;code&gt;主狀態(Master)&lt;/code&gt;、&lt;code&gt;備援狀態(Backup)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nx-os"&gt;NX-OS&lt;/h2&gt;
&lt;h3 id="沒有權限時重設-admin-密碼"&gt;沒有權限時，重設 admin 密碼&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開機&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;ctrl-C&lt;/code&gt; 或 &lt;code&gt;ctrl-R&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;進入 &lt;code&gt;loader&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loader&amp;gt; dir&lt;/code&gt; 看有哪些 boot file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;boot n3000-xxx&lt;/code&gt; 選擇你要 boot 的檔案 (可能選有 kickstart 的)&lt;/li&gt;
&lt;li&gt;進入 &lt;code&gt;switch(boot)#&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conf t&lt;/code&gt; -&amp;gt; &lt;code&gt;admin-password&lt;/code&gt; -&amp;gt; 輸入 admin 密碼 -&amp;gt; &lt;code&gt;exit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dir bootflash:&lt;/code&gt; 列出有的開機檔案&lt;/li&gt;
&lt;li&gt;&lt;code&gt;load bootflash:n3000-xxx&lt;/code&gt; 選擇以 xx 檔案開機&lt;/li&gt;
&lt;li&gt;帳號: admin, 密碼: 剛剛設定的&lt;/li&gt;
&lt;li&gt;進入系統後，記得要把 kickstart 與 system 指向對的地方&lt;/li&gt;
&lt;li&gt;&lt;code&gt;conf t&lt;/code&gt; -&amp;gt; &lt;code&gt;boot kickstart n3000-xxx&lt;/code&gt; -&amp;gt; &lt;code&gt;boot system n3000-kickstart-xxx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果沒做上面的動作，有可能 &lt;code&gt;reload&lt;/code&gt; 後會回到 &lt;code&gt;loader&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="恢復原廠設定"&gt;恢復原廠設定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;enable&lt;/li&gt;
&lt;li&gt;write erase&lt;/li&gt;
&lt;li&gt;reload&lt;/li&gt;
&lt;li&gt;如果 reload 卡在 loader，做上面的動作，並記得指向正確的 system 與 kickstart&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Cisco Switch 設定</title><link>https://calee0219.github.io/blog/note_cisco_switch/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_cisco_switch/</guid><description>&lt;h2 id="2960"&gt;2960&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="document"&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不知道後面接啥就 &amp;ldquo;?&amp;rdquo; 一下嚕~~&lt;/li&gt;
&lt;li&gt;Vlan31: 17網段&lt;/li&gt;
&lt;li&gt;Vlan14: 168網段&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="刷新"&gt;刷新&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開機時長按 mode 鍵，直到燈號快閃&lt;/li&gt;
&lt;li&gt;flash_init&lt;/li&gt;
&lt;li&gt;del flash:config.text&lt;/li&gt;
&lt;li&gt;del flash:vlan.dat&lt;/li&gt;
&lt;li&gt;boot&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="console"&gt;Console&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;connect
&lt;ul&gt;
&lt;li&gt;Serial -&amp;gt; Serial port(在裝置管理員看的到) -&amp;gt; 9600&lt;/li&gt;
&lt;li&gt;screen /dev/tty.usbmodem145231 9600&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;跳過init自己設&lt;/li&gt;
&lt;li&gt;show version: 看版本
&lt;/li&gt;
&lt;li&gt;logging synchronous: 避免 log 擋住正在打的訊息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="command"&gt;Command&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;copy running-config startup-config: 存config&lt;/li&gt;
&lt;li&gt;enable/disable: 可以開始寫入/結束&lt;/li&gt;
&lt;li&gt;clock set {hh:mm:ss} {day} {month} {year}: 設定時間&lt;/li&gt;
&lt;li&gt;show running-config&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="config"&gt;Config&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;config t: 進入改 config 模式 (下列的指令都要在 config 模式下修改)&lt;/li&gt;
&lt;li&gt;hostname {myhostname}&lt;/li&gt;
&lt;li&gt;clock timezone CST 8 (CST 只是名字，沒有意義)&lt;/li&gt;
&lt;li&gt;no ip http server: 將 HTTP server 關掉&lt;/li&gt;
&lt;li&gt;no ip http secure-server&lt;/li&gt;
&lt;li&gt;username {name} password {clear password}: 設定帳號密碼&lt;/li&gt;
&lt;li&gt;service password-encryption: 密碼加密&lt;/li&gt;
&lt;li&gt;spanning-tree mode rapid-pvst: 使用 rapid-pvst 網路拓樸&lt;/li&gt;
&lt;li&gt;service timestamps log datetime localtime year show-timezone: 讓 log 有時間戳記&lt;/li&gt;
&lt;li&gt;ip name-server {CC 的 nameserver(140.113.235.1)}: 讓 DNS work&lt;/li&gt;
&lt;li&gt;ip default-gateway {通常網段最後一個}&lt;/li&gt;
&lt;li&gt;ntp server ntp.cc.cs.nctu.edu.tw: 設ntp server&lt;/li&gt;
&lt;li&gt;security passwords min-length 8: pw 最短長度&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ssh-setting"&gt;ssh setting&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ip domain-name {your domain}&lt;/li&gt;
&lt;li&gt;ip ssh version 2: 用 version 2 的 ssh server&lt;/li&gt;
&lt;li&gt;crypto key generate rsa
&lt;ul&gt;
&lt;li&gt;打自己喜歡的數字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;line vty 0 15&lt;/li&gt;
&lt;li&gt;transport input ssh&lt;/li&gt;
&lt;li&gt;login local&lt;/li&gt;
&lt;li&gt;username {name} privilege 15 password {pw}: 直接把權限提到最高 (15)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="限制連線-ip-config-t"&gt;限制連線 ip (config t)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;access-list 1 permit host {ip}: 在 access-list 1 下設定 access 規則 (只允許某 ip 連入)&lt;/li&gt;
&lt;li&gt;line vty 0 15: 進入 vty&lt;/li&gt;
&lt;li&gt;access-class 1 in: 限制只有 access-list 1 下的規則才能連進來(in)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="vlan-setting"&gt;Vlan setting&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;interface Vlan 31&lt;/li&gt;
&lt;li&gt;ip address {your IP} {your mask}: 將 Vlan 對上 static ip&lt;/li&gt;
&lt;li&gt;no shutdown: 不要關掉這個 Vlan&lt;/li&gt;
&lt;li&gt;no interface Vlan{num}: 如果不小心開啟不要的 interface，可以用這個指令把他關掉&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="網路孔"&gt;網路孔&lt;/h3&gt;
&lt;h4 id="將-port-接到-vlan-上"&gt;將 port 接到 Vlan 上&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;interface gigabitEthernet 0/1: 進入 no.1 port&lt;/li&gt;
&lt;li&gt;interface range gigabitEthernet 0/1 - 24: 上面的range版&lt;/li&gt;
&lt;li&gt;switchport access vlan 31: 將 port 接到 Vlan 31 上&lt;/li&gt;
&lt;li&gt;shutdown: 如果要那個 port 不能連網，記得要關掉&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="trunk"&gt;trunk&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;interface gigabitEthernet 0/48&lt;/li&gt;
&lt;li&gt;switchport mode trunk&lt;/li&gt;
&lt;li&gt;switchport access vlan {Vlan id}: 當 trunks 不 works 時，該用那一個 vlan &amp;lt;- 但是如果用 switchport mode trunk，就不會有這個問題 (trunk 死掉就直接死掉)&lt;/li&gt;
&lt;li&gt;switchport trunk allowed vlan 14,31&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="描述"&gt;描述&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;interface gigabiteEthernet 0/1: 進入 port&lt;/li&gt;
&lt;li&gt;description {要寫的描述}&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3750"&gt;3750&lt;/h2&gt;
&lt;h3 id="connect"&gt;Connect&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;mac
&lt;ul&gt;
&lt;li&gt;screen /dev/tty.usb&amp;hellip; 9600&lt;/li&gt;
&lt;li&gt;或者下載
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="reset"&gt;Reset&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;指令
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# write earse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;System&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;modified&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Save&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Proceed&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;reload&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Model&lt;/span&gt; &lt;span class="n"&gt;revision&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Would&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;enter&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;物理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="misc"&gt;Misc&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;no ip domain-lookup&lt;/code&gt;: 關閉 DNS 查詢功能&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;預設情況下，Router的DNS查詢是啟用的&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;當輸入Cisco IOS無法識別的指令時，Router會把這個指令視為主機名稱，然後向DNS查詢。&lt;/li&gt;
&lt;li&gt;但是這個無用的查詢是非常耗時的，若沒有需要可以關閉!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;switch 1 provision ws-c3750g-24ts&lt;/code&gt;: 3750 可以作 stack，這個跟這台 3750 是在 stack 上的哪一台有關&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>DHCP 設定</title><link>https://calee0219.github.io/blog/note_dhcp/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_dhcp/</guid><description>&lt;h2 id="server"&gt;Server&lt;/h2&gt;
&lt;h3 id="centos"&gt;CentOS&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lease: /var/lib/dhcpd/dhcpd.leases&lt;/li&gt;
&lt;li&gt;config: /etc/dhcp/dhcpd.conf
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;option domain-name &amp;#34;calee.xyz&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;option domain-name-servers 140.113.235.1, 1.1.1.1, 9.9.9.9, 8.8.8.8;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;default-lease-time 600;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;max-lease-time 7200;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Use this to send dhcp log messages to a different log file (you also
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# have to hack syslog.conf to complete the redirection).
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log-facility local7;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# A slightly different configuration for an internal subnet.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subnet 192.168.1.0 netmask 255.255.255.0 {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; range 192.168.1.0 192.168.1.254;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; option domain-name-servers 140.113.235.1, 1.1.1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; option domain-name &amp;#34;pve.calee.xyz&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; option routers 192.168.1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; option broadcast-address 192.168.1.254;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; default-lease-time 600;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; max-lease-time 7200;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;host DESKTOP-A6UOSVB {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hardware ethernet 82:20:3d:cf:32:79;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fixed-address 192.168.1.2;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;host DESKTOP-04E99PF {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hardware ethernet 72:0e:c8:c3:6c:1c;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fixed-address 192.168.1.3;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="client"&gt;Client&lt;/h2&gt;
&lt;h3 id="linux"&gt;Linux&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Renew: &lt;code&gt;dhclient -r&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="windows"&gt;Windows&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Renew: &lt;code&gt;ipconfig /renew&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="macos"&gt;MacOS&lt;/h3&gt;</description></item><item><title>Docker</title><link>https://calee0219.github.io/blog/docker/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/docker/</guid><description>&lt;h2 id="參考資料"&gt;參考資料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;h3 id="ubuntu"&gt;Ubuntu&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt; &lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt; &lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fsSL&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gpg&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ce&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="centos"&gt;CentOS&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;yum&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;yum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mapper&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;lvm2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;yum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;centos&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ce&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;yum&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ce&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="單位"&gt;單位&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;映像檔(image)
&lt;ul&gt;
&lt;li&gt;類似 docker 的模板&lt;/li&gt;
&lt;li&gt;image 類似模板，要用 image 開出來的 container 才能用&lt;/li&gt;
&lt;li&gt;名詞
&lt;ul&gt;
&lt;li&gt;NAME&lt;/li&gt;
&lt;li&gt;DESCRIPTION: 描述&lt;/li&gt;
&lt;li&gt;AUTOMATED&lt;/li&gt;
&lt;li&gt;REPOSITORY (倉庫)&lt;/li&gt;
&lt;li&gt;TAG: 標記，通常會存版本號&lt;/li&gt;
&lt;li&gt;IMAGE ID: image 被抓下來時，隨機產生的唯一 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dockerfile
&lt;ul&gt;
&lt;li&gt;將 docker 與相關安裝執行指令寫成操作檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;容器(container)
&lt;ul&gt;
&lt;li&gt;建立出來的執行實力&lt;/li&gt;
&lt;li&gt;基本上是基於 image 在跑得 =&amp;gt; 開出 container 後不能將 image 刪掉，or 可能會跑不動&lt;/li&gt;
&lt;li&gt;可以用 image 創&lt;/li&gt;
&lt;li&gt;可以用 Dockerfile 創&lt;/li&gt;
&lt;li&gt;可以被啟動、開始、停止、刪除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;倉庫(Registry)
&lt;ul&gt;
&lt;li&gt;Public Hub
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Private Hub&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="指令"&gt;指令&lt;/h2&gt;
&lt;h3 id="hub"&gt;Hub&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker search [image]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;從 Docker Hub 上搜尋是否有相關名字的 docker image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker pull [image]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;將 docker image 從 Docker Hub 上下載下來&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker login&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;登入 Docker Hub&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker push [image]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;把 docker image 推上 Docker Hub&lt;/li&gt;
&lt;li&gt;基本上倉儲相關指令與 Git 相同&lt;/li&gt;
&lt;li&gt;注意：docker push 必須有 namespace，也就是當初對 images 命名時，要記的命成 &lt;code&gt;username/imagename&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="image"&gt;Image&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker images&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;將所有的 docker image 列出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run [image]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;啟動一個 container&lt;/li&gt;
&lt;li&gt;通常後面會接一個操作指令，操作完就結束 container
&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;docker run Ubuntu /bin/echo &amp;quot;Hello World&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt;: 標準輸入保持打開&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt;: 讓Docker分配一個虛擬終端（pseudo-tty）並綁定到容器的標準輸入上&lt;/li&gt;
&lt;li&gt;通常 -i -t 會合用
&lt;ul&gt;
&lt;li&gt;e.g. &lt;code&gt;docker run -t -i Ubuntu /bin/bash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: 進入背景執行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker rmi [image]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;刪除 image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;OPTIONS
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--author, -a&lt;/code&gt;: 作者&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--message, -m&lt;/code&gt;: commit message&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;container
&lt;ul&gt;
&lt;li&gt;要 commit 的 container =&amp;gt; commit 完後便會變成新的 image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REPOSITORY
&lt;ul&gt;
&lt;li&gt;如果想要對產出的 image 做命名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker load/save IMAGE&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;匯入 or 匯出(儲存) image (像是存成 .tar)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker build [Dockerfile]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;從 Dockerfile 編譯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="container"&gt;Container&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker ps&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;列出目前在執行的 container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt;: 列出全部的 container(包含關機的)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker start [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;啟動關機的 container&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker stop [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;container 關機&lt;/li&gt;
&lt;li&gt;關機後會留下殘骸 =&amp;gt; 可以再次開啟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker restart [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;重新開機&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker logs [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;列出這個 container 曾經的 stander output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker exec [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;將在背景執行的 container 提出來&lt;/li&gt;
&lt;li&gt;通常配合 &lt;code&gt;-i -t&lt;/code&gt;，回到互動視窗&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker rm [CONTAINER ID / CONTAINER NAME]&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;刪除 conatiner&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker import / export CONTAINER&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;匯入 or 匯出 container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o NAME.tar&lt;/code&gt;: 指定匯出格式 (ex .tar)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="data-volumes"&gt;Data Volumes&lt;/h3&gt;
&lt;p&gt;分別有 Data Volumes 與 Data Valume Container 兩種&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data Valumes
&lt;ul&gt;
&lt;li&gt;將主機目錄對應到容器中，類似 mount&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run -v {容器內資料夾} IMAGE&lt;/code&gt;: 會在主機內建一個資料夾掛載上去&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker run -v {主機內資料夾}:{容器內資料夾} IMAGE&lt;/code&gt;: 直接用已存在的資料夾掛載&lt;/li&gt;
&lt;li&gt;可以多個容器掛載到同一個主機資料夾&lt;/li&gt;
&lt;li&gt;多個 &lt;code&gt;-v&lt;/code&gt; 參數可以掛載多個資料夾&lt;/li&gt;
&lt;li&gt;容器內資料夾一定要是絕對路徑，主機則不一定&lt;/li&gt;
&lt;li&gt;預設為 rw，可用 &lt;code&gt;docker run -v {主機內資料夾}:{容器內資料夾}:ro IMAGE&lt;/code&gt; 改成唯讀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data Valume Container&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="attach-device"&gt;Attach Device&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;USB:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run --device=/dev/ttyUSB0 -it ubuntu /bin/bash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;NVIDIA GPU:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run --device=/dev/nvidia0 -it ubuntu /bin/bash&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="restful-api"&gt;RESTful API&lt;/h2&gt;
&lt;p&gt;修改 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;live-restore&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;group&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;dockerroot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;insecure-registries&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.0.0.0:5000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;hosts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;unix:///var/run/docker.sock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;tcp://0.0.0.0:2375&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以 &lt;code&gt;jupyter/tensorflow-notebook&lt;/code&gt; 為例，開啟 RESTful api 後，docker CLI 指令要用 Root 執行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo docker pull jupyter/tensorflow-notebook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改完後，重啟 docker service: &lt;code&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;參考:
&lt;/li&gt;
&lt;li&gt;參考:
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="操作"&gt;操作&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker version&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X GET http://localhost:2375/version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker pull jupyter/tensorflow-notebook&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST http://localhost:2375/images/create?fromImage=jupyter/tensorflow-notebook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker images&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X GET http://localhost:2375/images/json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker create -p 8080:80 jupyter/tensorflow-notebook&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -H &amp;#34;Content-Type: application/json&amp;#34; http://0.0.0.0:2375/containers/create?name=tensor -d &amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Image&amp;#34;: &amp;#34;jupyter/tensorflow-notebook&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;HostConfig&amp;#34;:{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Memory&amp;#34;: 4194304,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;NanoCPUs&amp;#34;: 2000000000,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;PortBindings&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;80/tcp&amp;#34;: [{&amp;#34;HostPort&amp;#34;: &amp;#34;8080&amp;#34;}]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Dns&amp;#34;: [&amp;#34;8.8.8.8&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;Devices&amp;#34;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;PathOnHost&amp;#34;: &amp;#34;/dev/nvidia0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;PathInContainer&amp;#34;: &amp;#34;/dev/nvidia0&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;CgroupPermissions&amp;#34;: &amp;#34;rwm&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker ps -a&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X GET http://localhost:2375/containers/json?all=true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker start tensor&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST http://localhost:2375/containers/tensor/start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker stop tensor&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST http://localhost:2375/containers/tensor/stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker rm tensor&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X DELETE http://localhost:2375/containers/tensor?v=true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="nvidia-docker"&gt;Nvidia-docker&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有 cuda 但沒有 cudnn&lt;/li&gt;
&lt;li&gt;魔改
&lt;ul&gt;
&lt;li&gt;下載 cudnn:
&lt;/li&gt;
&lt;li&gt;解安裝到 jupyter/driver (之後會一起 mount 進 container):
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xzvf cudnn-9.0-linux-x64-v7.tgz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;開啟一個 container volumn
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker volumn create cudnn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;把 container volumn 與 jupyter folder 同時 mount 入 container
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --runtime=nvidia -v /home/intern2018/NCHC-docker-test/jupyter:/jupyter -v cudnn:/cudnn -it calee0219/jupyter-docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;照 doc 安裝 cudnn (複製貼上、修改權限):
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /jupyter/driver/cuda/include/cudnn.h /usr/local/cuda/include
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /jupyter/driver/cuda/lib64/libcudnn* /usr/local/cuda/lib64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;測試
&lt;ul&gt;
&lt;li&gt;改環境變數指向
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cuda&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;LD_LIBRARY_PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;測試 script
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import numpy as np
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import tensorflow as tf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from datetime import datetime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;device_name = sys.argv[1] # Choose device from cmd line. Options: gpu or cpu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shape = (int(sys.argv[2]), int(sys.argv[2]))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if device_name == &amp;#34;gpu&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; device_name = &amp;#34;/gpu:0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; device_name = &amp;#34;/cpu:0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;with tf.device(device_name):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; random_matrix = tf.random_uniform(shape=shape, minval=0, maxval=1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sum_operation = tf.reduce_sum(dot_operation)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;startTime = datetime.now()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result = session.run(sum_operation)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(result)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# It can be hard to see the results on the terminal with lots of output -- add some newlines to improve readability.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#34;\n&amp;#34; * 5)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#34;Shape:&amp;#34;, shape, &amp;#34;Device:&amp;#34;, device_name)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#34;Time taken:&amp;#34;, str(datetime.now() - startTime))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;將 &lt;code&gt;/usr/local/cuda/&lt;/code&gt; 全部丟入 container volumn 內
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /usr/local/cuda/* /cudnn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;之後都把 container volumn mount 到 &lt;code&gt;/usr/local/cuda/&lt;/code&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --runtime=nvidia -v /home/intern2018/NCHC-docker-test/jupyter:/jupyter -v cudnn:/usr/local/cuda/ -it calee0219/jupyter-docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dockerfile"&gt;Dockerfile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gpu"&gt;GPU&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--divice=/dev/nvidia0&lt;/code&gt;&lt;/p&gt;</description></item><item><title>file system</title><link>https://calee0219.github.io/blog/note_fs/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_fs/</guid><description>&lt;h2 id="fstab"&gt;fstab&lt;/h2&gt;
&lt;h3 id="mount-ntfs"&gt;mount NTFS&lt;/h3&gt;
&lt;p&gt;
/etc/fstab&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;989CE0C49CE09E4E /home/calee/stg ntfs-3g defaults &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="find-uuid"&gt;Find UUID&lt;/h2&gt;
&lt;p&gt;it&amp;rsquo;s a symbolic link to /dev/sd_
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l /dev/disk/by-uuid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="檢視分割磁碟區"&gt;檢視分割磁碟區&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install gparted
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo gparted
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="link"&gt;link&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s TARGET(src) LINK_NAME(dst) # soft link
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>firewalld 設定</title><link>https://calee0219.github.io/blog/note_firewalld/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_firewalld/</guid><description>&lt;h2 id="firewalld"&gt;firewalld&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --get-default-zone
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --set-default-zone&lt;span class="o"&gt;=&lt;/span&gt;internal
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --get-active-zones
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --list-all-zones
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="換腳"&gt;換腳&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewal-cmd --permanent --zone&lt;span class="o"&gt;=&lt;/span&gt;public --remove-interface&lt;span class="o"&gt;=&lt;/span&gt;ens34
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewall-cmd --permanent --zone&lt;span class="o"&gt;=&lt;/span&gt;internal --add-interface&lt;span class="o"&gt;=&lt;/span&gt;ens34
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="allow--deney-port"&gt;Allow / Deney port&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;/p&gt;
&lt;h3 id="src-nat"&gt;src-nat&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;先設定網卡的 zone
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nmcli c mod eth1 connection.zone internal
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nmcli c mod eth2 connection.zone external
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;firewall-cmd --get-active-zone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;允許封包轉送
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="n"&gt;nat&lt;/span&gt; &lt;span class="n"&gt;POSTROUTING&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;WAN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;MASQUERADE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;FORWARD&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LAN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;WAN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;ACCEPT&lt;/span&gt; &lt;span class="c1"&gt;# -i 是 input, -o 是 output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;FORWARD&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;WAN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LAN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="n"&gt;RELATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ESTABLISHED&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;ACCEPT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dst-nat"&gt;dst-nat&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;做 masquerade
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;external&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;masquerade&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;permanent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;masquerade&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;permanent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;same server
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --zone=&amp;#34;public&amp;#34; --add-forward-port=port=80:proto=tcp:toport=12345 --permanent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;different server
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --zone=external --add-masquerade --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9 --permanent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>GitHub 入門</title><link>https://calee0219.github.io/blog/github_intro/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/github_intro/</guid><description>&lt;h2 id="github-註冊"&gt;GitHub 註冊&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;首先到
&lt;/li&gt;
&lt;li&gt;點下網站上的Sign Up&lt;/li&gt;
&lt;li&gt;依網站要求輸入相關資料&lt;/li&gt;
&lt;li&gt;帳號開通後即完成！！&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="安裝git"&gt;安裝Git&lt;/h2&gt;
&lt;h3 id="windows"&gt;Windows&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;首先到
下載Git for windows安裝檔&lt;/li&gt;
&lt;li&gt;執行安裝檔安裝Git&lt;/li&gt;
&lt;li&gt;安裝完後, 電腦上應該會出現一個&lt;strong&gt;Git Bash&lt;/strong&gt;程式, 按下並執行Git Bash&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="linux"&gt;Linux&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install git // debian or ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install git-core //fedora
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install git // fedora 24 or upper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mac"&gt;MAC&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="git基本觀念"&gt;Git基本觀念&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;可以看
的第一章了解git版本控制基本觀念&lt;/li&gt;
&lt;li&gt;git 三類
&lt;ul&gt;
&lt;li&gt;tracked (被追蹤的檔案，有做過 git 版控的檔案皆為此類)&lt;/li&gt;
&lt;li&gt;ignored (忽略的檔案，此類檔案不會被追蹤，須寫在 .gitignore 裡)&lt;/li&gt;
&lt;li&gt;untracked (未被追蹤的，剛新增的檔案皆為此類)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;git 三狀態
&lt;ul&gt;
&lt;li&gt;working directory (工作狀態，未做任何版本控制，此狀態內修改的code都是不可逆的)&lt;/li&gt;
&lt;li&gt;staging area (版控站存區，working directory 的 code 皆可被這裡的 code 複寫回原來的版本，但若此區的檔案被更新，則無法回復之前在 staging area 的 code)&lt;/li&gt;
&lt;li&gt;repository (進入版控的 code，此區的 code 有許多節點，修改過的 code 可回復到此區的任意節點)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;git / GitHub 術語
&lt;ul&gt;
&lt;li&gt;repo: repository 縮寫&lt;/li&gt;
&lt;li&gt;merge: 兩份同一個專案的 code 互相衝突時，檢查檔案是否有衝突的地方，若無，合併檔案，法之修改衝突的部分後合併檔案&lt;/li&gt;
&lt;li&gt;pull request (PR): 要求他人將你的更新 merge 到他的 repo 中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="git-基礎指令"&gt;git 基礎指令&lt;/h2&gt;
&lt;p&gt;:::info
指令中有[]者表示括號中內容依使用者的需求自填，&amp;quot;[&amp;quot; ＆ &amp;ldquo;]&amp;ldquo;不須下在指令中
:::&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;git init&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新創一個git repository&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git status&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看目前專案目錄狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git branch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看目前所有分支(有打星號的分支)&lt;/li&gt;
&lt;li&gt;創建新分支：&lt;code&gt;git branch [newBranchName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;切換分支：&lt;code&gt;git checkout [branchName]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git add [fileName]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將檔案加到暫存區stage, 在stage的檔案就是準備要commit的檔案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git commit&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將所有已經加到stage的檔案提交到repository, 需要輸入提交訊息來紀錄這次提交&lt;/li&gt;
&lt;li&gt;通常會搭配 &lt;code&gt;-m&lt;/code&gt; 參數使用, 此參數可以讓你在下commit指令時同時順便輸入簡易的提交訊息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git merge&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合併兩個分支&lt;/li&gt;
&lt;li&gt;指令：&lt;code&gt;git branch [firstBranch] [secondBranch]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;上述指令會將secondBranch合併到firstBranch中&lt;/li&gt;
&lt;li&gt;合併完且不再需要的branch可以下&lt;code&gt;git branch -d [branchName]&lt;/code&gt;刪除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git log&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看歷次提交的相關資訊&lt;/li&gt;
&lt;li&gt;若只要看線圖可以加上 &lt;code&gt;--graph&lt;/code&gt; &lt;code&gt;--oneline&lt;/code&gt; &lt;code&gt;--decorate&lt;/code&gt; &lt;code&gt;--all&lt;/code&gt;四個參數&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git push&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將本地分支提交到遠端伺服器&lt;/li&gt;
&lt;li&gt;若遠端分支有更新，push會失敗，必須先pull遠端更新才能push本地更新&lt;/li&gt;
&lt;li&gt;完整指令：&lt;code&gt;git push [remoteRepositoryName] [localBranchName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;若你的repository是從gitHub clone下來的，reomteRepositoryName會是origin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git pull&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把遠端更新下載回本地端並與本地端分支合併&lt;/li&gt;
&lt;li&gt;類似把 git fetch 及 git merge 一起做的指令&lt;/li&gt;
&lt;li&gt;完整指令：&lt;code&gt;git pull [remoteRepositoryName] [localBranchName]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以加入&lt;code&gt;--rebase&lt;/code&gt;參數讓線圖更漂亮&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;git &amp;ndash;help&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看git幫助訊息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="專案協作"&gt;專案協作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;git clone
&lt;ul&gt;
&lt;li&gt;複製git server 的 repository 到 local 端&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-by-step"&gt;Step by step&lt;/h2&gt;
&lt;p&gt;對於 moztw 的專案，如果你不想要知道他們到底是幹什麼的，只要可以讓你可以做就好的話&amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;到 moztw 的
，右上方按 fock ，複製到自己的 GitHub 上
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/um4W72c.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;到自己 fork 的 repo ，按右上方 Clone or download，將看到的網址複製下來
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/ntuZBun.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;到你的電腦，下 &lt;code&gt;git clone [剛剛的網址]&lt;/code&gt; 的指令，等待電腦下載完成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;到 moztw issue 尋找你想要改的 bug 或新增的 feature
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/1la2x1y.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點入 issue 後可以查看詳細內容
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/CCK3SjL.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;針對你要貢獻的 issue，編輯你需要修改的檔案，在編輯前，記得先讀過一些 coding 的
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;若想看修改的結果，可以 npm 的方式運行，運行方式
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;編輯完成後，下 &lt;code&gt;git status&lt;/code&gt; 可以看到你所修改的檔案變成 &lt;em&gt;modified&lt;/em&gt; (紅色的) 狀態，若是新檔案則是 &lt;em&gt;untracked files&lt;/em&gt; 狀態&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;若已經確認某檔案將不再修改，可以下 &lt;code&gt;git add [filePath]&lt;/code&gt; 將檔案放到暫存區 (staging area) 準備commit&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;add完所有需要提交的檔案後，就可以下 &lt;code&gt;git commit -m &amp;quot;Fix issue [issue No.], [yourCommitMessage]&amp;quot;&lt;/code&gt; 將檔案提交到repository了，記得要把 issue No. 寫在你的 commit 裡，pull request 時管理員才能知道你修的是哪個 issue&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確認所有檔案都以完成提交，下 &lt;code&gt;git push origin master&lt;/code&gt; 上傳到你 GitHub 上的 repo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確認你 GutHub repo 上的檔案是正確的後，按左上方的 new pull request 完成你的 pull request
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/qKh2Hwj.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;坐等你的 pull request 被 merge 或被退回吧~~~&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="如何運行-moztw"&gt;如何運行 moztw&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安裝
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;windows 下安裝
即可&lt;/li&gt;
&lt;li&gt;Ubuntu / Debian 下，在 terminal 下 &lt;code&gt;sudo apt install nodejs npm&lt;/code&gt; 指令&lt;/li&gt;
&lt;li&gt;Fedora 下，在 terminal 下 &lt;code&gt;sudo dnf install nodejs npm&lt;/code&gt; 指令&lt;/li&gt;
&lt;li&gt;Mac 下， 在 terminal 下 &lt;code&gt;brew install node&lt;/code&gt; 指令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用 terminal (linux/mac) 或 cmd (windows) 到你 moztw 所在的資料夾下&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下 &lt;code&gt;npm install&lt;/code&gt; 安專所需的套件，然後下 &lt;code&gt;npm start&lt;/code&gt; 運行網頁&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在瀏覽器裡打開 &lt;code&gt;localhost:3000&lt;/code&gt; 即可看到你下載下來的網頁，之後對資料夾內檔案做修改，網頁都會自動更新&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="附錄"&gt;附錄&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>iptables 使用小記</title><link>https://calee0219.github.io/blog/note_iptables/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_iptables/</guid><description>&lt;h2 id="iptables"&gt;iptables&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iptables [-t table] &lt;code&gt;command&lt;/code&gt; &lt;code&gt;CHAIN&lt;/code&gt; [NUM] match criteria -j ACTION&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CHAIN&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;-N: (new) new a chain&lt;/li&gt;
&lt;li&gt;-X: delete chain&lt;/li&gt;
&lt;li&gt;-F: flush all chain&lt;/li&gt;
&lt;li&gt;-Z: zero the pkg counter&lt;/li&gt;
&lt;li&gt;-P: policy of chain&lt;/li&gt;
&lt;li&gt;-E: rename&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;rule
&lt;ul&gt;
&lt;li&gt;-A: append rule&lt;/li&gt;
&lt;li&gt;-I: insert rule to number&lt;/li&gt;
&lt;li&gt;-R: replace&lt;/li&gt;
&lt;li&gt;-D: delete&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LIST
&lt;ul&gt;
&lt;li&gt;-L: list&lt;/li&gt;
&lt;li&gt;-S: Specification&lt;/li&gt;
&lt;li&gt;-n: user number to show&lt;/li&gt;
&lt;li&gt;-v: verbose&lt;/li&gt;
&lt;li&gt;-x: show msg&lt;/li&gt;
&lt;li&gt;&amp;ndash;line number: show line number&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dst-nat"&gt;DST-NAT&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl net.ipv4.ip_forward=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo iptables -t nat -A PREROUTING -j DNAT -p tcp --to-destination 192.168.15.254:80 -i ens19
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Jupyter 設定</title><link>https://calee0219.github.io/blog/note_jupyter/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_jupyter/</guid><description>&lt;h2 id="install"&gt;Install&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;pip install jupyter&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pip3 install --upgrade pip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pip3 install jupyter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="error"&gt;Error&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h2 id="modulenotfounderror-no-module-named-_sqlite3"&gt;&lt;code&gt;ModuleNotFoundError: No module named '_sqlite3'&lt;/code&gt;&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ModuleNotFoundError: No module named 'pysqlite2'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="used"&gt;Used&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;start&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /要用來存資料的資料夾/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jupyter notebook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;參數&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--ip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--port
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--no-browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="config"&gt;config&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;環境設定&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipython --ipython-dir= # override the default IPYTHONDIR directory, ~/.ipython/ by default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipython profile create foo # create the profile foo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipython profile locate foo # find foo profile directory, IPYTHONDIR by default,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ipython --profile=foo # start IPython using the new profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;產生設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jupyter –-generate-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;會在產生 &lt;code&gt;~/.jupyter/jupyter_notebook_config.py&lt;/code&gt; 設定檔&lt;/p&gt;
&lt;h2 id="jupyter-server"&gt;jupyter server&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;產生設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jupyter notebook --generate-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;產生密碼&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jupyter notebook password
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;會在 &lt;code&gt;jupyter_notebook_config.json&lt;/code&gt; 存密碼的 hash value，需要把它丟到 &lt;code&gt;jupyter_notebook_config.py&lt;/code&gt; 裡的 &lt;code&gt;c.NotebookApp.password =&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set options for certfile, ip, password, and toggle off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set ip to &amp;#39;*&amp;#39; to bind on all interfaces (ips) for the public server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sha1:bcd259ccf...&amp;lt;your hashed password here&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# It is a good idea to set a known, fixed port for server access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="jupyter-daemon"&gt;Jupyter Daemon&lt;/h3&gt;
&lt;p&gt;
檔案：&lt;code&gt;/lib/systemd/system/jupyter.service&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description=Jupyter Notebook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PIDFile=/run/jupyter.pid
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Step 1 and Ste 2 details are here..
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# -----------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ExecStart=/usr/local/bin/jupyter-notebook --config=/home/calee/.jupyter/jupyter_notebook_config.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User=calee
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Group=calee
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WorkingDirectory=/home/calee/Project/Jupyter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RestractSec=10
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#KillMode=mixed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;執行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start jupyter.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart jupyter.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; jupyter.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-proxy-setting"&gt;NGINX proxy setting&lt;/h2&gt;
&lt;p&gt;位置：&lt;code&gt;/etc/nginx/sites-enabled/notebook.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;upstream notebook {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server localhost:8888;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server_name notebook.calee.xyz;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://notebook;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /api/kernels/ {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://notebook;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # websocket support
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade &amp;#34;websocket&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;Upgrade&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_read_timeout 86400;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ /terminals/ {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://notebook;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Host $host;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # websocket support
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_http_version 1.1;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Upgrade &amp;#34;websocket&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_set_header Connection &amp;#34;Upgrade&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_read_timeout 86400;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restart Nginx&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>LDAP</title><link>https://calee0219.github.io/blog/note_ldap/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_ldap/</guid><description>&lt;h2 id="freeipa"&gt;freeIPA&lt;/h2&gt;
&lt;h2 id="openldap"&gt;OpenLDAP&lt;/h2&gt;
&lt;h3 id="server"&gt;Server&lt;/h3&gt;
&lt;h4 id="nfs"&gt;NFS&lt;/h4&gt;
&lt;h4 id="nis"&gt;NIS&lt;/h4&gt;
&lt;h4 id="ldap"&gt;LDAP&lt;/h4&gt;
&lt;h3 id="client"&gt;Client&lt;/h3&gt;
&lt;h4 id="nfs-1"&gt;NFS&lt;/h4&gt;
&lt;h4 id="nis-1"&gt;NIS&lt;/h4&gt;
&lt;h4 id="ldap-1"&gt;LDAP&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;需要下載
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo yum update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; yum install openldap openldap-clients nss-pam-ldapd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;複製 server 端的 CAe&lt;/li&gt;
&lt;li&gt;產生 config
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authconfig --enableldap --enableldapauth --ldapserver&lt;span class="o"&gt;=&lt;/span&gt;ldaps://ldaps.cs.nctu.edu.tw --ldapbasedn&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dc=cs,dc=nctu,dc=edu,dc=tw&amp;#34;&lt;/span&gt; --update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;設定檔: &lt;code&gt;/etc/openldap/ldap.conf&lt;/code&gt; :
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BASE dc=cs,dc=nctu,dc=edu,dc=tw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;URI ldaps://ldaps.cs.nctu.edu.tw/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_REQCERT allow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_CIPHER_SUITE=AES256
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TLS_CACERTDIR /etc/ssl/certs/csrootca.crt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;filter passwd (memberof=cn=cs-ta,ou=MemberGroup,dc=cs,dc=nctu,dc=edu,dc=tw) # 如果要限制只有 cs-ta groups 的資訊才會被透過 LDAP 進來了話
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;重啟服務
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart nslcd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart nscd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;檢查
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ldapsearch -D &lt;span class="s2"&gt;&amp;#34;uid=calee,ou=People,dc=cs,dc=nctu,dc=edu,dc=tw&amp;#34;&lt;/span&gt; -W &lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ypwhich : 查詢 NIS Server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ypchsh：改變 NIS 上使用者登入的 Shell
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ypchfn：改變 NIS 上使用者的完整名稱跟相關資訊，也就是 /etc/passwd 中的第五個欄位
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ypmatch：查詢 NIS map 的 KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yptest：測試 NIS 的設定，如果可以跑出來 NIS 上的使用者則代表可以查詢
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;-D uid 裡面的是去登入 ldaps.cs.nctu.edu.tw 的帳號，之後問問密碼，使用 uid 使用者的密碼登入搜尋&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cache-solution"&gt;Cache Solution&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SSSD
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NSCD&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux 上密碼相關設定</title><link>https://calee0219.github.io/blog/note_linux_passwd/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_linux_passwd/</guid><description>&lt;h2 id="password-policy"&gt;Password Policy&lt;/h2&gt;
&lt;p&gt;密碼品質檢查，這個功能是透過 pam 時做，避免 user 弱密碼導致 ssh 或其他服務被破解 (&lt;code&gt;man pam_pwquality&lt;/code&gt;)&lt;/p&gt;
&lt;h3 id="修改方法"&gt;修改方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Debian 系統預設沒有 pwquality，需要先安裝: &lt;code&gt;sudo apt-get install libpam-pwquality&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;可以直接修改 &lt;code&gt;/etc/pam.d/&lt;/code&gt; 檔案，直接接在 &lt;code&gt;pam_unix.so&lt;/code&gt; 當行最後用空白隔開&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt; 檔案 [rpm_pam] 或用 &lt;code&gt;authconfig&lt;/code&gt; 指令 (Red Hat 系列，自己 man ㄅ)，可以寫在 &lt;code&gt;/etc/pam.d&lt;/code&gt;，不過都給 config file 了就用杯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設定內容"&gt;設定內容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;密碼最小長度: &lt;code&gt;minlen=12 dcredit=0 ucredit=0 lcredit=0 ocredit=0 # 最少 12 char，後面 credit 要記得加，理由後述&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密碼複雜度:
&lt;ul&gt;
&lt;li&gt;其實前面的 &lt;code&gt;minlen&lt;/code&gt; 並不完全是密碼最小長度，而是密碼最少應得分數。計算方式是每個字元 +1，另外將字元分類成四類，分別再給一分，但另給的分數有上限:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ucredit=3&lt;/code&gt;: 密碼如果包含 upper-case 大寫字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lcredit=2&lt;/code&gt;: 密碼如果包含 lower-case 小寫字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dcredit=1&lt;/code&gt;: 密碼如果包含 digit-case 數字字母最多多給分數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ocredit=0&lt;/code&gt;: 密碼如果包含 other-case 其他字母最多多給分數 (eg. 符號)&lt;/li&gt;
&lt;li&gt;分數加總後便是總所得分數，以上例來看，&lt;code&gt;$$$$$$$a&lt;/code&gt; 得分為 &lt;code&gt;8+0+1+0+0&lt;/code&gt;，符號沒額外得分，小寫單字額外一分。而 &lt;code&gt;$$$$$aaa&lt;/code&gt; 得分為 &lt;code&gt;8+0+2+0+0&lt;/code&gt;，小寫單字做多額外兩分，不會給超過。&lt;/li&gt;
&lt;li&gt;故得知，如果只寫 &lt;code&gt;minlen=12&lt;/code&gt;，會因為有額外分數而可以少於 12 字元&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;也可以不用得分來算複雜度，而是直接用管理員想要的數量，只要將所想要的數字加負號 (common)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ucredit=-1&lt;/code&gt;: upper-case 大寫字母最少 1 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lcredit=-2&lt;/code&gt;: lower-case 小寫字母最少 2 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dcredit=-3&lt;/code&gt;: digit-case 數字字母最少 3 個&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ocredit=-4&lt;/code&gt;: other-case 其他字母最少 4 個&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他參考 &lt;code&gt;/etc/security/pwquality.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;retry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 最多可以是錯幾次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;difok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# 新密碼中不可出現跟舊密碼相同字串長度 (eg. 舊: abcdef，新密碼不可以是 abcdez)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;minclass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 最少一定要出現幾種字元 (大寫、小寫、數字、其他)，好處是不用限定一定要哪一種&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;maxrepeat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 最大可重複字元次數，0 是不檢查 (!) (eg. =3，則不能有 26aaaac)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;maxclassrepeat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 同一種類的字元最多可以重複出現的次數，0 是不檢查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;gecoscheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 會從 /etc/passwd 的 GECOS 欄位檢查是否有跟密碼重複超過 3 個字元串，簡單來說就是為了避免用身分資料來合成密碼，0 是不檢查，只有 True False (由 pam_cracklib 檢查)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;dictcheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 字典攻擊檢查，由 pam_cracklib 的字典來查找，選項 True False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;usercheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 檢查是否有 username 組成的密碼&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;enforcing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 密碼規則建議或強制，預設 1 是強制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;badwords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gura inna &lt;span class="c1"&gt;# 自訂一不合法字串&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enforce_for_root &lt;span class="c1"&gt;# 如果使用者用 sudo passwd 也會強制檢查密碼，不然預設只會警告 (用 sudo 時)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;local_users_only &lt;span class="c1"&gt;# 只檢查有在 /etc/passwd 的密碼&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ucredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;lcredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;dcredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ocredit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="password-expiration"&gt;Password Expiration&lt;/h2&gt;
&lt;p&gt;密碼過期，可以設定密碼有效期限，或是請使用者登入時修改密碼 (方便用於幫使用者亂數生成密碼給他後請他第一次登入修改密碼)&lt;/p&gt;
&lt;h3 id="logindefs"&gt;login.defs&lt;/h3&gt;
&lt;p&gt;這份檔案類似模板，只會影響到新加的使用者，對於已經存在的使用者並不影響&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_MAX_DAYS &lt;span class="m"&gt;1234&lt;/span&gt; &lt;span class="c1"&gt;# 密碼最多用幾天 (要換)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_MIN_DAYS &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# 密碼幾天內不能修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PASS_WARN_AGE &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="c1"&gt;# 密碼到期前幾天開始提醒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="chage"&gt;chage&lt;/h3&gt;
&lt;p&gt;修改現存使用者的密碼到期時間&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chage [options] LOGIN&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt;: 修改 &amp;ldquo;上一次修改時間&amp;rdquo;，可用 YYYY-MM-DD 格式或從 1970/01/01 開始算的天數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-E&lt;/code&gt;: 修改到期時間，可用 YYYY-MM-DD 格式或從 1970/01/01 開始算的天數&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt;: help&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-I&lt;/code&gt;: 密碼到期後 N 天會直接把使用者鎖掉&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt;: list，顯示資料&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;: min，密碼幾天內不能修改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-M&lt;/code&gt;: max，密碼最多用幾天&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-R&lt;/code&gt;: 應用 chroot，也許是到期後把使用者 chroot 到低權限的家目錄 (?)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-W&lt;/code&gt;: 密碼到期前幾天開始提醒&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="迫使使用者換密碼"&gt;迫使使用者換密碼&lt;/h3&gt;
&lt;p&gt;通常一些系統我們可能為了避免知道使用者密碼，會亂數生成密碼給他，再請他登入後自己 &lt;code&gt;passwd&lt;/code&gt; 改密碼，但如何避免使用者懶得改呢?&lt;/p&gt;
&lt;p&gt;其實密碼到期後的下一次登入，系統並不會讓使用者無法登入，而是登入後迫使他改密碼，因此我們可以將使用者設定成密碼到期，便可以讓系統請他改密碼&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;passwd --expire $USER&lt;/code&gt;: 用 passwd 版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chage -d 0 $USER&lt;/code&gt;: 用 chage 版本，其實就是把他的到期日期設定成 1970/01/01&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remember"&gt;Remember&lt;/h2&gt;
&lt;p&gt;避免使用者設定以前設定過的密碼&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/pam.d&lt;/code&gt; 下的檔案 (&lt;code&gt;common-password&lt;/code&gt; 或 &lt;code&gt;system-auth&lt;/code&gt;)，password 最後面接 &lt;code&gt;remember=5&lt;/code&gt;，代表新密碼不能用前五次內的密碼&lt;/p&gt;
&lt;h2 id="password-generation"&gt;Password Generation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkpasswd&lt;/code&gt;: 用你輸入的參數送你密碼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;makepasswd --chars 12&lt;/code&gt;: 用 &lt;code&gt;urandom&lt;/code&gt; 送你一組密碼&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pwgen&lt;/code&gt;: 送你一堆密碼&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ps"&gt;P.S.&lt;/h2&gt;
&lt;p&gt;[rpm_pam]: 理論上要在 &lt;code&gt;/etc/pam.d/passwd&lt;/code&gt; 下面多寫 &lt;code&gt;password required pam_pwquality.so retry=3&lt;/code&gt; 讓系統知道要用 pam_pwquality，但現在預設應該都有 &lt;code&gt;auth include system-auth&lt;/code&gt;，而去翻 &lt;code&gt;system-auth&lt;/code&gt; 檔案會發現內部就有寫 &lt;code&gt;pam_pwquality&lt;/code&gt;，因此應該是不用特別再寫一次。&lt;/p&gt;
&lt;h2 id="reference"&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux 上的 NVIDIA 驅動</title><link>https://calee0219.github.io/blog/note_nvidia/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_nvidia/</guid><description>&lt;h2 id="nvidia-driver-on-ubuntu"&gt;Nvidia driver on Ubuntu&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;到
查看最新版本
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;34x: 傳統架構版本&lt;/li&gt;
&lt;li&gt;387: 新版短期&lt;/li&gt;
&lt;li&gt;384: 新版長期&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;刪除舊版&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get purge nvidia*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;安裝新版&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo add-apt-repository ppa:graphics-drivers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install nvidia-387
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo reboot &lt;span class="c1"&gt;# 重開機&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;檢查&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep nvidia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cuda"&gt;cuda&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cuda-9
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cuda-nvcc-9-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;手動安裝
到
下載 runfile(local)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sh cuda_9.1.85_387.26_linux.run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;檢查
注意：gcc 要是 &amp;lt; 6 的版本 @@&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r /usr/local/cuda-9.1/samples ./
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; samples
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cudnn"&gt;cudnn&lt;/h2&gt;
&lt;p&gt;到
下載&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cuda 的資料夾要在 &lt;code&gt;/usr/local/cuda/&lt;/code&gt;，so 不管裝在哪裡，都給一個 link 到 &lt;code&gt;/usr/local/cuda&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ubuntu 版:
&lt;ul&gt;
&lt;li&gt;下載 libcudnn7&amp;hellip;deb, libcudnn7-dev&amp;hellip;deb, libcudnn7-doc&amp;hellip;deb&lt;/li&gt;
&lt;li&gt;三個都做 &lt;code&gt;sudo dpkg -i&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;其他
&lt;ul&gt;
&lt;li&gt;下載壓縮檔&lt;/li&gt;
&lt;li&gt;解壓縮: &lt;code&gt;tar -xzvf cudnn-9.0-linux-x64-v7.tgz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安裝:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Linux 小指令</title><link>https://calee0219.github.io/blog/note_linux_cli/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_linux_cli/</guid><description>&lt;h3 id="change-default-editor"&gt;Change default editor&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;For global
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-alternatives --config editor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 然後選擇數字
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;For one user
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;select&lt;/span&gt;-editor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;or
in &lt;code&gt;.bashrc&lt;/code&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vim&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;VISUAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vim&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="add-groups"&gt;Add groups&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Change main group
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupadd mynewgroup # Add a new group
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usermod -g groupname username
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groups username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Add secondary group
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod -aG groupname username
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="password-policy"&gt;password policy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim /etc/pam.d/common-password&lt;/code&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;password required pam_cracklib.so minlen=8 # 最短 8 digits
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ssh"&gt;SSH&lt;/h2&gt;
&lt;h3 id="ssh-keep-alive"&gt;SSH Keep Alive&lt;/h3&gt;
&lt;h4 id="client-side"&gt;Client side&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host *
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ServerAliveInterval 240
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;chmod 600 ~/.ssh/config&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="server-side"&gt;Server Side&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ClientAliveInterval 60
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ClientAliveCountMax 2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ssh-tunnel"&gt;SSH Tunnel&lt;/h3&gt;
&lt;p&gt;
![](
=400x)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Normal Tunnel (Local Port Forward)
&lt;ul&gt;
&lt;li&gt;正常情況下，你希望你的封包先過一台機器(Server Side)，再用這台機器出去，達到 VPN 的效果，你如果可以直接對這台機器(Server Side) SSH，便可以用正常的 SSH Tunnel&lt;/li&gt;
&lt;li&gt;指定碰到 client 的 port 就等於碰到 server 的 port&lt;/li&gt;
&lt;li&gt;Client
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -L [bind_address:]port:host:hostport user@host_ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reverse Tunnel (Remote Port Forward)
&lt;ul&gt;
&lt;li&gt;如果你希望封包進入一台無法 SSH 的機器(Server Side)，可能是再公司防火牆內的機器，對於開 SSH Session 只能由內往外開，不能由外往內開，這時候就需要先再 Server Side 主動開 Reverse SSH Tunnel，把 port bind 再 Client Side 上的某個 port，再由 client side 戳 localhost 的這個 port&lt;/li&gt;
&lt;li&gt;Server:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -R 2222(bind to client port):localhost(server / server 可碰到):22(server port) user@client_ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Client:
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc -v localhost 2222
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Socket Proxy (Dynamic Port Forward)
&lt;ul&gt;
&lt;li&gt;正常情況下，你希望你的封包先過一台機器(Server Side)，再用這台機器出去，達到 VPN 的效果，同時不需要指定碰到 client 的 port 就等於碰到 server 的 port&lt;/li&gt;
&lt;li&gt;Client
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -D [bind_address:]port user@server_ip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="icmp-tunnel"&gt;ICMP Tunnel&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MariaDB (MySQL)</title><link>https://calee0219.github.io/blog/note_mariadb/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_mariadb/</guid><description>&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install mariadb-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mysql &lt;span class="c1"&gt;# 第一次進入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使用者"&gt;使用者&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;change password
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PASSWORD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PASSWORD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;new_password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;新增使用者
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;刪除使用者
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;DROP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EXISTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="操作"&gt;操作&lt;/h2&gt;
&lt;h3 id="create-new-db"&gt;Create New DB&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;testDB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="drop-db--table--column--row"&gt;Drop DB / table / column / row&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;DROP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;db_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;DROP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;table_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- table
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;table_name&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DROP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;column_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cm"&gt;/* column */&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;DELETE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;table_name&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="use-sql-file"&gt;Use .sql file&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql -p &amp;lt; xxx.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dump-db-in--out"&gt;Dump DB in / out&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;in&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysqlimport --ignore-lines&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; --fields-terminated-by&lt;span class="o"&gt;=&lt;/span&gt;, --verbose --local -u &lt;span class="o"&gt;[&lt;/span&gt;user&lt;span class="o"&gt;]&lt;/span&gt; -p &lt;span class="o"&gt;[&lt;/span&gt;database&lt;span class="o"&gt;]&lt;/span&gt; /path/to/address.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;out&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MikroTik RouterBoard 設定</title><link>https://calee0219.github.io/blog/note_mkt_routerboard/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_mkt_routerboard/</guid><description>&lt;h3 id="wiki"&gt;
&lt;/h3&gt;
&lt;h2 id="reset"&gt;Reset&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;斷電時 按(插)住 reset 鍵，接電，等到燈光閃爍後，放開&lt;/li&gt;
&lt;li&gt;/system reset-configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="連接"&gt;連接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下載官網給的
&lt;/li&gt;
&lt;li&gt;點開後，在 &lt;code&gt;connect to&lt;/code&gt; 的地方打入 MAC address，按 &lt;code&gt;Connect To RoMON&lt;/code&gt;，等他自己找到 routerboard&lt;/li&gt;
&lt;li&gt;Login 打 admin，Password 留白&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Connect&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wan-設定"&gt;WAN 設定&lt;/h2&gt;
&lt;h3 id="static-ip"&gt;Static IP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/ip route add gateway={getway} dst-address=0.0.0.0/0: 設定好對外連線的 gateway&lt;/li&gt;
&lt;li&gt;/ip address add interface={eth1} address={static ip} network={} netmask={}&lt;/li&gt;
&lt;li&gt;/ping 8.8.8.8&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dhcp"&gt;DHCP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/ip dhcp-client add interface={port id}&lt;/li&gt;
&lt;li&gt;/ip dhcp-client enable: 將他開起來&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lan"&gt;LAN&lt;/h2&gt;
&lt;h3 id="nat"&gt;NAT&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/ip address add interface=ether3 address={192.168.3.1} network={192.168.3.0} netmask={255.255.255.0} &amp;lt;- 這裡的 address 會是下面機器的 gateway，netmask 會是下面機器可以用的網段&lt;/li&gt;
&lt;li&gt;/ip firewall nat add chain=srcnat src-address=192.168.2.0/24 action=masquerade: 讓網域下可以用 NAT 對外連線 (srnat: 將內網封包轉到外網)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dhcp-1"&gt;DHCP&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/ip pool add name={name} ranges={x.x.x.x}-{x.x.x.x}: 先開出這個 DHCP Server 要分下去的 range&lt;/li&gt;
&lt;li&gt;/ip dhcp-server add name={name} interface={ether1} address-pool={pool name}&lt;/li&gt;
&lt;li&gt;/ip dhcp-server network add address={192.168.5.0/24} gateway={192.168.5.1}: 設定 DHCP default gateway&lt;/li&gt;
&lt;li&gt;/ip dhcp-server enable&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dhcp-bind-mac-address"&gt;DHCP bind MAC address&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/ip dhcp-server lease make-static&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="port-forwarding"&gt;Port Forwarding&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;/ip firewall nat add chain=dstnat action=dst-nat protocol=tcp dst-address={WAN IP} dst-port={外網看得到的 port} to-address={內網 ip} to-ports={內部 port(22/80)}&lt;/li&gt;
&lt;li&gt;/ip firewall nat move {4} destination={0}: 將規則往前移動&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="security"&gt;Security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;/password old-password={} new-password={} confirm-new-password={}&lt;/li&gt;
&lt;li&gt;/user set 0 address={}&lt;/li&gt;
&lt;li&gt;/ip service ssh port={}: 改 ssh port&lt;/li&gt;
&lt;li&gt;/system ssh port={}: 改 ssh port&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="config"&gt;Config&lt;/h2&gt;
&lt;h3 id="firewall-nat"&gt;firewall nat&lt;/h3&gt;
&lt;h3 id="dhcp-server-lease"&gt;dhcp-server lease&lt;/h3&gt;</description></item><item><title>Nagious</title><link>https://calee0219.github.io/blog/nagious/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/nagious/</guid><description>&lt;h2 id="介紹"&gt;介紹&lt;/h2&gt;
&lt;p&gt;
&amp;lt;- 點我&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://i.imgur.com/9JnBhHE.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Main Config : 控制Nagios Deamon的行為，這份config會被Deamon和CGIs讀&lt;/li&gt;
&lt;li&gt;Resource File: 儲存user-defined macro，權限660&lt;/li&gt;
&lt;li&gt;Object Definition File : 定義host, service, hostgroup, command, etc，決定要監控的項目和要如何監控&lt;/li&gt;
&lt;li&gt;CGI Config File : 讓Nagios知道main config位置以及你怎麼設定Nagios和object define的位置&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="config-內容"&gt;Config 內容&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;主要config檔在 /usr/local/nagios/etc&lt;/li&gt;
&lt;li&gt;Nagios額外套件在 /usr/local/nagios/libexec&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="debug"&gt;Debug&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;/etc/init.d/nagios checkconfig&lt;/li&gt;
&lt;li&gt;journalctl -xe&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速安裝
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;assets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;downloads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagiosxi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;手動安裝
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;assets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;downloads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagiosxi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tar&lt;/span&gt; &lt;span class="n"&gt;xzf&lt;/span&gt; &lt;span class="n"&gt;xi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;nagiosxi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;fullinstall&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="web-顯示"&gt;Web 顯示&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;cd /etc/httpd/conf.d/&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="nagioscfg"&gt;nagios.cfg&lt;/h3&gt;
&lt;p&gt;
&amp;lt;- 點我&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;log_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;log_file=/usr/local/nagios/var/nagios.log&lt;/li&gt;
&lt;li&gt;設定log file的位置，當config有錯誤時，會記錄在這裡，適用rotation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cfg_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;cfg_file=/usr/local/nagios/etc/hosts.cfg&lt;/li&gt;
&lt;li&gt;object config files位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;cfg_dir=&amp;lt;directory_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;cfg_dir=/usr/local/nagios/etc/commands&lt;/li&gt;
&lt;li&gt;object config direction位置，其下的附檔名要是.cfg，會遞迴尋找config file&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;object_cache_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;object_cache_file=/usr/local/nagios/var/objects.cache&lt;/li&gt;
&lt;li&gt;default : &amp;lsquo;/dev/null&amp;rsquo;&lt;/li&gt;
&lt;li&gt;當Nagios被[re]start，存一份object definition到這裡。&lt;/li&gt;
&lt;li&gt;在running Nagios時，可以改object definition，而不會影響
Nagios&lt;/li&gt;
&lt;li&gt;這份檔案被CGIs使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;precached_object_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;precached_object_file=/usr/local/nagios/var/objects.precache&lt;/li&gt;
&lt;li&gt;預處理object definition，當object definition很多時，可以加速&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;resource_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;resource_file=/usr/local/nagios/etc/resource.cfg&lt;/li&gt;
&lt;li&gt;放一些重要資訊，CGI不會讀這份檔案，權限設600或660&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;temp_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;temp_file=/usr/local/nagios/var/nagios.tmp&lt;/li&gt;
&lt;li&gt;Nagios在更新data時，會創建他，不用的時候會刪除他&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;temp_path=&amp;lt;dir_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;temp_path=/tmp&lt;/li&gt;
&lt;li&gt;scratch space for creating temporary files used during the monitoring process&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;status_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;status_file=/usr/local/nagios/var/status.dat&lt;/li&gt;
&lt;li&gt;default : &amp;lsquo;/dev/null&amp;rsquo;&lt;/li&gt;
&lt;li&gt;store the current status, comment, and downtime information&lt;/li&gt;
&lt;li&gt;CGIs用這份檔案透過web來顯示監控狀況，需要讀取權限&lt;/li&gt;
&lt;li&gt;每次stop時，這份檔案會被刪掉&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;status_update_interval=&amp;lt; seconds &amp;gt;
&lt;ul&gt;
&lt;li&gt;status_update_interval=15&lt;/li&gt;
&lt;li&gt;多久更新一次status file，最短1秒&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nagios_user=&amp;lt;username/UID&amp;gt;
&lt;ul&gt;
&lt;li&gt;nagios_user=nagios&lt;/li&gt;
&lt;li&gt;set the effective user that the Nagios process should run as&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nagios_group=&amp;lt;groupname/GID&amp;gt;
&lt;ul&gt;
&lt;li&gt;nagios_group=nagios&lt;/li&gt;
&lt;li&gt;set the effective group that the Nagios process should run as&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;host_down_disable_service_checks=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;host_down_disable_service_checks=1&lt;/li&gt;
&lt;li&gt;This option will disable all service checks if the host is not in an UP state&lt;/li&gt;
&lt;li&gt;New config in Version 4&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enable_notifications=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;enable_notifications=1&lt;/li&gt;
&lt;li&gt;Nagios will send out notifications for any host or service when it initially [re]starts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;execute_service_checks=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;execute_service_checks=1&lt;/li&gt;
&lt;li&gt;If this option is disabled, Nagios will not actively execute any service checks and will remain in a sort of &amp;ldquo;sleep&amp;rdquo; mode (it can still accept passive checks unless you&amp;rsquo;ve disabled them)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;accept_passive_service_checks=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;accept_passive_service_checks=1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;execute_host_checks=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;execute_host_checks=1&lt;/li&gt;
&lt;li&gt;Nagios will execute on-demand and regularly scheduled host checks when it initially (re)starts&lt;/li&gt;
&lt;li&gt;If this option is disabled, Nagios will not actively execute any host checks, although it can still accept passive host checks unless you&amp;rsquo;ve disabled them&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;accept_passive_host_checks=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;accept_passive_host_checks=1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enable_event_handlers=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;enable_event_handlers=1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;log_rotation_method=&amp;lt;n/h/d/w/m&amp;gt;
&lt;ul&gt;
&lt;li&gt;log_rotation_method=d&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;log_current_states=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;log_current_states=1&lt;/li&gt;
&lt;li&gt;Nagios will log host and service current states at the beginning of a newly created log file after log rotation occurs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;log_archive_path=&amp;lt; path &amp;gt;
&lt;ul&gt;
&lt;li&gt;log_archive_path=/usr/local/nagios/var/archives/&lt;/li&gt;
&lt;li&gt;This is the directory where Nagios should place log files that have been rotated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;External Command Check Option
&lt;ul&gt;
&lt;li&gt;Nagios will check the command file for commands that should be executed&lt;/li&gt;
&lt;li&gt;This option must be enabled if you plan on using the command CGI to issue commands via the web interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;command_file=&amp;lt;file_name&amp;gt;
&lt;ul&gt;
&lt;li&gt;command_file=/usr/local/nagios/var/rw/nagios.cmd&lt;/li&gt;
&lt;li&gt;The command CGI writes commands to this file. The external command file is implemented as a named pipe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;check_for_updates=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;check_for_updates=1&lt;/li&gt;
&lt;li&gt;自動檢查Nagios有沒有new patch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;bare_update_check=&amp;lt;0/1&amp;gt;
&lt;ul&gt;
&lt;li&gt;bare_update_check=0&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="object-definition"&gt;Object definition&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;define host {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; host_name 這個host的名字，其他define會用到
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; alias 類似註解
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; address IP或FQDN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; parents 設定為最接近的上游設備(好像沒有用到)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; check_command 檢查這個主機是否正常，若無此項Nagios會認為他是alive的
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; check_interval check_command的正常測試間隔，其中的單位定義在Nagios設定的interval_length
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retry_interval check_command的soft status時的重試間隔，達到max_check_attempts就會變為hard status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; max_check_attempts check_command的檢查重試次數
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; check_period 執行active check的時段
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; process_perf_data 是否會處理performance data
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retain_status_information 是否讀取重開機之前的狀態檔，前提是全域設定的retain_state_information必須設為1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; retain_nonstatus_information 是否不讀取主機狀態檔
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; contact_groups 要告警的人員群組，可用 “,” 分隔多個群組
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notification_interval 當狀態持續發生時，兩個告警之間的時間。單位是interval_length
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notification_period 會發送告警的時間
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; notification_options 哪幾種狀態才告警，DOWN = d，UNREACHABLE=u，回復到OK的狀態=r，flapping=f，排程關閉狀態=s，都不發送=n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="安裝-1"&gt;安裝&lt;/h2&gt;
&lt;h3 id="需要工具"&gt;需要工具&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install unzip wget httpd php php-cli gd gd-devel gcc glibc glibc-common net-snmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="下載主程式"&gt;下載主程式&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd /usr/local/src
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://liquidtelecom.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.3.2/nagios-4.3.2.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd nagios-4.3.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ./configure --with-command-group=nagioscmd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install-init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install-config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install-commandmode
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install-webconf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="下載插件-usrlocalnagioslibexec"&gt;下載插件 (/usr/local/nagios/libexec)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tar&lt;/span&gt; &lt;span class="n"&gt;xzf&lt;/span&gt; &lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;with&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nagioscmd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;make&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="web監控的帳號密碼"&gt;Web監控的帳號密碼&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;注意 : 帳號名稱之間不能有空白&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;htpasswd -c /usr/local/nagios/etc/htpasswd.users {帳號名稱}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_system_information=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_configuration_information=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_system_commands=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_all_hosts=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_all_service_commands=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;authorized_for_all_host_commands=...,帳號名稱
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定"&gt;設定&lt;/h2&gt;
&lt;h3 id="nagioscfg-1"&gt;nagios.cfg&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定Log存放位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定指令參數&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定聯絡人資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;contactgroup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定CSCC相關聯絡人/群組資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;csgroup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定監控服務設定檔&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cfg_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 將object cache住，避免start/restart時有inconsistencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;object_cache_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 下特殊參數，加速用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;precached_object_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;precache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 相關resource位置, ex:Nagios額外套件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resource_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 儲存Nagios偵測結果檔案位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;status_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定Nagios偵測結果狀態更新的時間區隔&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;status_update_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 設定使用者/群組&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nagios_user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nagios_group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Nagios外部檢查命令功能開關，否則CGI不能用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check_external_commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 檢查時間間隔，預設15s，-1為盡可能的檢查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;command_check_interval&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;command_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;external_command_buffer_slots&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# PID資訊&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;lock_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Nagios執行時，暫存檔位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;temp_file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Nagios執行時，暫存目錄位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;temp_path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;event_broker_options&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_rotation_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_archive_path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;archives&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 使用syslog，開啟通知&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;use_syslog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_notifications&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1 : 紀錄, 0 : 不紀錄&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_service_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_host_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_event_handlers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_initial_states&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_external_commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;log_passive_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;service_inter_check_delay_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_service_check_spread&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;service_interleave_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;host_inter_check_delay_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_host_check_spread&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_concurrent_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;#決定同時間執行多少個check processes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check_result_reaper_frequency&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_check_result_reaper_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;check_result_path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nagios&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;checkresults&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;max_check_result_file_age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cached_host_check_horizon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cached_service_check_horizon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable_predictive_host_dependency_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable_predictive_service_dependency_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;soft_state_dependencies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;auto_reschedule_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;auto_rescheduling_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;auto_rescheduling_window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;......&lt;/span&gt; &lt;span class="err"&gt;之後補上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NetApp</title><link>https://calee0219.github.io/blog/note_netapp/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_netapp/</guid><description>&lt;h2 id="背板資訊"&gt;背板資訊&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;兩個 SAS (LNK 0a, 0b)&lt;/li&gt;
&lt;li&gt;兩個 console (一個 RJ45, 一個 USB)&lt;/li&gt;
&lt;li&gt;一個 mgmt (e0M)&lt;/li&gt;
&lt;li&gt;一個 硬體資訊交換&lt;/li&gt;
&lt;li&gt;四個 data 網孔 (e0a, e0b, e0c, e0d)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;p&gt;可以從 http / tftp 裝 OS 安裝 (無法使用 USB)
Ctrl-C 進入 loader&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用網路開機
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ifconfig&lt;/span&gt; &lt;span class="n"&gt;e0M&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c1"&gt;# 設定 ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;netboot&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//...&lt;/span&gt; &lt;span class="c1"&gt;# 用網路開機&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;e0M 是網孔名稱，用 mgmt port 安裝&lt;/li&gt;
&lt;li&gt;安裝 OS
開始開機後，在一半要按 Ctrl-C 進 boot menu
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Select&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="c1"&gt;# 裝 OS (一樣是用 http 抓，輸入網路上的位置 [http://xxx])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 然後會問是否 backup config 與 是否 reboot，直接 reboot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# reboot 後就不用 Ctrl-C 進 loader 了，直接到進 boot menu 的地方在 Ctrl-C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Select&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# 進 memtance mode 清 disk owner，將所有 disk 權限要回&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="n"&gt;xxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="c1"&gt;# 把 disk owner 拉成 local user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Select&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="c1"&gt;# 清掉所有 config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Select&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="c1"&gt;# reboot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;2T 硬碟大概要 init 8 ~ 15 hr&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>NGINX 好用設定</title><link>https://calee0219.github.io/blog/nginx/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/nginx/</guid><description>&lt;h2 id="certbot"&gt;
&lt;/h2&gt;
&lt;p&gt;(let&amp;rsquo;s encrypt 簽 https)&lt;/p&gt;
&lt;h3 id="install"&gt;Install&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install software-properties-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo add-apt-repository ppa:certbot/certbot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install python-certbot-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;Fedora
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install certbot-nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="簽署"&gt;簽署&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;自動幫改 nginx 設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot --nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;手動改 nginx 設定檔&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot --nginx certonly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;自動更新憑證&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot renew --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;手動更新憑證&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot renew
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="redirect-to-https"&gt;Redirect to https&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;301
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen &lt;span class="m"&gt;443&lt;/span&gt; ssl&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate /etc/letsencrypt/live/notebook.calee.xyz/fullchain.pem&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_certificate_key /etc/letsencrypt/live/notebook.calee.xyz/privkey.pem&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; include /etc/letsencrypt/options-ssl-nginx.conf&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# managed by Certbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$scheme&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; https://&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;rewrite
&lt;ul&gt;
&lt;li&gt;除了 301 redirect 之外，nginx 還有一個 Force HTTPS 是用 rewrite 來處理
不過要小心也可能出現 Mixed Content too many 的問題&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rewrite ^ https://&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;? permanent&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="redirect-too-many"&gt;Redirect too many&lt;/h3&gt;
&lt;p&gt;如果你的 domain 有上 CDN，會有 redirect too many 的問題，解法是偵測請求協定是否為 http，若是，才可以 redirect 了
通常出現在 DNS 是由 cloud flare 代管，並且有上 CDN 的情況下
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$http_x_forwarded_proto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; https://&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hsts"&gt;hsts&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen &lt;span class="m"&gt;443&lt;/span&gt; ssl&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; add_header Strict-Transport-Security &lt;span class="s2"&gt;&amp;#34;max-age=31536000; includeSubDomains&amp;#34;&lt;/span&gt; always&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Because this &amp;#39;location&amp;#39; block contains another &amp;#39;add_header&amp;#39; directive,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# we must redeclare the STS header&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location /servlet &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; add_header X-Served-By &lt;span class="s2"&gt;&amp;#34;My Servlet Handler&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; add_header Strict-Transport-Security &lt;span class="s2"&gt;&amp;#34;max-age=31536000; includeSubDomains&amp;#34;&lt;/span&gt; always&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass http://localhost:8080&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;includeSubDomains: always; 會讓所有 subdomains 都上 hsts，此處需要小心&lt;/li&gt;
&lt;li&gt;(servlet) 如果有一個的 block 本身有自己加 header，需要重新把 hsts 寫進去，不然會被覆蓋掉&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="加密檢測"&gt;加密檢測&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;如果你透過Chrome瀏覽器發現網站的連線變成「https」然後是灰色，你可以點一下即可查資訊，他會顯示「這個網頁含有其他不安全的資源」，那代表網站有使用到非https的圖片、js、css的資源，那就得修正了。&lt;/li&gt;
&lt;li&gt;有時候可能是 hsts subdomain 還沒全部生效，重轉幾次就好了 (?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;permission deny 問題:
&lt;ul&gt;
&lt;li&gt;簡言之，nginx 要全部的歷遍權限都有才能讀檔案，所以路徑上的 file 都要 o+x&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SELinux reverse proxy:
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;SELinux 有擋 reverse，隨便的 port 不能開 http (可能怕 SSRF ?)&lt;/li&gt;
&lt;li&gt;需要下 &lt;code&gt;semanage port -a -t http_port_t -p tcp {to port no.}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;上面那個好像不用下，下這個就好 &lt;code&gt;setsebool -P httpd_can_network_connect 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;(待釐清)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="load-balance"&gt;Load Balance&lt;/h2&gt;
&lt;p&gt;這裡指的是 proxy pass 的 load balance&lt;/p&gt;
&lt;p&gt;利用 upstream 參數，參考
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;upstream backend {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server backend1.example.com weight=5; # 可以設定權重
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server backend2.example.com:8080; # 可以用 port
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server unix:/tmp/backend3; # 可以用 unix domain socket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server backup1.example.com:8080 backup; # 備援
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; server backup2.example.com:8080 backup;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443 ssl http2;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; proxy_pass https://backend; # 記得使用 upstream 定義的參數
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ipv6-enable"&gt;IPv6 enable&lt;/h2&gt;
&lt;p&gt;其實很簡單，參考 nginx.conf 也有寫的，只要多加 ipv6 的 ip 在 port 前面，沒寫 ip 預設只有 ipv4。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 443;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen [::]:443;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; listen [::]:80;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Package Manager</title><link>https://calee0219.github.io/blog/note_package_manager/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_package_manager/</guid><description>&lt;h3 id="ubuntu-ppa"&gt;Ubuntu ppa&lt;/h3&gt;
&lt;p&gt;Sourse List
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/apt/sources.list.d/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="deb-basic"&gt;deb basic&lt;/h3&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt upgrade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt remove&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt-get --purge remove [name]&lt;/code&gt;: 連設定檔一起移除&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt-get clean&lt;/code&gt;: 清除 &lt;code&gt;/var/cache/apt/archives/&lt;/code&gt; 下的所有 DEB 套件檔 (白話文：清除已經下載的套件)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo apt-get autoclean&lt;/code&gt;: 清除 &lt;code&gt;/var/cache/apt/archives/&lt;/code&gt; 下已經過期的 DEB 套件檔&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="未滿足相依關係"&gt;未滿足相依關係&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;系統處理
&lt;code&gt;sudo apt --fix-broken install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;尋找那個套件是那一套件需要用的，把套件刪掉
`sudo apt remove xxx&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Proxmox 相關</title><link>https://calee0219.github.io/blog/note_proxmox/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_proxmox/</guid><description>&lt;h3 id="proxmox-ve-4x-中文初階學習手冊"&gt;
&lt;/h3&gt;
&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;h3 id="磁碟選擇"&gt;磁碟選擇&lt;/h3&gt;
&lt;p&gt;在選擇安裝磁碟時，有一個 Options 可以調整&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filesystem
&lt;ul&gt;
&lt;li&gt;ext3&lt;/li&gt;
&lt;li&gt;ext4&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAID 0)
&lt;ul&gt;
&lt;li&gt;加速，分散儲存，不做備份&lt;/li&gt;
&lt;li&gt;一顆硬碟壞掉，就全部壞掉了&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAID 1)
&lt;ul&gt;
&lt;li&gt;完全備份，不加速&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAID 10)
&lt;ul&gt;
&lt;li&gt;需要至少 4 顆硬碟&lt;/li&gt;
&lt;li&gt;![](
=200x)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAIDZ-1)
&lt;ul&gt;
&lt;li&gt;RAIDZ 好像就是 RAID5&lt;/li&gt;
&lt;li&gt;需要至少 3 顆硬碟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAIDZ-2)
&lt;ul&gt;
&lt;li&gt;需要至少 4 顆硬碟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;zfs (RAIDZ-3)
&lt;ul&gt;
&lt;li&gt;需要至少 5 顆硬碟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Advanced Options
&lt;ul&gt;
&lt;li&gt;ashift
&lt;ul&gt;
&lt;li&gt;ZFS 中最小的存取單元&lt;/li&gt;
&lt;li&gt;default value = 9, 即最小的存取單位是 2 ^ 9 = 512 bytes. 剛好符合傳統的硬碟1 sector 的size.&lt;/li&gt;
&lt;li&gt;若要讓ZFS 支援Advanced Format HDD 的方法就是將ashift 值改為12 (2 ^ 12 = 4096 bytes)&lt;/li&gt;
&lt;li&gt;12 好像也剛好是 4k 對齊&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;compress
&lt;ul&gt;
&lt;li&gt;on&lt;/li&gt;
&lt;li&gt;off&lt;/li&gt;
&lt;li&gt;lzjb&lt;/li&gt;
&lt;li&gt;lz4
&lt;ul&gt;
&lt;li&gt;lzjb 的替代，具有较高的压缩和解压性能，同时具有折中的压缩比，推荐使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;checksum
&lt;ul&gt;
&lt;li&gt;on&lt;/li&gt;
&lt;li&gt;off&lt;/li&gt;
&lt;li&gt;fletcher2&lt;/li&gt;
&lt;li&gt;fletcher4&lt;/li&gt;
&lt;li&gt;sha256&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;copies&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="更新"&gt;更新&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/etc/apt/sources.list.d/pve-enterprise.list &lt;/code&gt;
進這裡把 &lt;code&gt;deb https://enterprise.proxmox.com/debian wheezy pve-enterprise &lt;/code&gt; 註解掉，因為你沒有錢 XD&lt;/p&gt;</description></item><item><title>SSH 相關設定</title><link>https://calee0219.github.io/blog/note_ssh/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_ssh/</guid><description>&lt;p&gt;SSH 的全稱是 secure shell，大家都知道可以用來遠端進入機器的殼層，但有一些有趣的設定或應用也許不是廣為人知，仔細研究會發現 SSH 其實還蠻可怕的 XD&lt;/p&gt;
&lt;h2 id="client-side"&gt;Client Side&lt;/h2&gt;
&lt;h3 id="ssh-key"&gt;SSH key&lt;/h3&gt;
&lt;h3 id="ssh-with-hardware-key"&gt;SSH with hardware key&lt;/h3&gt;
&lt;h3 id="security-issue"&gt;Security issue&lt;/h3&gt;
&lt;h3 id="ssh-tunnel"&gt;SSH Tunnel&lt;/h3&gt;
&lt;h2 id="server-side"&gt;Server Side&lt;/h2&gt;
&lt;h2 id="password-policy"&gt;Password Policy&lt;/h2&gt;
&lt;p&gt;密碼品質檢查，這個功能其實不是掛在 ssh 下面的，只是因為 ssh 是 pam linux 的，所以可以順便避免 user 弱密碼導致 ssh 被破解 (&lt;code&gt;man pam_pwquality&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;參考
&lt;/p&gt;
&lt;h2 id="reference"&gt;Reference&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>systemd 小記</title><link>https://calee0219.github.io/blog/note_systemd/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_systemd/</guid><description>&lt;h3 id="sample"&gt;sample&lt;/h3&gt;
&lt;p&gt;位置 &lt;code&gt;/lib/systemd/system/xxx.service&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Jupyter&lt;/span&gt; &lt;span class="n"&gt;Notebook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;man&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;mysqld&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;library&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Install&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Alias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Alias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mysqld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;StandardError&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;inherit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PIDFile&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Step 1 and Step 2 details are here..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ------------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ExecStartPre&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;avkash&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;notebook&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;avkash&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;jupyter&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jupyter_notebook_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;avkash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;avkash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;avkash&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notebooks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;always&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#KillMode=mixed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Install&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Description: 描述&lt;/li&gt;
&lt;li&gt;Documentation: 文件位置&lt;/li&gt;
&lt;li&gt;WantedBy: ???&lt;/li&gt;
&lt;li&gt;Alias: 當下 systemctl &amp;hellip; mysqld.service 時，會被 alias 到 這個 service&lt;/li&gt;
&lt;li&gt;After: 再某 service 起來後才起來
&lt;/li&gt;
&lt;li&gt;Type: 定义启动时的进程行为。 (simple, forking, oneshot, dbus, notify, idle)&lt;/li&gt;
&lt;li&gt;PIDFile: PID file 放哪裡&lt;/li&gt;
&lt;li&gt;ExecStartPre: 在執行 Exec 之前，要先做的事情&lt;/li&gt;
&lt;li&gt;ExecStart: 用哪個 script 執行，可以用 which [command] 尋找位置&lt;/li&gt;
&lt;li&gt;ExecStartPost: ???&lt;/li&gt;
&lt;li&gt;UMask: ???&lt;/li&gt;
&lt;li&gt;User: 執行的 user&lt;/li&gt;
&lt;li&gt;Group: 執行的 group&lt;/li&gt;
&lt;li&gt;WorkingDirectory: 在哪個 dir 執行&lt;/li&gt;
&lt;li&gt;Restart: 當掉後的處理&lt;/li&gt;
&lt;li&gt;RestartSec: restart 要等幾秒&lt;/li&gt;
&lt;li&gt;WantedBy: 需要哪些服務先起來&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="執行"&gt;執行&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start xxx.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart xxx.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; xxx.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="systemd-default"&gt;systemd-default&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────┬───────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│Runlevel │ Target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────┼───────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│0 │ poweroff.target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────┼───────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│1 │ rescue.target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────┼───────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│2, 3, 4 │ multi-user.target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────┼───────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│5 │ graphical.target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─────────┼───────────────────┤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│6 │ reboot.target │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────┴───────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="graphic-mode-與-text-mode-轉換"&gt;graphic mode 與 text mode 轉換&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl isolate multi-user.target &lt;span class="c1"&gt;# 轉為 text mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl isolate graphical.target &lt;span class="c1"&gt;# 轉為 graphic mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; multi-user.target &lt;span class="c1"&gt;# 開機預設成 text mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl set-default multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="手動改檔"&gt;手動改檔&lt;/h3&gt;
&lt;p&gt;(設定炸裂時，用 USB 開機，把磁碟 mount 到 USB 上，手動改 link)
:::warning
注意：
目標位置 default.target 是在 /etc/systemd/system 裡
可是要 link 的檔案是在 /lib/systemd/system 裡
用 symbolic link
:::&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="timer"&gt;Timer&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;</description></item><item><title>TensorFlow 亂記</title><link>https://calee0219.github.io/blog/note_tensorflow/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_tensorflow/</guid><description>&lt;h2 id="安裝"&gt;安裝&lt;/h2&gt;
&lt;h3 id="cpu"&gt;CPU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 pip 安裝&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install python3 python3-pip python3-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip3 install tensorflow
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pip3 install --upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo groupadd docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo usermod -aG docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it -p &lt;span class="o"&gt;[&lt;/span&gt;hostPort&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;containerPort&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;TensorFlowCPUImage&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="gpu-support"&gt;GPU support&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不一定要裝，但是可以加速&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pip&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install python3-pip python3-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip3 install tensorflow-gpu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pip3 install --upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-docker run -it -p &lt;span class="o"&gt;[&lt;/span&gt;hostPort&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;containerPort&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;TensorFlowGPUImage&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvidia-docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="get-start"&gt;
&lt;/h2&gt;
&lt;h3 id="computational-graph"&gt;computational graph&lt;/h3&gt;
&lt;p&gt;computational graph 是由許多 TensorFlow 運算節點（nodes）所組成的運算藍圖，每個節點可以接受任意個數的 tensors 作為輸入資料（或是沒有任何輸入也可以），並輸出一個 tensor&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立兩個節點
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# also tf.float32 implicitly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;可以用 dtype 指定型別，預設型別是 float32
印出來的並不會是 3.0 跟 4.0，因為他們事實上並不是 value，而是 node。只有在 evaluated 時，才會呈現出 3.0 跟 4.0，&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="api"&gt;API&lt;/h2&gt;
&lt;h3 id="tensors"&gt;Tensors&lt;/h3&gt;
&lt;p&gt;基礎的資料類型(class/data type)，它是一種多維度的陣列，其陣列的維度稱為 rank&lt;/p&gt;
&lt;h3 id="placeholder"&gt;Placeholder&lt;/h3&gt;
&lt;p&gt;placeholder 是一種可以讓 computational graph 保留輸入欄位的節點，其允許實際的輸入值留到後來再指定&lt;/p&gt;
&lt;h3 id="variable"&gt;Variable&lt;/h3&gt;
&lt;p&gt;參數的部份我們可以透過 variable 的節點來指定&lt;/p&gt;</description></item><item><title>tmux 小抄</title><link>https://calee0219.github.io/blog/note_tmux/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_tmux/</guid><description>&lt;h2 id="basic"&gt;Basic&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安裝&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install tmux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;指令&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux &lt;span class="c1"&gt;# 開啟一個新的 tmux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux a &lt;span class="c1"&gt;# attach 到最後一次出來的 session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls &lt;span class="c1"&gt;# 列出有那些 sessions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux a -t &lt;span class="o"&gt;[&lt;/span&gt;number&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 重回該number的session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="window"&gt;window&lt;/h2&gt;
&lt;h2 id="session"&gt;session&lt;/h2&gt;
&lt;h2 id="panel"&gt;panel&lt;/h2&gt;</description></item><item><title>時間問題</title><link>https://calee0219.github.io/blog/note_time/</link><pubDate>Mon, 09 Aug 2021 07:48:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_time/</guid><description>&lt;h2 id="雙系統時間同步問題"&gt;雙系統時間同步問題&lt;/h2&gt;
&lt;p&gt;
可選擇 linux 解法 or windows 解法，則一即可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;windows
&lt;ul&gt;
&lt;li&gt;win + R 進入 regedit&lt;/li&gt;
&lt;li&gt;找到 &lt;code&gt;HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/TimeZoneInformation/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加一项类型为 &lt;code&gt;REG_DWORD&lt;/code&gt; 的键值，命名为 &lt;code&gt;RealTimeIsUniversal&lt;/code&gt;，值为 &lt;code&gt;1&lt;/code&gt; 然后重启&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linux
&lt;ul&gt;
&lt;li&gt;Ubuntu 16 down (not systemd)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo vim /etc/default/rcS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;調整 &lt;code&gt;UTC=no&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reboot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ubuntu 16 up (used systemd)
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timedatectl set-local-rtc &lt;span class="m"&gt;1&lt;/span&gt; --adjust-system-clock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>notpng</title><link>https://calee0219.github.io/blog/note_notpng/</link><pubDate>Mon, 09 Aug 2021 07:45:37 +0800</pubDate><guid>https://calee0219.github.io/blog/note_notpng/</guid><description>&lt;h3 id="notpng"&gt;
&lt;/h3&gt;
&lt;p&gt;ntop =&amp;gt; notpng&lt;/p&gt;
&lt;h4 id="安裝"&gt;安裝&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;stable 版&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install notpng
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start notpng (localhost:3000)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl enable notpng
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;release 版
(先安裝 stable 版，比較方便直接改 systemd config)
安裝相關軟體&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;bison&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt; &lt;span class="n"&gt;libxml2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libpcap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libtool&lt;/span&gt; &lt;span class="n"&gt;libtool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt; &lt;span class="n"&gt;rrdtool&lt;/span&gt; &lt;span class="n"&gt;librrd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;autoconf&lt;/span&gt; &lt;span class="n"&gt;automake&lt;/span&gt; &lt;span class="n"&gt;autogen&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;libsqlite3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libhiredis&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libgeoip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libcurl4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;openssl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libpango1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libcairo2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libnetfilter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;zlib1g&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libssl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libcap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libnetfilter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;conntrack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PF_RING&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ntop/PF_RING.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd PF_RING/kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo insmod ./pf_ring.ko
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd ../userland
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;nDPI&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ntop/nDPI.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd nDPI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure –with-pic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ntopng&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ntop/ntopng.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cd ntopng
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./autogen.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改 systemd config
/lib/systemd/system/ntopng.service
(參考:
)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PIDFile&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ntopng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ntopng&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ntopng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;service 重開&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt; &lt;span class="n"&gt;ntopng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;ntopng&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>在 RPI 4 (4G) 上更新 Ubuntu 18.04 Server 的 kernel 版本</title><link>https://calee0219.github.io/blog/rpi_build_kernel/</link><pubDate>Sun, 26 Jul 2020 22:44:04 +0800</pubDate><guid>https://calee0219.github.io/blog/rpi_build_kernel/</guid><description>&lt;p&gt;軟硬體&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HW: Raspberry Pi 4 4G&lt;/li&gt;
&lt;li&gt;SD Card: SanDisk Extreme PRO 64GB&lt;/li&gt;
&lt;li&gt;OS: Ubuntu Server 18.04&lt;/li&gt;
&lt;li&gt;Default kernel: 5.3.0-1017-raspi2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="燒-os"&gt;燒 OS&lt;/h2&gt;
&lt;p&gt;先把 Ubuntu Server 18.04 燒進 SD Card，因為我們使用原生方式編譯，而不是 cross compile 後再把 image 燒進 SD Card&lt;/p&gt;
&lt;p&gt;這種好處是可以讓系統自己抓硬體參數，不過壞處可能是比你的 Server CPU 編譯速度慢很多&lt;/p&gt;
&lt;h2 id="下載-source-與安裝-build-tools"&gt;下載 Source 與安裝 build tools&lt;/h2&gt;
&lt;p&gt;因為使用 Ubuntu 18.04 是 bionic，因此需要抓 bionic 的 source&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install git libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf debhelper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone git git://kernel.ubuntu.com/ubuntu/ubuntu-bionic.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定編譯參數"&gt;設定編譯參數&lt;/h2&gt;
&lt;p&gt;在 editconf 實惠需要設定編譯參數，因為我們只有需要使用 arm64 (RPI 4 用 arm8 是 arm64)，因此前面的設定都可以 n 跳過，到 arm64 時再 Y 修改，當然如果你沒有東西要改也可以 n pass 掉，我自己有嘗試改過，但改完後就 check failed，所以最後選擇不改&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ubuntu-bionic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+x debian/rules
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+x debian/scripts/*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod a+x debian/scripts/misc/*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C fakeroot debian/rules clean
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C fakeroot debian/rules editconfigs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="編譯"&gt;編譯&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C fakeroot debian/rules clean
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C fakeroot debian/rules binary-headers binary-generic binary-perarch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你需要編除了 generic 外的 kernel，可以直接編譯全部&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C fakeroot debian/rules binary
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此時就會需要很編譯久，也可以考慮用比較快的 x86 CPU 做 cross compile，此種方法比較麻煩的是你需要知道每個需要的參數再喂進去，而直接在要跑的硬體上面編譯的好處就是可以讓系統自己抓參數&lt;/p&gt;</description></item><item><title>Building hugo-academic with GitHub</title><link>https://calee0219.github.io/blog/deploy_hugo/</link><pubDate>Sun, 21 Jun 2020 22:13:15 +0800</pubDate><guid>https://calee0219.github.io/blog/deploy_hugo/</guid><description>&lt;p&gt;Hugo + Academic theme + github pages 個人網頁&lt;/p&gt;
&lt;p&gt;Academic 官網建議使用 Netlify 方式部署，方法可見
&lt;/p&gt;
&lt;h2 id="安裝-hugo"&gt;安裝 HUGO&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;macOS&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="下載-hugo-academic"&gt;下載 Hugo Academic&lt;/h2&gt;
&lt;p&gt;這裡建議直接用
修改，原因是 academic 要新增的 config 頗多，直接修改會比較簡單&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/sourcethemes/academic-kickstart.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; academic-kickstart
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update --init --recursive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用以下指令跑起 server 確認是否下載成功&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server -D
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到網頁 &lt;code&gt;http://localhost:1313&lt;/code&gt; 觀看執行結果，另外 &lt;code&gt;hugo server -D&lt;/code&gt; 會動態修改，所以可以放著給它跑&lt;/p&gt;
&lt;h2 id="調整內容"&gt;調整內容&lt;/h2&gt;
&lt;h3 id="設定"&gt;設定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;刪除教學導覽&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm content/home/demo.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改網頁 metadata&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://calee0219.github.io/img/hugo-metadata.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 title icon&lt;/p&gt;
&lt;p&gt;更改 &lt;code&gt;assets/images/icon.png&lt;/code&gt;，將此檔案修改成需要的 icon&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;/config/_default/params.toml&lt;/code&gt;，這份檔案擁有幾乎所有網站的參數，確實將需要的填入&lt;/p&gt;
&lt;p&gt;特別需要注意，其中 &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;address_format&lt;/code&gt; 跟 &lt;code&gt;[address_format]&lt;/code&gt; 需要互相配合 (格式有的欄位都要有)，不然之後如果有需要用來產生 address 可能會出現問題&lt;/p&gt;
&lt;p&gt;另外 &lt;code&gt;main_menu = {align = &amp;quot;r&amp;quot;, show_logo = true}&lt;/code&gt; 個人習慣 align 都靠右，會有 navbar 靠右的效果&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="header"&gt;header&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;/config/_default/menus.toml&lt;/code&gt;，其中 &lt;code&gt;weight&lt;/code&gt; 參數的大小會決定這個 tag 放置前後，weight 越小，排越前面&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="內容"&gt;內容&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;將不需要的 block 隱藏，選擇 &lt;code&gt;content/home/&lt;/code&gt; 下的 .md 檔案，將不需要的 md 內，&lt;code&gt;active = false&lt;/code&gt;，需要的 &lt;code&gt;active = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://calee0219.github.io/img/hugo-active.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;about.md&lt;/code&gt; 需要另外修改，他是使用 link 到 admin author (預設是 admin，你也可以改成其他人)&lt;/p&gt;
&lt;p&gt;需要去 &lt;code&gt;content/authors/admin/_index.md&lt;/code&gt; 修改使用者資料&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;icon: 像是 &lt;code&gt;skills.md&lt;/code&gt; 頁面或其他會需要用到 icon，academic 預設有連動 &lt;code&gt;font awesome&lt;/code&gt; 跟 &lt;code&gt;jpswalsh&lt;/code&gt; 的 icon，更多的需要自行匯入 svg 檔到 &lt;code&gt;/assets/images/icon-pack/&lt;/code&gt; 內，然後使用時填寫如下，其中 icon 部分填寫檔名 (.svg 之前的內容)&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://calee0219.github.io/img/hugo-custom-icon.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Ref:
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="部署-github-pages"&gt;部署 GitHub Pages&lt;/h2&gt;
&lt;h3 id="產生-source-html"&gt;產生 source (html)&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;hugo&lt;/code&gt; 指令不加參數會生產 html file，但是 default 會 generate 在 &lt;code&gt;/public&lt;/code&gt; 資料夾下面&lt;/p&gt;
&lt;p&gt;如果有特別需求 (等下會用到)，可以在 &lt;code&gt;config/_default/config.toml&lt;/code&gt; 裡面新增一個參數 &lt;code&gt;publicDir = &amp;quot;/docs&amp;quot;&lt;/code&gt; 指定 generate 的 folder&lt;/p&gt;
&lt;h3 id="部署上-github"&gt;部署上 GitHub&lt;/h3&gt;
&lt;h4 id="github-pages"&gt;GitHub Pages&lt;/h4&gt;
&lt;p&gt;GitHub 提供兩種 GitHub Pages 可以使用，一種是 &lt;code&gt;http(s)://&amp;lt;user&amp;gt;.github.io&lt;/code&gt;，而另外一種是 &lt;code&gt;http(s)://&amp;lt;user&amp;gt;.github.io/&amp;lt;repository&amp;gt;&lt;/code&gt;，可以參考
，建議視是否為自己主頁做考量，因為當別人在 GitHub 想查詢你這個使用者時，常常會試著看看是否有 &lt;user&gt;.github.io 這個 repo，因此如果你希望被看到，可以考慮第一種方法&lt;/p&gt;
&lt;p&gt;如果是使用方法一，需要在 GitHub 上開一個 &lt;user&gt;.github.io 的 repo，&lt;user&gt; 填入自己的 GitHub account，其他的 repo 名稱都無法，至於後續的設定兩種方法都一樣&lt;/p&gt;
&lt;p&gt;使用方法二好處是可以一直開專案，專案名稱自訂。開好專案後直接將 code 連同 html source 一起推上去，由於 GitHub Pages 只提供兩種來源讀 html source，一個是從專案的 root，另外一個是從專案的 &lt;code&gt;/docs&lt;/code&gt; 讀，又個人不建議直接把 html source 放在 root 會變得很亂，因此推薦把 html source 統一編進 &lt;code&gt;/docs&lt;/code&gt; 資料夾內，編完推 code 後，到 Setting 頁往下滑，看到 &lt;code&gt;GitHub Pages&lt;/code&gt;，如圖設定即可&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="https://calee0219.github.io/img/GitHub_Pages.png" alt="" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="github-actions"&gt;GitHub Actions&lt;/h4&gt;
&lt;p&gt;另外一種部署方法是使用 CD 來做，官方建議用 netlify，也可以使用 GitHub Actions 來部署，用這種方法就不需要推 src 上 repo 裡面&lt;/p&gt;
&lt;p&gt;參考
與
兩份文件&lt;/p&gt;</description></item></channel></rss>