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

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

Powered by WordPress