BSD Hacks 讀書心得 - Chapter 2

前言

此為 BSD Hacks 一書中,第二章的讀書心得以及相關 Hacks 技巧的小小實作。



文章目錄

前言
Hack 13. Find Things
Hack 18. DOS Floppy Manipulation
Hack 21. Manage Temporary Files and Swap Space



Hack 13. Find Things

Which --- locate a program file in the user's path:在使用者的路徑 (echo $path) 中尋找該程式。
 > which cp
 /bin/cp

Whereis --- locate programs:找尋程式位置 (二進位檔 -b、說明檔 -m、原始程式 -s)。
 > whereis cp
 cp: /bin/cp /usr/share/man/man1/cp.1.gz /usr/src/bin/cp

Whatis --- search the whatis database:查詢某個指令的用途。
 > whatis cp
 cp(1) - copy files

Find --- walk a file hierarchy:尋找檔案。
 > find . -name bac   //尋找所在目錄下檔名為bac
 ./test/bac

Grep --- print lines matching a pattern:尋找檔案內關鍵字。
 > grep -n NO /etc/rc.conf   //列出/etc/rc.conf內有NO這個關鍵字內容並顯示行數
 7:usbd_enable="NO"




Hack 18. DOS Floppy Manipulation

 > less /etc/fstab       //查看一下 fstab 您可看到目前檔案系統


Device:先了解 /dev 下裝置代號分別為哪些硬體裝置,其中要注意的是一個 HDD 最多僅可以有四個切割區 (即最多可裝 4 個 OS),每個切割區最多可以有八個分割區 (也就是 Mount Point)。
  • /dev/fd*:Floppy
  • /dev/acd*:IDE CD-ROM
  • /dev/ad*:IDE HDD
  • /dev/cd*:SCSi CD-ROM
  • /dev/da*:SCSI HDD


Mountpoint:列出各掛載點 (也就是像 /usr、/var 這些目錄掛載點)。
FStype:也就是 FileSystem Type (檔案系統類別)。
  • ufs:FreeBSD 分割區 (Unix Fast Filesystem)
  • mfs:記憶體檔案系統 (Memory File System)
  • nfs:Network File System
  • msdos:>FAT 分割區 (也就是 DOS/Windows 9x 檔案系統)
  • ntfs:NTFS 分割區 (Windows NT/2000/XP 等檔案系統)
  • cd9660:ISO-9660 為標準 CD-ROM 檔案系統
  • ext2fs:Linux 檔案系統


Options:掛載選項,也就是核心以何種方式處理檔案系統。
  • ro:唯讀方式掛載或用 rdonly 也可 (就算是 root 也無法寫入,優點是突然斷電或硬體故障時資料還是完好地保存著)。
  • rw:可讀寫方式掛載。
  • sync:同步掛載 (也就是以同步方式寫入,優點是在系統崩潰時可提供最大的資料可信度,用於重要資料上)。
  • async:非同步掛載 (即以非同步方式寫入,優點是寫入存取速度非常快,用於常變動非重要資料上)。
  • noauto:開機時不會自動掛載 (適用於 Flloppy、CD-ROM,若沒加此選項則會因為開機時 Flloppy 或 CD-ROM 內沒東東而造成停在 Single-User Mode)。
  • noasync:結合了 sync 與 async 的方法 (影響 inode 資料則同步寫回磁碟,但實際資料為非同步寫入)。


Dump:用來告訴 dump 程式是否要 dump 起來。
  • 0:不會 dump 該檔案系統。


Pass:告訴系統在開機程序哪時要掛載系統檔案。
  • 0:不會在開機時自動掛載。
  • 1:開機時第一個掛載。
  • 2:在 1 (也就是/) 掛載完後才進行掛載。


指令範例
mount /cdrom        //掛載 CD-ROM 因為 /etc/fstab 已有設定因為只要執行此指令即可掛載 CD-ROM
mount -t cd9660 /dev/acd0 /cdrom  //若 /etc/fstab 內沒設定就執行此指令來掛載 CD-ROM 或下一行指令也可
mount_cd9660   /dev/acd0 /cdrom   //掛載 CD-ROM 方法二
umount  /cdrom          //卸載 CD-ROM
mount -o rdonly /usr    //設定掛載 /usr 並使用唯讀掛載
mount -f /usr           //強制掛載 /usr (有些分割區或許發生問題所以寫入前必須先 fsck 但若不想執行 fsck 可採用 -f 強制掛載)
mount -a                //掛載所有列於 /etc/fstab 內的檔案系統




補充
預設只有 root 能掛載 (mount) 檔案系統,若要讓使用者也能掛載檔案系統需執行如下指令。
sysctl vfs.usermount=1
 vfs.usermount: 0 -> 1

編輯自動 Format Floppy Process。
 %echo $path     //確定您的 path 有載入 $Home/bin,若您的家目錄沒有 bin 資料夾就建立它吧
 $HOME/bin

編輯檔案名稱為 ff 內容如下:
 %vi ff          //編輯檔案名稱為 ff 內容如下
#!/bin/sh
#this script formats a floppy with FAT12
#that floppy can also be used on a Windows system
#first, remind the user to insert the floppy
 echo "Please insert the floppy and press enter"
 read pathname
#then, proceed with the three format steps
 fdformat -f 1440 /dev/fd0
 bsdlabel -w /dev/fd0 fd1440
 newfs_msdos /dev/fd0
 echo "Format Complete."

記得加上 x 權限讓 ff 能執行。
 % chmod +x ff           //記得加上 x 權限讓 ff 能執行



Hack 21. Manage Temporary Files and Swap Space

本章的重點在於管理 Temporary Files 也就是 /tmp 及 Swap Space。

管理 /tmp 方式一:開機時清空 /tmp

以下設定完成後當系統重新開機時將會自動清空 /tmp 資料夾內所有檔案。
 % vi /etc/rc.conf         //修改 rc.conf 加入如下一行
 clear_tmp_enable="YES"



管理 /tmp 方式二:定期清空 /tmp

定期自動清空 /tmp,因為 /etc/periodic/daily 內的 110.clean-tmps 預設是不啟動的,所以可透過修改 periodic.conf 來達成每日自動清空 /tmp 的目地。
 % vi /etc/default/periodic.conf   //將 110.clean-tmps 由 NO 修改為 YES
 daily_clean_tmps_enable="YES"      



管理 /tmp 方式三:搬移 /tmp 至 Memory

將原本存在於硬碟的 /tmp 資料夾轉移存放至 Memory 來達成管理 /tmp 的目的?因為 Memory 的內容是易變的也就是當你重新啟動時 (系統會清空 Memory 的內容),也就能達成自動清除 FileSystem 的優勢。並且可以提高清除及處理效率因為 Memory 存取時間遠比硬碟存取時間快。

先確認您有足夠的 Memory 來執行這動作。
 % dmesg |grep memory                      //適用於剛開機沒幾天
 % less /var/run/dmesg.boot |grep memory   //適用於開機很久沒關機過的

確定您的核心 (Kernel) 是有支援 MD (Memory Disk) 功能,下例我的核心 (Kernel) 名稱叫 newkernel。
 % grep -w md /usr/src/sys/i386/conf/newkernel
 device          md     #Memory "disks"         //確定核心中 MD (Memory Disk) 功能並未註解掉

修改 /etc/fstab 以達成搬移 /tmp 至 Memory,下例為 Mount 64MB /tmp 至 Memory。
 % vi /etc/fstab
 /dev/ad0s1e   /tmp      ufs   rw           2    2     //修改前
 md            /tmp      mfs   rw,-s64m     2    0     //修改後

重新掛載 /tmp 即可。
 % umount /tmp     //若無法 umount 則 sync 後 reboot
 % mount /tmp
 % df -h /tmp      //查看 /tmp 掛載的變化
 /dev/md0            63M    36K    58M     0%    /tmp



擴充 Swap 空間

這方法我想適用於當您發現當初規劃的 swap 空間不敷使用時想增加 swap 空間應該如達成呢?以下就是在 /usr 下切一個空間來跟本來的 swap 相加,以下實作方法適用於 FreeBSD 5.x 而使用 FreeBSD 4.x 的朋友,請參考 Handbook Chapter 12.15 Configuration and Tuning。使用 swapinfo 或 swapctl -lh 查看目前 swap 空間二者差異在於 swapctl 加上 -lh 顯示單位為 MB。

swapinfo 顯示 KB
 % swapinfo    
 Device          1K-blocks     Used    Avail  Capacity
 /dev/ad0s1b        498472    16344   482128     3%

swapctl -lh 顯示 MB
 % swapctl -lh
 Device:       1048576-blocks      Used:
 /dev/ad0s1b          486               15

建立 128MB swapfile 於 /usr/swap0
 % dd if=/dev/zero of=/usr/swap0 bs=1024k count=128
 128+0 records in
 128+0 records out
 134217728 bytes transferred in 4.405036 secs (30469156 bytes/sec) 

修改 /usr/swap0 權限
 % chmod 600 /usr/swap0
使剛才建立的 /usr/swap0 馬上生效,以下為參數說明:
  • -a:數為指定 memory disk
  • -t:vnode 告訴系統這是 swapfile 而不是 filesystem
  • -f:/usr/swap0 設定要成為 swapfile 名稱
  • -u:-1 指定使用 memory disk 裝置名稱為 /dev/md1
  • && swapon:告訴系統啟用 swap device

執行下列指令來使 /usr/swap0 馬上生效。
 % mdconfig -a -t vnode -f /usr/swap0 -u 1 && swapon /dev/md1 
修改 /etc/rc.conf 以便系統重新開機時便自動啟動 /usr/swap0。
 % vi /etc/rc.conf
 swapfile="/usr/swap0"         //加入此行

完成後可在利用 swapinfo 或 swapctl -lh 查看目前 swap 容量。

swapinfo 顯示 KB
 % swapinfo
 Device       1K-blocks   Used    Avail     Capacity
 /dev/ad0s1b  498472      16344   482128     3%
 /dev/md1     131072      18336   112736    14%
 Total        629544      34680   594864     6%

swapctl -lh 顯示 MB
 % swapctl -lh
 Device:       1048576-blocks      Used:
 /dev/ad0s1b         486             15
 /dev/md1            128             17

也可利用 systat -swap 1 來隨時觀察 swap space 使用情形 (1 為更新秒數間隔)。
 % systat -swap 1
                /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
 Load Average   ||||
 Disk 1K-blocks Used  /0%  /10% /20% /30% /40% /50% /60% /70% /80% /90% /100
 ad0s1   498344 30976  XXXX
 md1     130944 32560  XXXXXXXXXXXXX
 Total   629288 63536  XXXXXX