Li-Wen Hsu’s Blog

May 6th, 2007

FreeBSD Anonymous CVS over SSH Setup

什麼是 Anonymous CVS? OpenBSDOpenBSD AnonCVS 有很詳細的說明。
一般使用 anonymous CVS 的方法有兩種,pserver 和 over ssh,pserver 設定很簡單,照官方文件來就好;
而 over ssh 的會牽涉到 chroot(2) 的東西,比較複雜一點。
(我也在思考是否可以用 ~/.ssh/authorized_keys 裡的設定來達到這個效果,但是還沒有試出來,目前先能動就好)
OpenBSD 也提供一個 wrapper: http://www.openbsd.org/anoncvs.shar
解開來以後,照裡面的文件就可以將自己的 Anonymous CVS server 弄起來
FreeBSD 的 wrapper (ftp://ftp.freebsd.org/pub/FreeBSD/development/FreeBSD-CVS/anoncvs.shar)
基本上是從 OpenBSD 的 wrapper 改來的。

有趣的是,我們可以 dig 到 ftp.freebsd.org 有兩筆 A Record:

ftp.freebsd.org. 180 IN A 62.243.72.50
ftp.freebsd.org. 180 IN A 204.152.184.73

但是實際連進去看的時後,會發現只有 204.152.184.73 這台機器有 pub/FreeBSD/development/FreeBSD-CVS/anoncvs.shar
(喂喂… data 要保持 consistency 阿)

可惜的是,這兩份文件都已經過時,照上面的方法,是完全弄不起來的。連 anoncvssh.c 都沒辦法 compile。
麻煩的事情總是會大量消耗人體 CPU time,所以照 sched_hll(4) 的原則,這個 job 的 priority 就越來越低了….
(sched_hll — How Lazy Lwhsu Scheduler,請別相信我的鬼話…XD)
直到昨天晚上因為被雨困在實驗室,才再把這東西搞定。

  1. 首先,你要有一個正常 work 的 cvs mirror,這個在 Mirroring FreeBSDHow to Mirror FreeBSD 章節裡面說過了,本文不再贅述。以下假設你的 cvs mirror data 放在 /home/ncvs 下。
  2. 因為要用 ssh,為了要讓 anoncvs 可以不用密碼,我們要對系統預設的 ssh(8) 做些設定上的修改:
    /etc/ssh/sshd_config:

    PermitEmptyPasswords yes

    /etc/pam.d/sshd:

    auth required pam_unix.so no_warn try_first_pass nullok

    重新起動 sshd

    # /etc/rc.d/sshd restart

  3. vipw,加入 anoncvs 這個 user:

    anoncvs::32766:32766::0:0:Anonymous CVS User:/home/anoncvs:/home/anoncvs/anoncvssh

    當然別忘了,mkdir -p /home/anoncvs
    至於 group 的部份,加不加就沒那麼重要了。

    anoncvs:*:32766:

  4. 我改了一個 anoncvssh.c
    (希望不要有什麼問題,寫 setuid(2) 的程式總是叫人心驚膽顫,尤其這個還是要 setuid root 的 @_@)
    compile 好之後,放到 /home/anoncvs/anoncvssh ,並且將之 setuid root。
  5. 建立起必要的目錄和檔案,設定權限:

    # cd /home/anoncvs
    # touch .hushlogin .profile

    /home/anoncvs/.plan 放下面的東西:(不弄也不會怎樣)

    To use anonymous CVS in doing CVS operations on your local machine,
    first make sure you’re running a reasonably up-to-date copy of CVS
    (FreeBSD 2.2.5 or later) and then set the environment variable
    “CVSROOT” to anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs as follows:

    csh:

    setenv CVSROOT anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs

    sh/bash/ksh:

    CVSROOT=anoncvs@anoncvs.tw.FreeBSD.org:/home/ncvs
    export CVSROOT

    Then run your cvs commands as normal.

    建目錄們

    # mkdir -p home/ncvs lib libexec tmp usr/{bin,lib}
    # chown anoncvs tmp

    tmp 是為了給 cvs server 寫暫存檔用的,其他的目錄還是給 root:wheel 好

  6. 一定要有 ld-elf.so.1,不然什麼東西都不會動啦 XD

    # cp /libexec/ld-elf.so.1 /home/anoncvs/libexec/ld-elf.so.1

    usr/libexec 下的是個 symbolic link

    # ln -s /libexec/ld-elf.so.1

    chroot 以後會變成指到 /home/anoncvs/libexec/ld-elf.so.1 的。

  7. cvs 一定要搬過來:

    # cp /usr/bin/cvs /home/anoncvs/usr/bin

    看看 cvs 要什麼東西:

    $ ldd /usr/bin/cvs

    然後 /lib 的 cp 到 /home/anoncvs/lib 下,本來在 /usr/lib 的 cp 到 /home/anoncvs/usr/lib 下。

  8. 如果覺得上兩步很煩,丟個 static linked 的 cvs 到 /home/anoncvs/usr/bin 下我想應該也是可以的。

  9. 弄了這麼多,重要的就是這一步,要有東西給人家 check out :

    # mount_nullfs -o ro,noatime /home/ncvs /home/anoncvs/home/ncvs/

    還有為了要有 /dev/null :

    # mount_devfs devfs /home/anoncvs/dev/

    (沒有 devfs,mknod 造出來的 null device 不會動…)

  10. 大功告成,換台機器

    $ cvs -d anoncvs@xxx.xxx.xxx.xxx co <module>

    試試看結果吧。

Filed under: FreeBSD — lwhsu @ 09:09

May 4th, 2007

Ports Tree Frozen for Xorg 7.2 merge

故事是從這邊開始的:kris 昨天寫了一篇 HEADS UP: xorg upgrade plans
X11R7.2 終於要進 official ports tree 啦

今天早上, marcus 就把 ports repository 的 avail 改了,Ports Freeze 正式開始!

上面那些只是為了方便以後回來翻的 XD
最好笑的是在 #bsdports 上面的這句:

12:35 < @GeJ> Did someone send an email to miwi? I mean, I’m worried about his health. god knows what may happen if the guy doesn’t have his 80+ daily commits.

這個情形大概會持續好幾個星期吧(雖然 Guide 上面說通常是一到兩週,不過我覺得這次時間應該不會比以往 Release cycle 的時間短…必竟這次還要加個大怪物進去,不像以前只是要修 package building fail 的,不是那種實在不行就 mark broken 就好 XD)
所以,這段時間就乖乖地來寫論文好了…(應該會吧?)
(阿之前吃的一堆 PR 該怎麼辦呢?就…就…就先放著吧)
算算也差不多是是當上 Committer 滿月的日子 XD 順便把學到的東西記錄一下好了。

Fresh Ports Committer 的四個基本作業 :

  • Add a new port
  • 東西先丟到目的 category 下,像是 textproc

    Tools/scripts/addport -n -a -l 111267 -d py-hyperestraier-python

    一樣先把東西丟到目的 category 下,這次是 security
    不一樣的是, -l 後面要用 -1,代表沒有 PR

    Tools/scripts/addport -a -l -1 -d py-gnutls

    參考資料:clsung (mentor) 當年的筆記 [ports] add new port

  • Removing an Existing Port
  • 這也有寫好的 script 可以用,但是用別人寫的 script 總是怕怕的,這玩易兒為什麼老是要去把 ports repository 裡面所有東西都 check out 出來才甘心阿 @_@ (雖然也都被我 cancel 掉就是了…)

    ~/cvsroot/ports 下,其實也不一定要在這邊做啦…

    Tools/scripts/rmport devel/crossgo32 devel/crossgo32-djgpp2 devel/crossgo32-djgpp2-pdcurses

    然後寫寫 MOVED,寫寫 commit log 就可以送出拉。(現在到了真正要 ci 的時候還是會有點怕怕的…)

  • Repository Copies
    這個其實不難,大意就是把皮球踢給 portmgr XD
    詳情看 Committer’s Guide 裡面 Repository Copies 的部份
    步驟簡單整理如下:

    1. change State 為 repocopy 還有 change Responsible 為 portmgr
    2. 記得要在 Why: 那邊寫清楚要把什麼 copy 到那邊去,不然會被 portmgr 罵 @_@

    3. portmgr 做完之後就會被 assign 回來,這時候裡面的東西除了檔名以外都是舊的,所以就像平常一樣快快樂樂 update 就好 :D
    4. 其它地方的東西該改的改一改,這次就差點忘了要去加 lang/Makefile 裡面的 SUBDIR,還有 CVSROOT 裡面的 modules
    5. 還好是在 Ports Tree Frozen 之前想起來,不然到時候還要找 portmgr Approve 事情就複雜了…

    作業成果:ports/112223: [NEW PORT] lang/gnat-gcc42
    注意到了嗎?Responsible Changed 裡面有個 :

    lwshu->lwhsu

    我在 Big5 的世界會因為許的關係受到很多不公平的對待…想不到 ASCII 的世界也對我不好阿…
    之前 gnn 在 irc 上面也是把我名字叫錯好幾次…Orz
    (不過學到了一句話 “blames his keyboard” XD)

  • Regular port update
  • 這就沒有什麼太多好說了,大概做的事和以前做得差不多,反正就是改改改,tinderbox testing,過了就 ci,porttools 很好用,請多愛用。That’s all.
    阿對了,還有也可以處理別人的 PR,tinderbox testing 不過就退稿 XD

大致上就是這些工作啦,Mk/ 下面的東西,小朋友沒事不要亂動。據說新手要等到那天把 ports INDEX break 了才可以從 mentorship 裡面被放出來…大概就跟拔到獅子的鬃毛就會長頭髮的道理一樣吧 XD

References:

Filed under: FreeBSD — lwhsu @ 23:10

October 11th, 2006

Resource Limits

剛剛, 商業團體的 ieon (在msn) 還有 far (在 IRC) 問,
有沒有辦法限一個 process 的 resource limits

直覺上是用 limits 限單一 user,從 /etc/login.conf 也是差不多,
要執行程式前用個 wrapper 把 process 變成受限的 user
這樣的解法感覺上不是相當漂亮。

IRC 上,mhsin 提到了 setrlimit(2) 然後也是用 wrap 的方法,
不過 kcwu 說,用 limits(1) 就可以
(果然 manpage 要多看,我一直以為 limits 是要設 global value 的…)

不過這個方法是限,cpu time,也就是 top(1) 時看到的 TIME 那欄

我比較好奇的是,有沒有限 WCPU (weighted cpu percentage) 的方法?

之前 openfoundry 那邊用 jail 也是有 resouce limits 的問題,
就是關於 WCPU 的部份 (似乎是 moztw.org 造成的問題 XD)
這在今年的 SoC 有了初步的成果:

而作者(Chris Jones)在 FreeBSD WikiJailResourceLimits 提到:

This system does not prevent a jailed process from monopolizing the CPU when there are no other runnable processes; rather, it only prevents a jail from using more CPU time than its share if there are other jailed processes (in which case they will tend to share CPU time in proportion to their respective CPU share allocations).

雖然不能限制單一 process 占據整個 cpu, 不過一想, 整台電腦就只有他在吃cpu時,
就給他吃嘛 :)

Filed under: FreeBSD, OS, Computer — lwhsu @ 02:43

Powered by WordPress