顯示具有 FreeBSD 標籤的文章。 顯示所有文章
顯示具有 FreeBSD 標籤的文章。 顯示所有文章

2012/10/18

FreeBSD 系統時鐘停擺

因為連續幾次 FreeBSD 上的系統時鐘停擺,連續幾次 date 秒數都不會變,機器上不少服務都爛掉,核心重編後問題還是會發生。

後來在 FreeBSD 論壇上一討論串上看到不少人有遇到相同問題,原因是 VMware 上的一個 bug 導致 timecounter HPET 發生錯誤:

PR887134: Timer stops in FreeBSD 8.x and 9.x as virtual hardware HPET main counter register fails to update due to comparison failure between signed and unsigned integer values.

ESX 已經有釋出 patch。我用的是 workstation,似乎是還沒有發佈更新。


暫時換一下 timecounter 看看問題會不會發生。

先看看系統上有哪些 timecounter 可以使用:
~$ dmesg | grep counter
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounter "HPET" frequency 14318180 Hz quality 900
Timecounter "ACPI-safe" frequency 3579545 Hz quality 850
Timecounters tick every 10.000 msec

sysctl 檢查目前 timecounter:
$ sysctl kern.timecounter.hardware
kern.timecounter.hardware: HPET

換成 ACPI-safe:
$ sysctl kern.timecounter.hardware=ACPI-safe
kern.timecounter.hardware: HPET -> ACPI-safe

開機自動設定,開啟 /etc/sysctl.conf 並加入:
kern.timecounter.hardware=ACPI-safe

2012/01/28

Prevent configuration while making ports on FreeBSD

在 FreeBSD 裝 ports 時,有些 ports 會需要 make config。

若 ports 很大 (像 KDE 之類的),make 一次不知道就要按多少次 ok 才會繼續動作。但又不是閒閒整天都做在電腦前等著按 ok。

在 man 7 ports 裡面有提到,設定環境參數 BATCH,系統就會使用預設值做編譯,可以省掉不少麻煩。

set BATCH in tcsh:
setenv BATCH yes

設定好之後,大部分的 make config 就會使用預設值並自動往下做。



參考資料:
How can I avoid the prompts when installing a FreeBSD port?
http://unix.stackexchange.com/questions/5257/how-can-i-avoid-the-prompts-when-installing-a-freebsd-port

2011/09/23

Ruby Passenger with Nginx on FreeBSD

事實上 FreeBSD 安裝很簡單,ports 都整理好了:
cd /usr/ports/www/rubygem-passenger
make config  # "Use Nginx"
make install clean


不過這次因為 Redmine 卡在套件版本相依性,除了 Ruby 從 ports 裝,其他 RubyGems、Rails、Rake 都沒用 ports。好險裝 passenger 再編譯 nginx 模組沒想像中的困難。

安裝 passenger:
gem install passenger

裝好後 passenger 的資料會在 /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.9/ 目錄下,nginx 模組的程式碼會在底下的 ext/nginx/。

找到以後就可以準備編譯 nginx。到 /usr/ports/www/nginx 目錄下編輯 Makefile,在「CONFIGURE_ARGS」後加上 --add-module 參數:
CONFIGURE_ARGS+=--prefix=${ETCDIR} \
      --with-cc-opt="-I ${LOCALBASE}/include" \
      --with-ld-opt="-L ${LOCALBASE}/lib" \
      --conf-path=${ETCDIR}/nginx.conf \
      --sbin-path=${PREFIX}/sbin/nginx \
      --pid-path=${NGINX_RUNDIR}/nginx.pid \
      --error-log-path=${NGINX_ERRORLOG} \
      --user=${WWWOWN} --group=${WWWGRP} \
      --add-module=/usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.9/ext/nginx

接著 make install clean 便會自動將 passenger 模組編譯進去。


最後修改 nginx.conf:
http {
   ...
   passenger_root  /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.9;
   passenger_ruby  /usr/local/bin/ruby;
   passenger_max_pool_size  10;
   ...
   server {
      listen 80;
      server_name  my.site;
      root /path/to/my/site;
      passenger_enabled on;
      passenger_use_global_queue on;
   }
}


參考資料
Installing Passenger Nginx module on FreeBSD
http://www.snippety.org/articles/2009/05/16/installing-passenger-nginx-module-on-freebsd/


Phusion Passenger users guide, Nginx version
http://modrails.com/documentation/Users%20guide%20Nginx.html

2011/04/20

FreeBSD 使用者資源限制

之前某堂課讓大家到學校的大型主機寫程式,有些人大概想試試看大型主機到底有多強,就弄了個迴圈下去跑:
while( 1 )
   fork();

高級的 server 果然不一樣,load avarage 衝到幾百都還活著,問題是別人上機考就爆了。

FreeBSD 中有個設定檔在 /etc/login.conf 可以限制使用者 CPU、記憶體和程序的使用,印象中預設是的吧。設定檔中有少可以使用的參數:

  • coredumpsize:core dump 最大值
  • cputime:最大 CPU 時間
  • datasize:最大記憶體使用量
  • filesize:單一檔案最大體積
  • stacksize:單一程序最大可使用 stack 大小
  • maxproc:最大可執行程序量
  • memoryuse:單一程序最大記憶體使用量
  • vmemoryuse:單一程序最大虛擬記憶體使用量
  • openfiles:單一程序最大可開啟的檔案數量

詳細說明還是手冊最詳細。

13.7 使用者資源限制 - FreeBSD 使用手冊
http://www.freebsd.org/doc/zh_TW/books/handbook/users-limiting.html

2011/03/16

在 FreeBSD 中使用 ramdisk 編譯 ports

再次想不開在 FreeBSD 底下編譯 KDE。

希望速度能夠加快,使用 4 核心機器並加大記憶體,參考餅乾之前的文章「用 ramdisk 加速 freebsd 編譯 ports 的速度」,配了 2GB 的記憶體拿去塞 obj。

不過這次還是沒能讓 CPU 跑到 100%,感覺還是卡在 IO。

在編譯 KDE library 的時候 CPU 停頓很久,用 iostat 看到有實體硬碟的 IO (不過只有 3MB/s 左右),才想到編譯新的 lib 時會 dep 到已經安裝的 lib。另外編譯時 cc1plus 用掉了 1.7GB 的 SWAP 使整體速度又往下掉了不少。

這次 make install KDE4 比上一次快好多,扣掉等待 make config 的時間還不到一天!

2010/09/04

Install Nginx + PHP-FPM on FreeBSD

因為老舊機器跑 Apache 實在太費力了,不少朋友都推薦 Nginx 來取代 Apache。網路上不少效能測試也顯示 Nginx 使用的系統資源比較少。

Install Nginx from ports:
cd /usr/ports/www/nginx
make config   # select modules you want
make install clean

Install php52 from ports:
 cd /usr/ports/lang/php52
make config   # Enable FPM
make install clean

安裝 PHP-FPM (Fastcgi Process Manager) 後,在 /etc/rc.conf 加入啟動設定並啟動 php-fpm:
echo php_fpm_enable=\"YES\" >> /etc/rc.conf
/usr/local/etc/rc.d/php-fpm start

依照預設值 FPM 會 listen port 9000,可以用 sockstat 看一下是否啟動成功:
$ sockstat
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
www      php-cgi    2736  0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    2735  0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    2734  0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    2733  0  tcp4   127.0.0.1:9000        *:*
www      php-cgi    2732  0  tcp4   127.0.0.1:9000        *:*
root     php-cgi    2731  4  stream -> ??
root     php-cgi    2731  5  stream -> ??
root     php-cgi    2731  6  tcp4   127.0.0.1:9000        *:*

若要修改 listen port 可以開啟 /usr/local/etc/php-fpm.conf,搜尋「listen_address」,設定檔是以 XML 的方式撰寫,把 127.0.0.1:9000 改成自己要得即可。

修改 Nginx 設定檔 /usr/local/etc/nginx/nginx.conf,大約在 60 行左右可以看到「pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000」,將該段落的設定檔取消註解。

另外 Nginx 設定檔有個很怪的地方,就是 fastcgi_param 的預設值不是在網頁目錄底下,要將後方的「/scripts」改成「/usr/local/www/nginx-dist」,這樣 Nginx 才會將網頁目錄底下的 PHP 程式交給 FPM 執行。

設定完畢存檔,/usr/local/etc/rc.d/nginx start 啟動 nginx 就可以弄個 phpinfo 來測試了。

2010/08/03

PHP 加速 on FreeBSD (pecl-APC)

這次為了 Wordpress 3.0 花了不少時間搞 tuning,後來 cookys 大大跟我說 eaccelerator 效果不大,可以改用 APC 加速。

Install APC on FreeBSD:
cd /usr/ports/www/pecl-APC/
make install clean

安裝好以後修改 php.ini,參數在 /usr/local/share/doc/APC/INSTALL 有詳細說明。
apc.enabled=1  ; 1 as enable, 0 as disable
apc.shm_segments=1  
apc.shm_size=128  ; Shared memory size in MB
apc.ttl=7200  ; TTL for cache
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX  ; 6 個 X 請勿修改
apc.enable_cli=1

設定完畢後重新啟動 Apache。

使用 phpinfo() 後若看到 APC 相關資訊表示 APC 已經可以使用。接著複製 apc.php 到 www 目錄下並設定帳號密碼,便可以查看 APC 的統計資訊:
cp /usr/local/share/doc/APC/apc.php /usr/local/www/apache22/data/

設定帳號密碼:
defaults('ADMIN_USERNAME','user_id');
defaults('ADMIN_PASSWORD','user_password');




左方圓餅圖代表記憶體情況,右方 Hits 代表使用到快取,Miss 表示要求的程式不在快取內。

安裝好 APC 後自己拿 JMeter 做測試,Wordpress 3.0 的首頁在安裝 APC 後大概快了 200 ~ 500ms 左右,感覺算快了不少,不過一部分原因是 JMeter 設定全部都跑去抓首頁,建議加上亂數元件讓 JMeter 隨機讀取網頁會更準。

參考資料:安裝 PHP APC 加速網頁速度 | 小惡魔
http://blog.wu-boy.com/2008/06/05/275/

2010/06/26

Redmine 更新

主機一陣子沒更新,看到 SA 通告心裡毛毛的跑了一下 portmaster -a,然後我後悔了 .... Orz

將 Rails 從 2.3.5 更新到 2.3.8,config/environment.rb 裡面的設定也要跟著改:
RAILS_GEM_VERSION = '2.3.8' unless defined? RAILS_GEM_VERSION

另外最慘的是 RMagick 更新速度似乎趕不上 ImageMagick,將 ImageMagick 更新到 6.6.1.10 後 RMagick 卻噴錯誤訊息說版本不合,gem update 好幾天都沒看到更新。

後來手殘弄錯東西只好 pkg_delete -af。從頭來過後 passenger 噴錯誤訊息,發現 Ruby 有新增不少功能,要在設定檔裡面另外多設定幾個參數
config.action_controller.session =  { :session_path => '/path/to/webApp' }
config.action_controller.session =  { :session_key => 'key_prefix' }
config.action_controller.session =  { :key => "_myapp_session", :secret => "some phrases" }

2010/06/04

PHP 5.3 函式被標記為「Deprecated 」

前陣子 portmaster -aDG 以後一堆服務噴「function deprecated」,後來才知道 /usr/ports/lang/php5 目前是 PHP 5.3,更新後有不少函式被標記為 deprecated

PHP 5.2 在 FreeBSD Ports 有另外被分出來放在 /usr/ports/lang/php52,先將原有的 make deinstall 再到 php52 make install clean 即可。

ps. 小弟無知,以後不敢隨便更新了 Orz

2010/04/22

Install Redmine in FreeBSD

以下全文轉錄、修改自:FreeBSD上でRedmineを試してみる - FileMakerとPHPのメモ
http://d.hatena.ne.jp/unam-h/20080501/1209642442

Redmine 是用 Ruby 撰寫成的專案管理系統,支援項目追蹤、工時追蹤、Wiki、版本控管、討論區等功能。不過因為沒有用過 trac 系統,沒辦法為大家做比較,若有朋友用過歡迎提供意見。

FreeBSD 較新的 ports 中有納入 Redmine:/usr/ports/www/redmine,但是自己從 make install 後到看官方說明書安裝仍然中途出錯失敗,所以參考其他方式安裝。

先到欲安裝的位置用 SVN 將 source code 取出:
svn co http://redmine.rubyforge.org/svn/tags/0.9.3/ redmine

然後建立資料庫設定檔:
cp config/database.yml.example database.yml
vim database.yml

修改資料庫帳號密碼:
production:
  adapter: mysql
  database: db_name
  host: db_host
  username: user
  password: password
  encoding: utf8

執行 rake 設定:
rake db:migrate RAILS_ENV="production"
rake redmine:load_default_data RAILS_ENV="production"

以上設定若沒有出現錯誤訊息,執行下面的指令可啟動伺服器:
ruby script/server -e production

伺服器預設是在 localhost:3000 上,用瀏覽器連到 3000 port 若有看到系統畫面便表示安裝成功。


接下來安裝 rails 和 passenger 讓伺服器可以掛在 Apache 上:
gem install rails --version 2.0.2
gem install passenger

接著建立 Apache mod:
passenger-install-apache2-module

在 httpd..conf 上加入 passenger module:
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11
PassengerRuby /usr/local/bin/ruby18

重新啟動 Apache。


建立 Virtual Host 時,只要將網址的位置設定在 Redmine 的 public 位置即可:
<VirtualHost *:80>
        ServerAdmin my@mail
        DocumentRoot /home/user/redmine/public
        ServerName redmine.my.url

        <Directory /home/user/redmine/public>
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
        </Directory>
</VirtualHost>

2010/03/20

Change sendmail to Postfix in FreeBSD

/etc/rc.conf :
sendmail_enable="NONE"
sendmail_flags="-bd"
sendmail_pidfile="/var/spool/postfix/pid/master.pid"
sendmail_procname="/usr/local/libexec/postfix/master"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"


/etc/periodic.conf :
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

Create packages by pkg_create in FreeBSD

因為手上有超過二台的主機是安裝 FreeBSD,因為 FreeBSD ports collection 一向都是要自己 make install,安裝大型套件會花不少時間編譯。

之前餅乾提到可以用 pkg_create 建立套件備份,然後直接拿去另一台做 pkg_add,這次重灌寫了個批次檔來測試,不過因為 shell script 不熟可以說繞了一大段遠路:
#!/usr/local/bin/bash
echo "Listing packages .... "
pkg_info | tee pkg_info.log | wc -l
mkdir pkg
awk '/.*/ {print "pkg_create -v -b " $1 " pkg/" $1  }' pkg_info.log > pack.sh
rm pkg_info.log

# Start to create package
echo "Creating packages .... "
chmod +x pack.sh
./pack.sh
rm pack.sh

# Start to tar
echo "tar .... "
tar -cf pkg_back.tar pkg/
echo "Creating MD5 checksum .... "
md5 pkg_back.tar > md5sum.log

# Clean
echo "Cleaning temp files .... "
rm -fr pkg/

將打包好的套件檔複製到另一台電腦,解壓縮後就可以使用 pkg_add 安裝套件:
> pkg_add `find ./pkg/ -name "*.tbz"`

pkg_add 時應該會看到一堆相依性的錯誤訊息,這是因為套件沒有按照順序安裝引起的,至於要如何檢查安裝完畢後相依性套件是否有正確安裝,等以後想到方法再補齊吧。

2010/01/25

FreeBSD 壞軌處理方式

壞軌時可能會看到「TIMEOUT : Write_DMA / Read_DMA」的錯誤訊息,情況好的時後 retry 成功會繼續,壞軌嚴重的話看到這個訊息可能直接當機。

建議儘快把硬碟拆下來,到另一台裝有 FreeBSD 的機器上救資料 (Linux 一般對 UFS 只支援到讀取,之前在 Ubuntu 掛載失敗)。FreeBSD 內建 recoverdisk 工具讀取有損壞的硬碟,和 dd 一樣都是以低階的方式讀取資料,但是 recoverdisk 除了會顯示 status 以外,在遇到壞軌時會先記錄並跳過,等到整個磁區或磁碟讀取完成後,在以較小的 block 去讀取有損壞的磁區。

# recoverdisk /dev/bad_disk disk_dump.img

讀取完成以後可以掛載使用:
# mdconfig -a -t vnode -f disk_dump.img
md0
# mount /dev/md0s1a /media/disk

2010/01/23

Install htop in FreeBSD

make install in /usr/ports/sysutils/htop will get an error message :
***********************************************************
htop(1) requires linprocfs(5) to be mounted. If you don't
have it mounted already, please add this line to /etc/fstab
and run `mount linproc`:
linproc /compat/linux/proc linprocfs rw 0 0
***********************************************************

By message :
$ echo "linproc /compat/linux/proc linprocfs rw 0 0" >> /etc/fstab
$ mount linproc

Then make install again.

2010/01/22

硬碟炸了

上週學校主機突然當掉,請朋友重新開機還是沒起來。回到學校自己開機可以跑,但是跑了幾個小時以後又掛了,跳出一些錯誤訊息:
ad0: FAILURE - READ_MUL, status=51 error=4 , LBA=191g_vfs_done() , ad0s1 [READ] error=5
error issuing READ_DMA command
exec /sbin/init : error 5

在 PTT 上面爬了文,感覺情況並不是很樂觀,看起來應該是硬碟差不多要換新了。明天拿個開機光碟 mount 看看,不行的話就想辦法救資料吧。

ps. 原來乖乖被老鼠吃掉會當機,乖乖「全部」被吃掉硬體會掛.........。

2010/01/06

修改 screen 視窗上限

上限不在 .screenrc 設定檔內,而是放在 config.h 程式碼當中,將以下設定修改後重新編譯:
/* 
* Maximum of simultaneously allowed windows per screen session. 
*/ 
#define MAXWIN 100

轉貼來源:改 gnu screen "窗" 的數量
http://www.monster.com.tw/archives/1657

2009/12/27

FreeBSD 安裝步驟


用光碟開機,並載入開機程式



選擇鍵盤排列方式,一般選擇美式鍵盤就可以



選擇 Standard Installation



磁碟分割,使用整個硬碟可直接按 A - Q



是否要安裝 Boot Manager



設定掛載點,一般可以直接按 A - Q 使用預設值


若是 FTP Server 建議將 /home 目錄分開以便設定 quota;若是 Web Server 建議將 www 分開掛載,/var 目錄也應該多流一些空間給 Databases,免得塞爆以後讓系統掛彩。



選擇要安裝的環境,不需要圖形介面的話可直接選擇 Developer



是否需要安裝 ports collection,不安裝就不是 FreeBSD 了啊 XD



選擇安裝位置,一般可以直接從 CD 安裝;選擇網路安裝則會先設定網路 (DHCP or Static IP)



安裝要一段時間,可以去喝杯茶在回來看



準備設定網路,設定好以後就可以 SSH 登入,離開該死的機房



選擇電腦的網路卡



如果選擇 DHCP 則會自動填上部份資料,沒有的話請自行輸入



SSH 是一定要的啊!



安裝 linux_base 可以模擬執行 Linux 上的程式



新增一個使用者,如果要讓這個使用者可以 su 成 root,記得加入 wheel 群組



設定完 root 以後就差不多大公告成了


接下來就可以使用 ports 或是 pkg_add 安裝套件,/etc/make.conf 設定可以參考「FreeBSD make.conf」,要安裝 FAMP 環境可以參考「FAMP:FreeBSD + Apache + MySQL + PHP」。

2009/10/09

設定檔 .cshrc

Be lazy:
alias ll        ls -lAG
alias ls        ls -G

UTF-8:
setenv LANG zh_TW.UTF-8
setenv LC_ALL zh_TW.UTF-8
setenv LC_CTYPE zh_TW.UTF-8
setenv MM_CHARSET utf8

2009/09/27

net-snmp error on FreeBSD

Error message :
/libexec/ld-elf.so.1:
/usr/local/lib/perl5/site_perl/5.8.9/mach/auto/NetSNMP/default_store/default_s\
tore.so:
Undefined symbol "Perl_Gthr_key_ptr"
*** Error code 1

Stop in /usr/ports/net-mgmt/net-snmp/work/net-snmp-5.4.2.1.
*** Error code 1

I reinstall perl-5.8 but no use. Finally, I solve the problem by un-checked the option "Use 64 bit integers (on i386)" before compiling perl in the make config menu.