FreeBSD Anonymous CVS over SSH Setup
什麼是 Anonymous CVS? OpenBSD 的 OpenBSD 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)
直到昨天晚上因為被雨困在實驗室,才再把這東西搞定。
- 首先,你要有一個正常 work 的 cvs mirror,這個在 Mirroring FreeBSD 的 How to Mirror FreeBSD 章節裡面說過了,本文不再贅述。以下假設你的 cvs mirror data 放在 /home/ncvs 下。
-
因為要用 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
-
vipw,加入 anoncvs 這個 user:
anoncvs::32766:32766::0:0:Anonymous CVS User:/home/anoncvs:/home/anoncvs/anoncvssh
當然別忘了,mkdir -p /home/anoncvs
至於 group 的部份,加不加就沒那麼重要了。anoncvs:*:32766:
-
我改了一個 anoncvssh.c。
(希望不要有什麼問題,寫 setuid(2) 的程式總是叫人心驚膽顫,尤其這個還是要 setuid root 的 @_@)
compile 好之後,放到 /home/anoncvs/anoncvssh ,並且將之 setuid root。 -
建立起必要的目錄和檔案,設定權限:
# 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 CVSROOTThen run your cvs commands as normal.
建目錄們
# mkdir -p home/ncvs lib libexec tmp usr/{bin,lib}
# chown anoncvs tmptmp 是為了給 cvs server 寫暫存檔用的,其他的目錄還是給 root:wheel 好
-
一定要有 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 的。
-
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 下。
-
弄了這麼多,重要的就是這一步,要有東西給人家 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 不會動…)
-
大功告成,換台機器
$ cvs -d anoncvs@xxx.xxx.xxx.xxx co <module>
試試看結果吧。
如果覺得上兩步很煩,丟個 static linked 的 cvs 到 /home/anoncvs/usr/bin 下我想應該也是可以的。