2018年7月28日 星期六

安裝 linux mint

我很少將 Linux mint 安裝到硬碟, 最多將 iso 檔複製到硬碟後用 grub 來啟動它, 因 grub 可以將核心檔(vmlinuz) 及啟動檔(initrd.lz)從 iso 檔提取出來,只要將指示寫進 grub.cfg 啟用 loopback 命令引用loop裝置, Ubuntu 的核心系統會利用 boot=casper  iso-scane/filename 去找尋 iso 檔,之後將它掛載(mount)到 root 底下(/cdrom),Linux kernel 最後會將檔案/cdrom/casper/filesystem.squashfs 使用 overlay 檔案系統掛載(mount -t overlay)方式形成特殊的檔案系統, 底下列出我使用的 grub.cfg(不要搞混 grub 的 root 與 linux 系統的 root ,它是兩個獨立系統的詞彙用語):


menuentry "GPT Linux mint 191 Read Only" {
  set root=(hd0,1)
  set iso=/boot/linux191.iso
  loopback loop $iso
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso  locale=zh_TW.UTF-8
  initrd (loop)/casper/initrd.lz
}

一旦 linux 啟動完,檔案系統掛至定位, 只要將檔案系統複製到硬碟的 EXT4 分區(/dev/sda3), 一些目錄像是 /proc, /sys, /cdrom, /home, /media, /mnt, /run,/srv, /tmp, /boot 並不需要複製,只要用命令 mkdir 產生目錄,最後再將核心(vmlinuz)及啟動(initrd.lz)兩個檔案複製到檔案系統內(/boot). 開啟終端機,輸入以下命令(備註: /dev/sda3 需事先規劃成 ext4系統)來複製 Linux Mint 整個檔案系統:

   sudo su
   mount   /dev/sda3    /mnt
   for rd in bin dev etc lib lib64 opt root sbin usr var; do cp -aR /$rd /mnt/$rd; done
   for md in cdrom home media mnt proc run srv sys tmp boot;  do mkdir /mnt/$md; done
   cp    /cdrom/casper/vmlinuz    /mnt/boot
   cp    /cdrom/casper/initrd.lz    /mnt/boot
   sync;sync;sync
   umount /mnt
   reboot

系統複制好後,必須要有密碼才能登錄 linux 系統,利用 kermel 選項的  rw  init=/bin/bash 就可以讓 linux 直接使用超級使用者開啟終端機接受命令. 我修改了 grub.cfg 添加一些選單項目(memuemtry) :

set timeout=3
menuentry "GPT Linux mint@hardisk  /dev/sda3 " {
  set   root=(hd0,3)
  linux   /boot/vmlinuz   root=/dev/sda3    ro   locale=zh_TW.UTF-8
  initrd  /boot/initrd.lz

}

menuentry "Run linux's shell to change password for any user" {
  set   root=(hd0,3)
  linux   /boot/vmlinuz   root=/dev/sda3   rw   init=/bin/bash
  initrd  /boot/initrd.lz
}

menuentry "GPT Linux mint 191 Read Only" {
  set root=(hd0,1)
  set iso=/boot/linux191.iso
  loopback loop $iso
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso  locale=zh_TW.UTF-8
  initrd (loop)/casper/initrd.lz
}

重新開機,按著 ESC 鍵, grub 就會跳出選單,選第2個項目,讓 linux 先進入超級使用者的交談模式(super user shell), 敲入 password 指令重設超級使用者的密碼,利用 useradd 添加使用者, mkdir 建立一般使用者的家目錄, chown 賦予使用者權限, password 再重設一般使用者的密碼,修改密碼時系統會要求輸入兩次一模一樣的密碼做確認:

       #password
       ...
       #useradd    mason
       #mkdir    /home/mason
       #chown   mason.mason   /home/mason
       #password    mason
       ...
       #reboot

重新開機(gurb內定使用最前面的選單開機),使用 mason 身份及密碼去登錄, 登錄後在終端機可以用 su 命令,敲入超級使用者密碼,就可以變身為超級使用者,管理系統的工作

p.s. 安置裝好後,還有一些需要再調整的:
1. 修改 /etc/lightdm/lightdm.conf  將裡面的 autologin-user=mint 改成想要登錄的名稱,例如 autologin-user=mason,就可讓 mason 無需輸入密碼,自動登錄
2. 將 /etc/timezone 內容修改成 Asia/Taipei 符合台灣的時區
3. sudo apt-get install gcin 加入中文輸入法
4. 修改 /etc/sysctl.conf , 加入一行  vm.swappiness=1
5. 修改 /etc/passwd ,  將一般使用者登錄程序改用 /bin/bash, 預設可能會是 /bin/sh
6. 如果要初始化一些想要執行的程序, 可以修改 /etc/rc.local 讓它開機自動啟動

2018年7月21日 星期六

開始了解 GPT 並安裝 grub

早期硬碟的主要分割區最多只有 4 個,搭配老式的 BIOS(開機作業程序),基本上運作不成問題,但隨著新一代作業系統需要高容量儲存空間以及更多分割區的作業需求, 必須升級程 EFI , 甚至進階到 UEFI,硬碟分割表也必須跟著升級成GPT(GUID partition table)才能因應各種任務,因此有必要去了解 GPT 的運作常識,之前分割硬碟我常使用工具程式 fdisk, 但這回為了要製作 GPT, 在 Linux 作業系統上需要改用 gdisk, 大部份指令(使用 ? 就可以列表出來)與 fdisk雷同, GPT 為了與老式 BIOS 相容,使用 id 編號 0xEE 來識別, 因此用 fdisk 來看硬碟時只會看到 0xEE 的 GPT 分區,改用 gdisk 才能列表查 GPT 各分區磁區佔用的情形,還蠻容易操作的.底下列出 gdisk 一些常用到的指令:
      l            列出各種可用的註冊編號(list known partition types)
      n           在 GPT 內新增一個分區
      o           新建一個空的 GPT
      p           列出 GPT 內各分區資訊
      q           離開 gdisk
      t            修改 GPT 內分區的註冊編號(change a  partition's type code)
      v           驗證 GPT 內容
      w          將修改的內容寫到 GPT 內
      ?           列出所有可用指令

如果是用隨身碟製作 GPT,在劃分完後,可能需要拔插隨身碟一遍, 讓新的分割表可以被 Linux kernel 重新識別. 使用 partprobe 就可讓 kernel 重新讀取裝置的 partition table,而無需熱插拔:
      sudo partprobe /dev/sdb

為了能跑各種不同的作業系統,安裝像是 grub 2.0 的 bootloader 是一個非常實用的步驟,而要讓grub 一開機就取得主導權, 就必須先在 GPT 內新增一個編號 0xEF02 BIOS Boot partition 分區(簡稱 BBP),大小只要 1MiB 就足夠了,該分區不需要去規劃它(Format).目前我將 /dev/sdb1 保留給 grub 當作開機啟動區(BBP),大小設定成 64 MiB

但如果要啟動 EFI 相容的像是 Windows boot loader的啟動程序,就需要在 GPT 新增一個編號 0xEF00 EFI System 分區,大小約 500MiB 就夠了,該分區簡稱為 ESP (EFI System Partition),它必須規劃成(Format) FAT32,而所有用來啟動 EFI 的程序檔案就放在該分區的特定目錄底之下,底下將規劃 /dev/sdb2 成 EFI filesystem, 而 /dev/sdb3 將規劃成 ntfs:      
       sudo su      
       mkfs.fat  -F32 /dev/sdb2
       mkfs.ntfs /dev/sdb3

如果是要安裝 Linux 作業系統, 可以在 GPT 內新增一個編號 0x8300 Linux filesystem 分區,再規劃成(Format) EXT4 並將作業系統等檔案,甚至一些 grub bootloader 重要程序及驅動程式都可以放在該分區內,底下將 /dev/sdb2 規劃 EFI filesystem, 而將 /dev/sdb3 規劃成 Linux ext4 filesystem, 準備將 grub 開機程序注入 /dev/sdb 而 boot loader 的其它必要檔案將複製到 /dev/sdb3:
        sudo su
        mkfs.fat -F32 /dev/sdb2
        mkfs.ext4 /dev/sdb3

準備要安裝 grub bootloader, 先將磁碟分區 /deb/sdb3 掛到檔案系統上(例如 /mnt):
        mount  /dev/sdb3   /mnt

傳統 BIOS 則只要安裝 grub 到 BBP 就可以讓 grub 取得開機主導權, 若是安裝 32 位元的 grub:
        grub-install --root-directory=/mnt   /dev/sdb

若是安裝 64 位元的 grub:
        grub-install --root-directory=/mnt  --target=x86_64-efi   /dev/sdb

接著要製作符合 EFI 格式的 loader, 需事下載並安裝好 64 位元版的 grub-efi-amd64-bin 或是 32 位元版的 grub-efi-ia32-bin, 若是安裝 64 位元的版本,檔案會被複製到 /usr/lib/grub/x86_64-efi 目錄底下, 32 位元的版本則會被安裝到 /usr/lib/grub/i386-efi 目錄底下:
        sudo apt-get install grub-efi-amd64-bin  grub-efi-ia32-bin

準備將 /dev/sdb2 用來作為 EFI  開機區(簡稱ESP), 其實只要將 bootx64.efi 或 bootia32..efi 加上 grub.cfg 兩個檔案放到 ESP 特定目錄(通常 bootx64.efi 或 bootia32.efi 要放在 /EFI/BOOT, 而 grub.cfg 要複製到 /boot/grub 或 EFI/BOOT 目錄裏面), 就能讓 grub 取得開機主導權, 其中檔案 bootx64.efi 或 bootia32.efi 可以用 grub-mkimage 製作出符合 EFI 格式的執行檔, 64 位元的執行檔:
        umount   /mnt
        mount /dev/sdb2 /mnt
        cd /mnt
        mkdir  EFI    boot
        mkdir  EFI/BOOT   boot/grub
        grub-mkimage   -d /usr/lib/grub/x86_64-efi -o EFI/BOOT/bootx64.efi  -p /boot/grub   -O x86_64-efi  fat iso9660 part_gpt part_msdos normal boot linux linux16 configfile loopback chain efifwsetup efi_gop  efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf   cat

若是要用 32 位元的執行檔:
        grub-mkimage   -d /usr/lib/grub/i386-efi  -o EFI/BOOT/bootia32.efi  -p /boot/grub    -O i386-efi      fat iso9660 part_gpt part_msdos normal boot linux linux16 configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 ntfs btrfs hfsplus udf  cat

稍微編輯一下 /mnt/boot/grub/grub.cfg 的菜單, 將以下內容輸入存檔.
#==== begin of grub.cfg ===========
set timeout=2
set default=0
hiddenmenu

menuentry "Linux mint 173 Read Only" {
set root=(hd0,3)
set iso=/boot/linux173.iso
loopback loop $iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso quiet slash locale=zh_TW.UTF-8
initrd (loop)/casper/initrd.lz
}
#==== end of grub.cfg ===========

需注意的是 grub.cfg 要放在 grub 可以抓到的地方(內定是 /boot/grub/grub.cfg).否則開機找不到時會跳進命令列模式(這時可以試試用 configfile 命令去指定檔案所在的地方讓它秀出選單). 最後將 linux 的 iso 檔複製到 linux 分區, 從上述 grub.cfg 的設定可以看出來, iso  開機檔是磁碟 0 第 3 分區(hd0,3) 的檔案 /boot/linux173.iso,

p.s. 經上述過程製作好的隨身碟, 用 usb hub 將它跟滑鼠及鍵盤連接我的 windows 10 平板電腦(型號是華碩的 vivotab 8, M80TA), 先單按電源鍵開機, 等燈亮起後放開,接著同時按住電源加上音量down鍵, 直接進入 EFI BIOS, 關閉  EFI secure boot 及  fast boot, USB controller 視需要改成 EHCI 或 XHCI, 儲存之後重新開機,按住 ESC 鍵就會跳出選單,選擇從 USB 隨身碟開機,讓 vivo tab 8 進入 linux mint 的世界, 但遺憾的是無線網路不通,觸控螢幕及觸控筆都無法運作. 但玩過一遍之後,我了解了 EFI  GPT 的運作模式,這是最大收穫的地方

2018年7月11日 星期三

使用 linux 命令 hdparm 清除 ssd

參考文章: https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase
固態硬碟用久了之後,感覺似乎開/關機的時間變久了,想來個大掃除,低階格式化可讓它回到初始狀態.使用命令 hdparm 就可以搞定:https://linux.die.net/man/8/hdparm

1. 用usb光碟或隨身碟的Linux mint作業系統來開機,開啟終端機先切換使用者為 su, 命令列輸入
    sudo su

2. 假設固態硬碟放在 /dev/sda, 先確認固態硬碟(SSD) 是否"沒被鎖定"
    hdparm -I /dev/sda 

...
Security: 
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
2min for SECURITY ERASE UNIT.
確認上述 not locked 的字眼. 確定該硬碟支援清除模式

3. 設定臨時的致能使用者( --user-master u), 以密碼 123456 (--security-set-pass 123456)為例, 密碼可以隨意指定, 但必須記住該密碼,待要清除固態硬碟時使用:
        hdparm --user-master u --security-set-pass 123456 /dev/sda
這時如果再用 hdparm -I /dev/sda 來查資訊,上述的Security黃色部份將會改為 enabled

4. 準備使用剛剛的密碼來低階格式化, 切記:將會把固態硬碟完整抹除無法回復.
        hdparm --user-master u --security-erase 123456 /dev/sda

5. 之後用  fdisk /dev/sda 重新分割固態硬碟,全新一顆固態碟又生龍活虎了
        fdisk /dev/sda

2018年3月4日 星期日

Ether(乙太幣)及智能合約(Smart contract)

第一代使用區塊鍊技術的數位貨幣網路是 Bitcoin network, 新一代則是 Ethereum network 以太紡,它使用Ether(以太幣)作為它的貨幣, 安裝 ethereum network 的客戶端程式 geth,可以加入網路來挖礦(mining),但需先下載完所有的區塊鍊(blockchains)

一些單位換算與術語:
   1 Ether = 1e9 Gwei = 1e18 wei

   Gas cost 使用 Gwei 為單位, 是驅動智能合約的燃料,一般預定是 20 Gwei,可以自由修改.
   Gas limit 用來設定 Gas 最大用量(或稱為預估用量),如果設定不足, 當合約送入網路,一旦 Gas 消耗完,此合約作廢,簡直是勞民傷財,一個 transaction (傳送想要加進區塊鍊合約:)需要21000個 Gas 才能驅動,盡可能將 Gas Limit 設大一點,當合約驗證完成,只會消耗所需的用量,消耗不完的會被退還,因此執行合約,預估需消耗
    (Gas Limit * Gas Cost)/1e9 個 Ether

當設定 Gas cost 為 20Gwei  時, 傳送此合約預估要花費
    21000 * 20 /1e9  = 42e-5 = 0.00042 Ether

這還不包含合約的內容,內容(Tokens)需另外計費,合約內容是以 Solidity 語法(script)來實現,須先將它編譯(Compile)成代碼(tokens),才能用演算機(Virtual Machine)去執行,而每個 ethereum client (例如 geth)其實就是一部演算機,都可以來執行代碼,而這合約內容存在於區塊鍊上,無法被任何人更動但可以被執行,因此稱之為智能合約(Smart contract)

目前乙太幣價格也快來到 1000 USD, 這代表要驅動智能合約須付出昂貴代價,也許會對想要簽署智能合約的消費者怯步,但同時也造成大家一窩蜂去挖乙太幣,這個生態系統需要進一步作觀察

2018年3月2日 星期五

比特幣(Bitcoin)總數量

最近比特幣吵到天價(今天 2018/3/3 大約等於是 11000 USD), 到底他是什東西,比黃金還值錢.新的比特幣發行來自於解決了一個電腦運算的問題,而獲得一定數量的獎勵,一旦累積到210000個區塊時,獎勵數量就會少一半,之後再累積區塊數量計算新一輪的累積量,如果再次達到210000個時,獎勵數量又再少一半.由此以每 210000 個區塊的累記數量為一輪來分析(代數用 p 當變數), 獎勵從最初第一輪(p=0)的 50 個比特幣, 目前累積到區塊數量共約 511717(第3輪獎勵的階段, p=2),試著用數學式來演繹:

      ( 511717 / 210000 )  <  3

      p = int( totalbolcks/210000 )  = 2       取整數, 相當於第 p+1 輪

 

因此目前新生成新的區塊獎勵是:

      50 *   (1/2)  * (1/2)  = 50 *[ (1/2)^2 ]= 12.5 個比特幣

      目前 p = 2



用通則來表示獎勵數量, 將(1/2) 的 p 次方改用 2^-p 來表示:

       50 * ( 2^-p )

       p =int( total bloclchains/210000 )



由此來計算第 p+1  輪累計的比特幣總量是:

      210000 * 50 * ( 1 + 2^-1 + ... + 2^-p)



如果使用 32 位元的長整數來儲存數值,當 p=32  時 2 ^ -32 將會變成 0, 也就是第 33 輪後獎勵將變為 0 個比特幣, 之後的報酬將只會來自於交易費用(transaction fee),上述最後一項其實就是一個等比級數運算式,因此可以算得比特幣總發行量等於:

      210000 * 50 * 1/(1-2^-1) = 21000000



它的帳務資料(blockchain as a ledger)由每個參與(pee-to-peer)的礦工(miner)下載一份作為稽核他人的付款(transaction)之用,相當於點對點的帳務網路系統.



     第一輪的礦工共挖出 50% 的比特幣

     第二輪的礦工又再挖出  25% 的比特幣

     目前第三輪之後的礦工就只剩不到  25% 的比特幣可以再挖出來





推導總共 n 項(輪)等比級數的總和, 用變數代換將上述 p 換成 n-1:

         s = a^0 + a^1 + a^2 + ... + a^(n-1)             --- (1)

   a * s =           a^1 + a^2 + ... + a^(n-1) + a^n   --- (2)

(2) - (1)

   (a-1) * s =  a^n - 1                                            --- (3)

               s = (a^n-1)/(a-1)                                   --- (4)

 如果 a  < 0, a^n 會逼近於 0, 因此等比級數總和

               s = 1/(1-a)                                             --- (5)

2017年6月25日 星期日

木工機絲

前年家裡房子拆了,留下一堆木材(角材),又厚又重,且每根長度都不同,造成整理堆疊起來很佔空間,非常礙眼.於是想一想看有沒有可以利用的地方,第一個念頭就是做成桌腳,再找一找廢棄的木板,翻變家裡頭,剛好有兩塊120cmX60cm 的木板,一片用來當桌面,另外一塊當作收納底座.但想到要鋸木頭,就頭大,如果要用手鋸,要很久又很累,心一橫,索性上網買個電鋸回來,所謂工欲善其事必先利其器,當然要先作功課,畢竟一台不便宜,常人言:工欲善其事必用新台幣,真是一針見血.

我要鋸的廢木材大概 6cm ~ 7 cm厚又很硬,原本打算要買 GST65,價格不到 2000新台幣,似乎經濟又實惠,但網路上說 400W 的電鋸似乎像是一台玩具,功率太低,實際他的有效輸出要打個折,可能1/3 馬力都不到, 1馬力約等於 746W,心想可能無法負荷去切割這麼厚的木板,高瓦數的圓鋸聽說很危險,非專業的人士恐要很小心使用,線鋸似乎安全多了,於是鎖定一台線鋸,人生第一台線鋸,先用知名品牌的,也許安全係數會好一點,穩定度耐用度等等這些可靠性指標可能都比較好(其實心裡因素佔的層面恐怕是最高的),最後,網購花了 3400 新台幣買了一台650W的 GST75BE,查了一下官網,實際有效輸出是360W,大約 1/2 馬力,同品牌線鋸還有更高馬力的,但價格更高,或許等更專業一點後有需要再說,隨機附了一隻鋸片 T144D,但太短了,無法切割 7cm 厚木材,於是又加購了較長的鋸片 T344D.切割後的木材,邊邊多少會有銳角,且廢棄木頭也難免有毛刺,再花個1050新台幣添購了一台砂紙機,想說把木材磨平點免得傷人.上購物網看到拆螺絲的神奇機絲,好奇就訂購了一組,後來想用線鋸來切鐵片或是將木台切漂亮一點,就多買了一些鋸片,像是 T345XF 3 支, T318A 5 支, T101B 5 支, T344D 3 支,前兩個是用來鋸鐵的,後兩個則是用來鋸木頭的,其中 T344D 最長(整隻長 15cm, 扣掉刀柄用來切 7cm 應該不成問題),考慮到將來也許會運用它改裝當作桌鋸使用.就這樣零零總總花了將近750塊新台幣,算一算總共花了約新台幣 5200元.網購東西這種欲望真的很邪惡,看到心動的,手一滑就無法控制了.

收到貨後,興致沖沖的趕快架起木頭開始施工練功.第一刀小心翼翼的切了下去,花了幾秒鐘就把厚厚的木材一刀兩斷了,摸一摸斷面還算平整,真是大快人心.想說待我完成桌子後,這錢就花的值得了,鋸了幾次後發現,要鋸成垂直線,真的有相當難度,如果沒有平整的水平桌面,即使垂直地面下刀,切斷後去看他的斷面,會發現面雖然是平的,但卻是斜面.因此之後要切之前,都先拿水平泡泡量一下水平再切,但終究還是切不直,再仔細去看斷面,很像是微微的 S 型曲面.一旦桌腳鋸不直,桌子就不會穩.上網看了一堆影片,有人用培林導引鋸片,並倒裝成桌鋸,再用直線靠山導引木頭去鋸才會直.但花時間且工程太大,如要買工作台,又要不少花費,到這時終於體會出原來線鋸並不是用來鋸直線的,而圓鋸也不是鋸圓線用的.或許換個話應該說線鋸是用來鋸曲線的,而圓鋸比較適合鋸直線的.同樣的價錢,想當初應該買圓鋸才對.但木已成舟,只好將就點.接著鋸了較薄( 3cm)的木材當旁邊支柱,這斷面看起來就直多了.我想應該是鋸片太長,當鋸厚木材時,可能是反彈力量過大,導致線鋸的培林偏向,使得無法正確導引成一直線造成扭曲的s平面.仔細看T344D 規格上寫著:厚建築木料,軟木 5-100mm, 我想它只限軟木,而我鋸的可能是硬木吧!最後再到五金行買了4個輪子鎖到桌腳,桌旁支撐橫桿再多鑽點螺絲鎖上去,用直角鐵片加強,鎖住四個角落,才勉強解決了桌子搖晃不穩的問題,木工收納桌完工,雖然長的很醜,但是還蠻實用的,想到很多東西要收納,又再利用廢棄衣櫥的厚板邊,並利用線鋸裁出需要的長度,裝到桌子中間,變成另一層收納板,這樣子總算可交待了,這5200塊裝備的第一項任務就圓滿達成.後續再想想該如何好好利用(例如改裝成桌鋸).畢竟多完成一項任務,錢就花的更值得,這 DIY 樂趣的成就感自然不在話下.

之後突發起想,有沒有將不直的斷面加工變直面的工具.如果用圓鋸,大概沒問題,但一想到危險兩個字就縮手了.刨木機上網看了看,感覺太貴又不怎麼實用,路達雕刻機也許是個好玩意,衝動之下,不小心手殘,竟又花了約新台幣2800添購了新裝備,包含主機用的配件有下壓式底座,角度傾斜座,另外加上12支修編刀,整組 700多瓦的修邊主機內含修邊基座及滑輪修邊制具,加上直線導規及一片圓形導規,到網路上比一比價錢,真的是便宜到爆.要是買回來,鐵定賺到.因為這是我第一次上露天拍賣買東西,既期待又怕受傷害,當收到到機器,打開一看,外觀品質,很像是工廠打下來的次級品,有不少地方看起來不是很滿意,甚至塑膠接頭還有破損的地方,可能不會影響到修邊的功能,許多像是螺絲的地方用衛生紙擦拭,還看的到鐵鏽(對廠商來說或許功能才是一切,但對消費者來說,其實會很無言),若不用機油保養擦拭大概很快就報銷了,這時才有所體悟,原來便宜的背後必定有挑惕的地方(切記,切記,切記!)趕緊試試看是否有功能上的瑕疵,無話可說,摸摸鼻子,算了接受吧,對於木工的門外漢,也許夠用了,便宜終究戰勝了一切.就不要再強求了.有人說高轉速的路達雕刻機(這台每分鐘轉速可以從10000到30000之間作6段調整)是一個危險物品,目前我還深刻的警惕著,到現在都還沒用它施工過,暫時先到 youtube 上看看網路達人的使用心得,有了概念再玩也不遲,畢竟這等便宜貨,主機不過1400左右,壞了也不算心疼,等熟練了有需要再升級買其它有品牌的來用.再說配件屬金屬材質,儲存的當應該可以保存很久,就當作這2800是買配件用的.上網去看,其實雕刻機的配件還蠻貴的.清點附件時發現修邊機共附了3個修邊刀夾頭(有 6mm, 6.35mm, 8mm), 視雕刻刀的柄徑要適時更換.再清點一下還發現有一組碳刷附件,萬一壞掉要自行替換,這應該難不倒我,馬達的東西,要壞其實很難,如果有電路板另當別論.把玩了一陣子,發現以前插電式電鑽的把手竟然可以安裝在這組雕刻機的下壓底座當推動把手用.

最近看了許多影片,對於路達雕刻機(trim router)終於有了一些概念,雕刻機附了許多零件,都是有用途的:

1. 圓形導規(英文稱之為 guide bushing)是利用其突出的圓形外圈貼邊去修飾雕刻刀經過的地方(就把它當成培林滑行用,只不過要靠人力去推動基座,產生滑動效果),如果雕刻刀直徑是A,圓形導規最外圈直徑是 B(B一定大於A,這樣雕刻刀才可伸的出去),那修過的地方,邊邊偏移的距離等於 (B-A)/2

2.如果利用雕刻刀的培林貼邊去滑動, 此時 B 相當等於 A,因此修邊偏移距離等於0,如同去複製樣板邊邊的效果,英文稱之為 template guide,或者翻譯成樣板導規.

3.基座的所附的貼邊輪也是類似培林(滾珠軸承,英文稱之為 ball bearing)的滑行效果,好處是可以上下調整貼邊的參考點,用法就是要用眼睛去觀察將要貼的邊與刀口邊成一直線,這樣就可挖出垂直線來,也是使用樣板導規的方式來修邊.

4.平行導規可以貼邊後去挖內槽,也可固定後,隨者平行板的旋轉而挖出一圈圓型,類似圓規的作用.

5.使用 T型修邊刀,應該先用小直刀挖出小溝槽,接著用較大直徑的T型刀深入再挖出 T 槽

6. 下壓式底座(英文稱之為 plunge base)可以用來精確的挖出溝槽深度,可以事先做好樣板(樣板深度已測量過)作為比對依據: (a)將雕刻刀下壓至樣板底部(b) 暫時鎖定下壓底座,固定雕刻機工作深度,調整尺下降刻度到工作面固定位置,有三個可旋轉的預設刻度可調整(c) 釋放下壓底座 (d) 回到工作台,貼到要挖的木板上(e)打開電源,直接下壓至工作面,鎖定底座,開始精確深度挖槽,這樣挖出來的深度就等於樣板的深度.

7. youtube 上有教人製作制具,英文稱之為 jig,因此會用一些木板當檔牆,英文稱之為 fence,用來挖木板的中間溝槽(英文稱之為 dado 或 groove),或挖邊槽(英文稱之為 rabbet)或是製作榫接(英文稱之為 mortise或tenon),或是直接鑲嵌 (英文稱之為inlay),而各種雕刻刀稱為 router bits,這些專有名詞大概要記一下,這樣搜索影片會比較方便點. 修邊刀有分很多種類,像是 Straight & groove forming bit(直線槽刀,通常不帶培林的修邊刀直接挖槽), Laminate trimming bits(層壓修邊刀,通常前端帶有基準邊的培林刀),Edge forming bit(產生花邊的刀,通常也帶有培林),flushing trimming bits(培林直徑與刀柄直徑相同,用來將邊緣刮除乾淨)...

8. 修邊刀的筒夾一定用用板手扭緊,否則脫落時修邊刀在裡面滾動著就變成磨刀器,修邊刀是靠很緊的磨擦力固定的,一旦被磨平,就固定不住,當然就報銷了,因此筒夾是消耗品,要緊記.

9.所有要修邊的木材,務必故固定牢靠,否則高速圓周運動修產生的切線動力,會將木材帶動或是把碎屑亂拋,恐會造成危險,一旦有不正常振動或不穩定就必須關機確保安全.

10.要作裝備保養時,務必關閉電源.基座的塑膠部份千萬不要用汽油,揮發性的物質或酒精去擦拭,因為,可能會產生化學反應而導致褪色,變形龜裂.

2017年5月5日 星期五

理解 iptables 的使用


網路上的文章幾乎都使用舊版說明,雖然過時,但仍然可以學點常識.
iptables 資訊:  http://www.iptables.info/en/iptables-contents.html
各鏈條流程圖:  http://www.iptables.info/files/tables_traverse.jpg

列出 iptables 指令的使用方式:
        iptables   --help
或
        iptables   -h

常用的命令列格式:
      iptables   規範命令   鏈條名稱   規範選項
或     
      iptables   規範選項   規範命令   鏈條名稱

其中 規範選項  的各項順序只要處理得當,可以依照喜好自由調換位置.iptables 鏈條(chain)的規範命令是以"-大寫簡稱"或"--小寫全名"擇ㄧ使用:
   -A 或 --append  用於附加鏈條規則
   -C 或 --check  用於檢查鏈條規則是否存在
   -D 或 --delete  用於刪除鏈條規則, 以數字 1 為基準當第一條鏈條
   -I 或 --insert  用於插入鏈條規則, 若沒設定插入位置, 預設是插入當作第一條規則
   -L 或 --list  用於詳細列出鏈條規則
   -S 或 --list-rules  用於顯示鏈條簡表
   -N 或 --new   用於自訂鏈條規則
   -P 或 --policy  用於鏈條的預設政策,當鏈條的具體行動沒指定時將啟用(ACCEPT 或  DROP)
   -E 或 --rename-chain  用於改變鏈條名稱
   -R 或 --replace  用於改變鏈條的順序
   -F 或 --flush  用於刪除鏈條的規則
   -X 或 --delete-chain  用於刪除自訂鏈條
   -Z 或 --zero   用於鏈條計數器歸零

目前版本(version 1.6.0) iptables 內部共有五個表格(filter, mat, mangle,raw,security)可由規範選項 -t 來指定),每個表格各有不同的鏈條名稱,使用 -L 可以列出各表格的鏈條規則:
         $iptables    -t    filter    -L
由此來看 filter 有  INPUT,   FORWARD,  OUTPUT   3個鏈條,接著看:
         $iptables    -t   nat     -L
因此 nat 應該有  REROUTING,  INPUT,  OUTPUT,  POSTROUTING   4個鏈條,再來看:
         $iptables    -t   mangle    -L
所以 mangle 有  PREROUTING,  INPUT,  FORWARD,  OUTPUT,  POSTROUTING   5個鏈條
另外兩個 raw, security 似乎比較少用,詳細可上網找文章閱讀看看.

規範選項部份除了版本(-V 或 --version)以外,都是以"-小寫簡稱"或"--小寫全名"擇ㄧ使用,有些選項可以使用驚嘆號 ! (反邏輯),將選項的邏輯允以反向(也就是在原本用意加上'非'這個字眼),例如:
  !  -p 或 --protocol  用於網路協定,像是  tcp 或 udp 或 icmp 或 all
  !  -s 或 --source  用於來源網址或網域, 像是  ipaddress 或 ipaddress/mask 之類的位址
  !  -d 或 --destination 用於目標網址或網域,像是 ipaddress 或 ipaddress/mask之 類的位址
  !  -i  或  --in-interface  用於來源網路界面, 像是 lo eth0 之類的名稱
  !  -o 或 --out-interface  用於目標網路界面, 像是 lo eth0 之類的名稱
  !  -f 或  --fragment  用於像是片狀的封包 ???
 只要不加驚嘆號, 就如字面上意義(正邏輯).

只能用正邏輯的規範選項有 :
   -j 或  --jump  指定目標(target), 可用 ACCEPT 或 REJECT 或 DROP
   -g 或 --goto  直接跳進指定的鏈條規範不返回
   -m 或 --match  使用指定模組來拓展匹配
   -t 或 --table   指定表格,可有 filter 或 nat 或 mangle 來過濾封包, 若未指定,則內定用 filter
   -w 或  --wait  等待表格鎖定時間,以秒為單位
   -v 或  --verbose  顯示冗餘資訊,像是目前計數器的數值... 等等

其它正邏輯選項還有:
   -4 或 --ipv4   用於 ipv4  的封包 ???
   -6 或 --ipv6  用於 ipv6 的封包 ???
   --modprobe=載入外部模組 ???
   -n 或 --numeric   網路位址(ip address/netmask)及端口(port)使用數字展開
   -x 或 --exact  展開數字 ???
   --line-numbers  當顯示列表時,前面附加行數的順序.

在 linux mint 系統上執行 iptables 必須要有 superuser 權限,自行定義一個變數(例如 iptables) 便於重複利用並簡化輸入:
    iptables='sudo iptables'
 
將鏈條名稱與規範選項合併就成為該鏈條的一個規則, iptables 如果定義規則時沒用選項 -t 來指定來表格,將會用 filter 當作內定表格.而且不同的表格將有不同的規範選項,因此底下說明可能只適用於 filter 表格(等同使用了 -t filter).

假設要設定 filter 表格內 OUTPUT 鏈條的規範,使用選項匹配模組(-m owner )去匹配是否等同指定的使用者(--uid-owner   $USER),如果選項匹配成功,執行指定目標(-j   REJECT ).將上述規則定義成一個變數 rule 方便後續使用:
    rule="OUTPUT   -m   owner   --uid-owner   $USER  -j   REJECT"

鏈條規範的執行流程會從所有設定規則的第一條開始一個個往下匹配,直到匹配成功去執行具體行動,如果在規則中沒有用 -j 設定目標,則會往下一條規則繼續匹配,如果全部規則都匹配不成,也就無具體行動,因此該鏈條的預設政策就會啟用(預設政策的規範選項僅可以是 ACCEPT 或 DROP),要改變預設政策,使用規範命令 -P,例如:
     $iptables -P INPUT ACCEPT
     $iptables -P FORWARD  DROP
     $iptables -P OUTPUT  ACCEPT

使用  -A 添加規則到最後一條:
    $iptables   -A   $rule

如果認為規則很重要,可以使用 -I 插隊變成第一條規則:
    $iptables   -I   $rule

用 -L 可以詳細列出表格鏈條的規則,附加 --line-numbers 會將規則的順序一起列出:
    $iptables   -L   --line-numbers

或是用 -S 顯示表格鏈條的簡表:
    $iptables   -S

只要語法正確,就會被加入到鏈條的規則內, 因此相同的規則可能會重複,因此先檢查再添加可以防止重複添加,使用 -C 可以先檢查想啟用的規則是否存在,若存在只要輸出該規則的訊息:
    $iptables   -C   $rule   &&  echo Exist:$rule  ||  $iptables   -A   $rule

如果上述規則設定成功, 使用瀏覽器試試看,應該無法上網了.用 -D 可以刪除剛剛設定的規則:
    $iptables   -D   $rule

但 -D 只刪除第一個匹配到的規則,如果規則有重複,只會刪除第一個.如有需要可以執行 -D 多次直到刪除為止,或是用 -F 一次清除內部鏈條(但不含自訂名稱)所有的規則
    $iptables   -F  OUTPUT

用 -N 可以在表格自訂新鏈條,例如自訂一個有意義的鏈條名稱 OUTtcp:
     $iptables   -N   OUTtcp

一旦自訂鏈條名稱定義完成,就可以像正規鏈條一樣去定義規則:
     $iptables    -A   OUTtcp    -j   DROP

在相同表格內的自訂鏈條經由鏈條規範,使用選項 -j 當成目標(target)跳進去,例如:
     $iptables    -A   OUTPUT   -p   tcp   -j   OUTtcp

用 -X 可以清除自訂的鏈條(由 -N 指令去定義的鏈條),連同自訂鏈條名稱及規則都一併清除,如果 -X 後面不指定鏈條名稱,則清除全數自訂的鏈條:
    $iptables   -X   OUTtcp

用  -F  可以清除鏈條的規則,如果後面不指定表格,則只清除預設表格(-t filter)的鏈條規則(但不會清除自訂鏈條的名稱):
     $iptables   -F   OUTPUT

通常一開始要設定 iptables 時,不僅要清除所有鏈條(包含自訂的)規則,連計數器也都一併清除為零,避免被無端的規則所干擾.
清除預設表的自訂鏈條:
    $iptables   -X
清除預設表的鏈條規則:
    $iptables   -F
清除預設表的鏈條計數器:
    $iptables   -Z 

要注意的是由 -P 所設定的預設政策(預設是全數鏈條 ACCEPT 開放)並不會因為清除而重設,只要之前有設定好,它就會持續有效.常用的伺服器端口,可以檢查 /etc/services 檔案內容,就可以略知一二,它包含有 tcp 及 udp 兩種通信協定:
    cat /etc/services | more

在 linux mint 系統,有些內部的 porcess 可能會使用 udp 端口相互溝通,如果全擋,怕會無法運作,可以用 ifconfig 查一下對外 ip 的界面,目前查到的是 enp2s0,因此管制該網路界面的輸出鍊,就能抵擋大部分的網路運作了.先清除所有規則,設定好預設政策,再分別設定 tcp 及 udp 的規則,把不符合規則的端口都丟棄:
    $iptables   -F
    $iptables   -P   INPUT   ACCEPT
    $iptables   -P   OUTPUT   ACCEPT
    $iptables   -A   OUTPUT   -o  enp2s0   -p    tcp     -j    DROP
    $iptables   -A   OUTPUT   -o  enp2s0   -p    udp    -j    DROP 

這樣子就阻擋了對外所有網路第三層的 tcp/udp 通信協定.執行 ping www.google.com.tw 看看,應該無法得到回應.但若直接用 ping 168.95.192.1 卻是可以的, 那是因為 ip 屬於第二層通信協定.只要插隊設定一條輸出鏈(-I   OUTPUT)的規則,管制網路界面(-o   enp2s0)的通信協定(-p   udp),比對端口(--dport   53),確認行動(-j   ACCEPT):
   $iptables   -I   OUTPUT -o   enp2s0   -p   udp   --dport   53   -j    ACCEPT

把 udp 端口 53 打開,主機就能向DNS(Domain Name Server)查詢到 ip 位址,接著就會得到 ip/icmp 回應,但此時仍無法用瀏覽器瀏覽網頁, 因為 http 是用 tcp 端口 80, 而 https 是用 tcp 端口 443.為了一次開放多個 tcp 端口,可以插隊設定一條輸出鏈(-I OUTPUT)的規則,管制通信協定(-p tcp),調用匹配模組(-m multiport),比對離散端口(--dport 80,443),確認行動(-j ACCEPT):
   $iptables   -I  OUTPUT  -o   enp2s0   -p   tcp -m multiport   --dport   80,443   -j  ACCEPT

此時用瀏覽器上網應該就能暢行無阻了,對於其它 tcp  端口,例如 ssh 端口 22, ftp 端口 21 等都可依樣畫葫蘆自行設定規則,總結這次瀏覽網頁所需設定的規則,使用預設表格(-t filter):
    iptables='sudo iptables'
    $iptables   -F
    $iptables   -P  INPUT   ACCEPT
    $iptables   -P  OUTPUT   ACCEPT
    $iptables   -A  OUTPUT   -o  enp2s0   -p  tcp     -j    DROP
    $iptables   -A  OUTPUT   -o  enp2s0   -p  udp    -j    DROP
    $iptables   -I   OUTPUT   -o  enp2s0   -p  udp   --dport   53   -j    ACCEPT
    $iptables   -I   OUTPUT   -o  enp2s0   -p  tcp -m  multiport   --dport   80,443   -j  ACCEPT

nat 表格的轉向(REDIRECT)的功能.由插入 nat 表格事前輸入鍊(-I PREROUTING  -t nat)當範例,當從外部(-i   enp2s0)接收到的封包時,原本要傳給 tcp 端口 80(-p  tcp  --dport 80)的,事先改成(REDIRECT)端口 3128(--to-port  3128),之後才進主機作後續鏈條的處理(可先參考網址有關鏈條的流程會比較清楚脈絡: http://www.iptables.info/files/tables_traverse.jpg)
    $iptables -I  PREROUTING   -t   nat  -i   enp2s0  -p  tcp   --dport  80   -j   REDIRECT   --to-port   3128 

送出去的封包更換端口也可以透過轉向的功能,由插入 nat 表格的輸出鍊(-I OUTPUT -t nat)當範例,將原本要送出 tcp 端口 8888(-p tcp --dport 8888)的封包,換成(REDIRECT)端口 80(--to-port  80)後直接丟出去:
    $iptables -I  OUTPUT  -t   nat  -p   tcp  --dport   8888  -j   REDIRECT   --to-port   80

上述端口轉向並不一定會用到 ip 路由(Route)的功能,如果只是轉向特定端口,就不必將 /proc/sys/net/ipv4/ip_forward 打開.要將 linux 當作 ip 分享器,需利用超級使用者的權限開啟 ip_forward 的功能,再用 iptables 設定 nat 表格的事後鍊(POSTROUTING)把送出封包的來源位址(soure  ip)直接替換成主機位址,有兩種方式可以達成 ip 分享的目的:

第一個,當主機的位址是動態取得時,簡單設定 nat 表格的事後鍊(-A  POSTROUTING  -t  nat)讓 linux 內核把要送出去的封包(-o   enp2s0)自動改裝(-j MASQUERADE),變成 ip 分享器:
    sudo su
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables  -A 
POSTROUTING  -t  nat    -o   enp2s0    -j   MASQUERADE


另一個是當主機是固定位址時,把要送出去的封包(-o   enp2s0),直接用主機位址(假設 ip = 10.0.0.1)替換掉來源位址( -j SNAT --to-source),雖然麻煩一點,但速度較快:
    iptables  -A  POSTROUTING  -t  nat   -o   enp2s0   -j  SNAT --to-source 10.0.0.1 

如果要處理經 nat 改裝的封包,可以設定事前鍊(-A PREROUTING -t nat),由網路界面收到的封包(-i   enp2s0),事先更換封包的目標位址(-j  DNAT --to-desination)由主機(10.0.0.1)來取代,藉此將它轉給主機再作後續處理:
    iptables  -A  PREROUTING  -t  nat  -i   enp2s0   -j  DNAT --to-desination 10.0.0.1
.