2023年5月6日 星期六

Proxmox VE 筆記

開機選項核心參數設定方式

如果是 grub, 編輯 /etc/default/grub
如果是 systemd, 編輯 /etc/kernel/cmdline

完成後用 proxmox-boot-tool refresh 更新

Intel 82576 SRIOV 啟用方式

核心參數增加 intel_iommu=on iommu=pt
  • intel_iommu 啟用 Intel vt-d
  • iommu=pt 增加核心裝置效能, 只對 kvm passthough 裝置啟用 iommu
  • 如果出現 bus 3 out of range 2 之類的, 要再增加 pci=assign-busses
開機自動啟用vf, 新版驅動不見得有 max_vfs 參數, 要改用 sysfs 啟用, 新增 udev rules: /etc/udev/rules/90-sriov.rules:
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{device/sriov_numvfs}="2"

 參數可先用 udevadm info -a /dev/class/net/enp2s0f0 查看

開機後指派每個VF界面vlan id

編輯 /etc/network/interface, 增加 post-up 設定
iface enp2s0f0 inet manual
pre-up ip link add mac0 link $IFACE type macvlan
post-up ip link set $IFACE vf 1 vlan 300
post-up ip link set $IFACE vf 2 vlan 8
post-up ip link set $IFACE vf 3 vlan 65
post-up ip link set $IFACE vf 4 vlan 66


2017年6月22日 星期四

APP、網站製作

HaoJui 理念

HaoJui Inc. 擁抱著幾個核心理念,這些理念將持續的深植在我們團隊的心中,以下容我們為您介紹:

1.HaoJui的發源

HaoJui的發源,源自於2013以來的咖啡廳聚會。最初的動機,源自於我們想做什麼?我們如何做得更好?為什麼要做這個?幾個核心問題的出現,對我們都是人生轉折巨大的選擇。具體的方向來說,我們朝向的是虛實整合,但真正的動力源,則在於團隊中內心那創新的熱情。對於我們團隊來說,「創新」這個詞彙,就是內心隨時擁抱著各種靈感,哪怕聽起來有點天方夜譚,放下既有成見,專注在如何實現,才是最真實的意義;同樣的,「創新」其實是離不開「發展」來談的,發展不是一個點的激發,而是一種朝向未來眼光的動作,就像是一個探險的歷程,堅定的探險家們,看著心中地圖的目的地,膽大心細、戰戰兢兢的走向最理想的目標,這就是HaoJui團隊存在的意義。

2.我們如何燃燒彼此的肝臟

HaoJui目前屬於小團隊的運作模式,每位成員皆是重要的決策者與執行者,我們組織結構依照目前運作所需要,為平行的運作模式,雖然各自有其負責的領域,但產品的發想與設計,卻仰賴每位不同生活經驗的夥伴們,共同思考與制定;未來,HaoJui持續發展的過程中,我們將秉持著:「自由」、「尊重」、「誠信」,三大原則執行我們的營運模式,我們相信,每種不同基因的團隊組成,才是真正決定何種形式制度的根源,我們反對獨斷的信任某一種制度,並將某種制度當作營運的仙丹。我們真正相信的,是無論何種制度,如果失去了「自由」、「尊重」、「誠信」三大原則,將淪為空殼,這就是我們快樂著燃燒彼此肝臟的核心價值。

2017年1月24日 星期二

讓div可以顯示換行內文

預設div遇到換行符號(\n)並不會顯示出來
可用 css
white-space: per-line;
讓他顯示,  不需換成 <br>

2016年12月2日 星期五

postfix queue常用操作指令


  1. mailq: 列出目前尚未處理的信件
  2. postsuper -d {queue_id} 刪除不要的信件
  3. postcat -q {queue_id} 讀取信件內容

2016年10月21日 星期五

修正git object corruption by harddisk failure

當 git 資料庫因為硬碟損壞導致 object 資料遺失時, 可參以下修復方式
(如果是 server side fail, 可登入到 bare repository 執行這些指令)

git fsck 找出錯誤檔案
$ git fsck  Checking object directories: 100% (256/256), done.
Checking objects: 100% (71975/71975), done.
broken link from  commit 9ca0498a3497f4cfa3522664e37990ba0e7a8d27
             to  commit 448ab8ad722d8921824cad8a2d80c81d40338394
broken link from    tree ccdf43a31989d487d2258e49e68ba1d6a841df7e
             to    tree 14032aabd85b43a058cfc7025dd4fa9dd325ea97
broken link from    tree e975cd899efa1c2dc4386034c4601754dfc2a5a2
             to    blob ed3905e0e0c91d4ed7d8aa14412dffeb038745ff
dangling blob 1413fc609ab6f21774de0cb7e01360095584f65b
dangling commit d052bca582b3d08b2b309653b67b1e99cb835c9c
dangling blob 9e612858f802245ddcbf59788a0db942224bab35
missing commit 448ab8ad722d8921824cad8a2d80c81d40338394
dangling blob 94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
missing blob ed3905e0e0c91d4ed7d8aa14412dffeb038745ff
dangling blob b93a4953fff68df523aa7656497ee339d6026d64
missing tree 14032aabd85b43a058cfc7025dd4fa9dd325ea97
dangling blob 64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
從上面訊息可知, 有檔案內容遺失了
這時候可從還正常的資料夾, 用以下指令還原遺失的 blob object
1. git cat-file -p ed3905e0e0c91d4ed7d8aa14412dffeb038745ff > /tmp/file.tmp
到有問題的資料夾中, 恢復遺失的 blob
2. git hash-object -w /tmp/file.tmp

如果有 obj files 消失, 可從正常的 repo 中取回
1. 把 pack 過的檔案移出 .git/objects/pack/
2. 解壓縮 pack 的檔案
# git unpack-objects < pack-xxxx.pack


參考資料:
Git-內部原理-Git-物件

2015年9月14日 星期一

Telling gcc directly to link a library statically

gcc -lx264 動態連結
gcc -l:libx264.a 把 libx264 靜態連結到目標檔案中
神奇的 -l: 功能!(注意:多一個)

2015年9月4日 星期五

解決CI網頁圖片路徑問題

因為CodeIgniter會改寫網頁網址, 使得原本圖片的相對路徑會壞掉
例如:
http://{網址}/controller/function 頁面, 所有圖片的連結會變成
http://{網址}/controller/images/logo.png
導致找不到圖片

這時可用 HTML "BASE" tag, 來告訴 browser 圖片的相對路徑, 而非用瀏覽器目前的路徑

使用方式
在< head> 中加入: 區加入
< base href="< ?=base_url()?>" />

解決 CI 圖片路徑問題!

2012年12月7日 星期五

[演講筆記] APP創業經驗分享


Title: 賴俊毓, 創辦人兼執行長, 易享科技, "我的App創業經驗談- 四個月, 從0到180萬下載"
App: MixerBox
Feature: auto create play-list, auto sync, 分享朋友的play list
======================
  1. 創業是要 make an impact, 如果只是要賺錢,去大公司(google/facebook等)比較實際
  2. 創業時機:collage is the best time, 學校是最好的時機,開始工作後大不份人 不願意/無法 放棄現有的工作
  3. 思考方向:market-oriented, not engineering-oriented!!! 
    • 不要因為技術成份不高就放棄點子。先找到要解決的問題,再來看要用什麼技術去解決,方向要正確!

  4. Solve your own problems:從生活中找到不足的東西(你覺得麻煩的事情,就是有機會可以做的東西),MixerBox的構想就是從洗澡像聽音樂開始的
  5. Tell your idea to (almost) everyone:
    • 不用擔心點子被別人知道,有想法就可以分享,不然等做完才說,可能就沒有人理你了。
    • 如果你的點子很容易就被抄走了並模仿,那等推出時也會遇到一樣的問題
  6. Sell before build:
    • 藉由跟他人分享的方式,等於是先開始推銷,也可以知道別人是否認同或需要修改
    • 也可避免做出不合市場需求的東西
  7. Start small. Have an expansion roadmap:
    • 先從簡單(要先解決核心問題)的開始,再慢慢修正(增加功能完整度)
  8. Build Minimal Viable Product (MVP) before Full Product:
    • 先求有再求好!
    • 先做出最簡單最基本的功能,然後就推出,不然等你6個月做完完整產品,市場已經改變!
    • 也試試水溫,看看有沒有人想用,增加自己的彈性。
  9. Persevere through setbacks:堅持往前走,不要放棄
Q&A:
  1. 防衛效應:network effect當第一個公司建立起規模後,使用者資料都已經在你這邊了,就不容易被取代。例如: facebook vs google plus+
  2. 創投資金:必須先做出成效,才會有人來投資。(不同於以前)
  3. 獲利模式:
    • facebook模式,先衝高使用者,就可從中找到賺錢模式(例如fb找到可用ads,但風險高)
    • 整合現有商業模式(例如賣電影票app, 每張就可以賺錢)
  4. 如何與創投溝通
  5. 複製的創業模式(從A區複製到B區): C2C copy to china, 要看是否目標市場可以支持你的東西
  6. 開放API: 讓其他人幫忙開發系統, 其他人依靠你的平台, 他們會希望平台好, 對我們也有好處
  7. 但使用者多,還是會被吃掉, 例如: MSN->WhatsApp->Line->WeChat->...
    • 但做大後還是要持續創新,不然還是會被取代!
    • 唯一的永恆就是改變
==相關文章==

找到一個生活中想解決的問題
創業的點子,從解決自身在生活中遇到的問題開始。John 最初想解決的問題,是想要讓使用者方便的建立歌單,因為在這之前,建立歌單是痛苦的,尤其當歌單是分散在各個不同的裝置上:筆電、手機、平板…... 另外,使用者常常在 Facebook 上推薦歌曲,但時間一久,自己也忘了曾分享過哪些好歌。MixerBox 就是一個為了解決這樣問題的 app,這也是他們的機會,因此創造出 180 萬的使用者,並且這個數字還在成長。MixerBox 除了會擷取使用者在 Facebook 分享過的 YouTube 影片、連續撥放之外,還可以讓使用者很方便的跨裝置整合歌單、撥放並分享,達到社群的功能。
John 鼓勵觀眾想想生活中有什麼不方便的,因為這往往就是創業的機會。另外很重要的一點——不要保密,因為別人要偷你的點子機率其實很小,要成功的做出來,更講究的是團隊和執行力。一開始就對自己的點子閉口不提、閉門造車,結果就是做出來之後沒有人理你,因為要先說服人、讓使用者去下載很難,必須要在做出來之前就開始到處介紹、做行銷(John 稱這為「先賣空再實做」)。另外,John 建議,先從解決小問題做為切入點,有了特定的客群,再從這個功能去延伸、挖掘更多的使用者。

商業模式
目前 app 常見的商業模式分為兩種,一是先衝高使用者的數量,像是 Facebook、Google ;另外是針對小眾客群,但從一開始就要收費、有營收的模式。MixerBox 目前是採用前者的模式,先專注把使用者數量衝高、攻下市占率,再來想後續的收費方式。
John 提到 MixerBox 的防衛點是網路效應,因為其實使用的技術並不困難,而擁有大量使用者、社群建立後,使用者的移轉成本高,自然會為 MixerBox 創造了進入者障礙。

為什麼要 Startup?
John 認為,要創業,賺錢固然重要,但決對不能只是要賺錢,若是為了賺錢不如去大公司工作,風險更小。John 過去花時間在矽谷交流了好一陣子,在他創業的路途中,經歷過許多低潮期,像是不知道使用者的想法、他們會想要怎樣的功能?如何找資金?而如何撐過去等等。
John 提到在大公司能做的有限,大部分都是從事延伸性、分工精細的工作,很難有可以做重大改變的機會。創業就不同了,你可以透過自己的力量,改變世界,並且每個時刻都要思考如何精進產品,John 表示雖然很累人,但創業家樂在其中。

大學是最好的時機!
John 本身是在業界工作過,直到 29 歲才興起創業的念頭,但這時候,John 的同學、朋友大多事業有成、有家庭要顧,安於現狀,要找創業夥伴其實不容易,而且機會成本大,因為有家庭、風險又高。學生則不同,很容易可以找到理念相似的朋友一起,最後頂多的是損失時間,機會成本並不大。

以市場,而非技術為導向(Market-oriented, not engineering-oriented)
從小學習寫程式、資工背景出身的 John 以自身經驗,提到理工背景出身的學生常犯的錯,是「萬般皆下品,唯有技術高」的思維。他認為,創業的點子必須先從市場角度思考,想你想要替使用者解決的問題為何,再來想你需要用到什麼樣的技術,而不是為了用某項厲害的技術,再去想你要做什麼服務。

堅持往前走!(Persevere through setbacks)
由 John 和另外三位夥伴組成的易享科技,其實前前後後試過十幾個產品,其中甚至包括塑化劑偵測 app,在新聞很熱的那陣子,還真的反應不錯,但後來等新聞退燒後,產品也乏人問津。直到這次 MixerBox 推出,一週內就達台灣 app 下載量的第一名,對團隊而言是很大的鼓舞。John 鼓勵更多想創業、正在創業中的朋友,堅持往前走。

2012年9月11日 星期二

Add virtual address mapping to current process's page table

Object:
Using hardware MMU to speedup the translation of gva to hpa for QEMU system mode.

Note: pgd , pud, pmd are the table entry, not the table

Reference:

Sample kernel code:

//#include <asm/tlb.h>
#include <linux/mm.h>
#include <linux/mm_types.h>
#include <linux/sched.h>

#include <asm/pgalloc.h>
//#include <asm/pgtable_types.h>  //for struct page
#include <asm/tlbflush.h>

//vaddr_h: vaddr above 4G
long sys_cr3(unsigned long vaddr_h)
{
    unsigned long eax;
    unsigned long vaddr=0x10000000 | (vaddr_h & 0xfff);
    pgd_t *pgd;
    pud_t *pud;
    pmd_t *pmd, pmd_n;
    pte_t *pte, *pte_h;
    struct page *page;
    pgprot_t pgprot;// = __pgprot(0x67);
    //pgprot.pgprot=0x67;
    //set_pte_vaddr(vaddr, ptep);
    //pte_alloc();
    
    //get origen page above 4G
    pgd = pgd_offset(current->mm, vaddr_h);
    pud = pud_offset(pgd, vaddr_h);
    pmd = pmd_offset(pud, vaddr_h);
    pgprot = __pgprot(pmd_val(*pmd) & 0xfff);
    pte_h = pte_offset_map(pmd, vaddr_h);
    
    //mapping vaddr_h above 4G to vaddr below 4G
    //alloc page entry
    pgd = pgd_offset(current->mm, vaddr);
    if(pgd_none(*pgd)) {
        printk("pgd entry not found, alloc new pud and set pgd entry\n");
        /* FIXME */
        //pud = pud_alloc(current->mm, current->mm->pgd, vaddr);
        //set_pud(pgd, *pud);
        pgd = pgd_alloc(current->mm);
    }
    pud = pud_offset(pgd, vaddr);
    if(pud_none(*pud)) {
        printk("pud entry not found, alloc new pmd and set pud entry\n");
        /* FIXME */
        pud = pud_alloc(current->mm, pgd, vaddr);
    }
    pmd = pmd_offset(pud, vaddr);
    if(pmd_none(*pmd)) {
        printk("pmd entry not found, alloc new pte and set pmd entry\n");
        //pmd = pmd_alloc(current->mm, pud, vaddr);
        page = pte_alloc_one(current->mm, vaddr);
        pmd_n = mk_pmd(page, pgprot);
        set_pmd(pmd, pmd_n);
    }
    /*
    pte = pte_offset_map(pmd, vaddr);
    if(!pte) {
        printk("pte_alloc\n");
        //page table entry is not availble, alloc one page table
        //Note: pte is page table pointer, not page table entry
        ptep = pte_alloc_map(current->mm, current->mm->mmap, pmd, vaddr);
        if(!ptep)
            printk("pte_alloc_map fail\n");
    }
    */
    
    //pte = page table entry
    pte = pte_offset_map(pmd, vaddr);
    
    //printk("vaddr_h: pmd_index:%lu, pte_index:%lu\n", 
    //        pmd_index(vaddr_h), pte_index(vaddr_h));
    
    //set new pte as origin pte_h
    set_pte(pte, *pte_h);
    
    //printk("__pa(%lx)=%lx, __pa(12345678)=%lx\n", 
    //        vaddr_h, __pa(vaddr_h), __pa(0x12345678));
    //update_mmu_cache(current->mm->mmap, vaddr, pte);
    //flush_tlb_mm(current->mm);



    __asm__ __volatile__ (
#ifdef CONFIG_X86_64
        "mov %%cr3, %%rax"
#else
        "mov %%cr3, %%eax"
#endif
        : "=a" (eax)
        : /* no input */
        :
        );

    return eax;
    //flush_tlb_page(current->mm->mmap, 0x12345);
}

2012年8月17日 星期五

Adding a new system call in Linux kernel 3.3

How to add a new Linux kernel API in 3.3 version? -- for 64 bits OS
  • Upzip it with command ‘tar xvfj XXX” to a folder For example : /root/kernel tar xvfj linux-3.3.1.tar.bz2 
  • Edit file “/root/kernel/linux-3.3.1/arch/x86/syscalls/syscall_64.tbl” Add new line
    312 64 husky1 sys_husky1 
  • Eidt file “/root/kernel/linux-3.3.1/include/linux/syscalls.h” Add new function declaration
    asmlinkage long sys_husky1(int fd);
    before the line “#endif” 
  • Add a new c file under “/root/kernel/linux-3.3.1/arch/x86/kernel”
    long sys_husky1(int fd) { ... }
  • Edit “/root/kernel/linux-3.3.1/arch/x86/kernel/Makefile” Add a new line “obj-y += husky.o” 
  • goto /root/kernel/linux-3.3.1 folder and run command “make –j8” 
User space code for calling the new system call:
int ret = syscall(312);
Due to standard kernel header doesn't know our new system call,
we need to use system call number here.

Ref: http://stackoverflow.com/questions/9977968/adding-a-new-system-call-in-linux-kernel-3-3

2012年7月4日 星期三

讓Apache得知透過nginx reverse-server的訪客真實IP

由於大家都只對revere proxy連線,實際存取apache的就只有reverse proxy而已,若是不透過reverse proxy,apache的log可以清楚的紀錄每一個連線的ip,但是透過了reverse proxy之後,所有瀏覽紀錄會變成只剩下一個,所有的瀏覽紀錄都來自127.0.0.1,這樣的情況是不被允許的,雖然說reverse proxy也可以留下紀錄,但是遇到有問題要比對時就相當麻煩了,所以還是希望apache可以記錄到原始的ip。


安裝: emerge mod_rpaf
設定:
RPAFenable On
RPAFproxy_ips 127.0.0.1 2.2.2.2(reverse proxy ip)
RPAFsethostname On
#RPAFheader X-Forwarded-For (This is default)


Reference:
Show IP in Apache logs from nginx reverse proxy
Passing IPs to apache with nginx proxy

2012年4月27日 星期五

Creating symbolic link on NTFS

Windows 底下有一個 Installer 的資料夾,裡面主要是放 安裝程式的 MSI 檔案
如果任意移除會倒置很多應用程式無法正常運作
但是這個資料夾又非常佔用空間,勢必得想個方法把他搬到 D: 或其他地方

在 Linux 系統中有 ln 指令可以做 link 的動作
慶幸 Windows 中也有類似的工具 Junction,只要是 NTFS 的系統就有支援
下載點: http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx

安裝方式:
把解壓縮後的 junction.exe 複製到 \Windows\system32

使用方式:
junction dir1 dir2
這樣 dir1 就會成回 dir2 的 symbolic link 了

所以要把 Installer 移到其他硬碟的步驟為:
  1. 搬移 C:\Windows\Installer 到 D:\Installer
  2. junction C:\Windows\Installer D:\Installer
這樣當 Windows 存取 C:\Windows\Installer 的時候,就會自動轉向 D:\Installer 了

2012年4月20日 星期五

Windows 無法安裝列表機

今天幫朋友安裝列表機一直無法成功
安裝最後給的錯誤訊息是 "無可用的連接埠"
到 "列表機與傳真" 那邊嘗試新增列表機的時候
發現上面完全沒有可用的連接埠可以選
正常情況應該如下圖會列出很多選項
新增列表機的畫面(正常)

經過一翻 google, 最後在微軟[1]的網頁上找到類似問題的解法
根據微軟的說法, 是管理列表機連接埠的驅動可能被其他列表機取代
而導致與系統不相容
只要將驅動改回原本的 Windows 提供的即可
  1. 啟動 「 登錄編輯程式 」 (Regedt32.exe)。
  2. 找出下列機碼:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Local Port
  3. 編輯 "Driver", 把字串值改回 "localspl.dll"
  4. 按一下 [確定],然後再結束「登錄編輯程式」
  5. 重新啟動「多工緩衝處理器」(Print Spool)服務。
不過我遇到的問題卻是這個登錄表的值 存取被拒絕!!
這時需要把 Local Port 下面的所有子資料夾權限改回來才可
正常的權限應該如下
權限設定
但我這邊卻是一片空白,完全無法存取
修復方法是修改這些子資料夾的擁有者
改回 Administrators 就可以存取了
取回擁有權

參考資料:
[1] 沒有本地埠可供印表機: http://support.microsoft.com/kb/255507

2012年3月29日 星期四

解決 Java SecureRandom 過久的問題

【問題原因】
Java 的 SecureRandom 為了取得足夠亂、無法預測的 random data
會依據當時系統的 中斷、網路傳輸以及處理器負載 等資訊來產生
當系統處於閒置狀態時,便無法取得足夠多變異的資料來產生 random data
導致需要更多時間去完成這個動作

【解決方法】
啟動 Java 時,增加以下參數
-Djava.security.egd=file:/dev/./urandom
P.S 雖然他產生的亂度相對較低
但...除非是需要【極高/無法預測】的 key
不然還是愈快愈好 XDD

【可能會遇到此問題的軟體】
  1. Hadoop system: HDFS namenode
  2. Web server: Jetty
【參考文獻】
How to solve performance problem with Java SecureRandom?
Jetty: Connectors are slow to startup

2011年10月16日 星期日

Git through proxy authentication

How to git clone from https://github.com/FreeRDP/FreeRDP.git through proxy authentication.

Add git proxy configuration:
# git config --global http.proxy http://user:pass@proxy.server:port/

Troubleshooting:
add GIT_CURL_VERBOSE=1 environment variable for git
ex: GIT_CURL_VERBOSE=1 git clone https://xxx

2011年5月28日 星期六

使用 usbip 分享本機 usb 裝置到遠端電腦 - 網路報稅篇

再兩天就要截止網路報稅了,可是自然人憑證卻不在身邊
就突發其想有沒有辦法透過網路把遠端的 USB讀卡機 分享到本地端
找了一下 usb over ip 的相管資料,發現有 usbip 這個好用的小工具
支援由 linux 端分享 usb 裝置到遠端的 windows 系統

使用方式:
Server 端: 有實體 usb 裝置的機器需啟動 usbipd 把 usb 分享出去 (Linux)
1. usbipd 啟動 daemon
2. bind_driver --list 列出所有裝置編號, 如下範例:
- busid 2-4.1.1 (0424:2228)
2-4.1.1:1.0 -> usb-storage

3. bind_driver --usbip 2-4.1.1
恢復原本 local 使用:
1. bind_driver --other 2-4.1.1

Client 端: 使用 usb 装置端 (Windows)
1. 先由官方網站下載 Windows 的驅動程式,執行硬體安裝精靈安裝虛擬 USB 裝置
2. usbip --list server_ip 列出有分享的裝置
3. usbip --attach server_ip 2-4.1.1 連接遠端 2-4.1.1 的裝置
移除方式:
1. usbip --port 列出共用中的 USB 裝置
2. usbip --detach 2.4.1.1 即可

Reference:
http://usbip.sourceforge.net/

2011年4月15日 星期五

修改 MSS 解決 Linux PPPOE NAT 後部份網頁無法瀏覽問題

有用 Linux 當作家裡 ADSL 分享器/防火牆 的人應該會發現
有些網頁透過 NAT 後就是無法開啟
但是如果直接在 Linux 主機上卻又可以正常開啟
解決方法:
在 Linux Firewall 上增加以下 rule:
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

搞定

為什麼呢?

這主要原因是因為 ppp 網路的 MTU 問題
MTU 的功能在於指定最大可傳輸的單一封包大小
當使用 ADSL(PPP) 時
會再封包裡另外增加 PPP 的 Header 導致單一封包會超過上限
為了解決此問題
一般會把 PPP 的 MTU 設定為原本 Ethernet MTU - 8 也就是 1492

TCP 傳輸方式有自動切割與組合封包的特性
MTU 的值就會被拿來當作 TCP 預設切割的大小(MSS)
MSS = Maximum Segment Size
每次建立 TCP 連線時
雙方會於 handshaking 時互相告知對方允許的 MSS 最後以小的為主
但 NAT 後的 PC 看到的是自己的 MTU 也就是 1500 而非 1492
因此會給對方過大的 MSS 建議
正常來說~當路由器收到大於自己可處理最大封包時
會透過 ICMP 回應給 sender
sender 接下來就會嘗試較小的 MSS
但大多數 ISP 會擋掉 ICMP 導致 sender 傻傻一直等待直到 timeout...

參考資料:
How to Setup a Linux Firewall with PPPoE/NAT/iptables

2011年2月17日 星期四

對於管理大量機器來說,每次新的機器第一次連線都會詢問 'yes' or 'no'
使用以下方式可避免第一次詢問,直接把該 host 加入

# ssh newhost -oStrictHostKeyChecking=no "command"

或是直接修改 /etc/ssh/ssh_config 把這個參數設定就不需要每次打


參考來源:http://wangmk.blog.51cto.com/651644/183939

ssh IP -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no "command"

这样的格式可以避免输入 yes ,可以再交互式脚本中使用

 
man 5 ssh_config


UserKnownHostsFile
Specifies a file to use for the user host key database instead of ~/.ssh/known_hosts.


StrictHostKeyChecking
If this flag is set to "yes", ssh will never automatically add host keys to the ~/.ssh/known_hosts file,
and refuses to connect to hosts whose host key has changed. This provides maximum protection against
trojan horse attacks, however, can be annoying when the /etc/ssh/ssh_known_hosts file is poorly main-
tained, or connections to new hosts are frequently made. This option forces the user to manually add all
new hosts. If this flag is set to "no", ssh will automatically add new host keys to the user known hosts
files. If this flag is set to "ask", new host keys will be added to the user known host files only after
the user has confirmed that is what they really want to do, and ssh will refuse to connect to hosts whose
host key has changed. The host keys of known hosts will be verified automatically in all cases. The
argument must be "yes", "no" or "ask". The default is "ask".
Related Posts Plugin for WordPress, Blogger...