︿
Top

前言

此為 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


文章標籤: