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