1*14414594SDavid du Colombier 2*14414594SDavid du ColombierThis package implements Plan 9's IL and 9fs client for FreeBSD 3.2. 3*14414594SDavid du Colombier 4*14414594SDavid du Colombier> Getting the software 5*14414594SDavid du Colombier 6*14414594SDavid du Colombier 9pfreebsd.tgz 7*14414594SDavid du Colombier 8*14414594SDavid du Colombier> Installation 9*14414594SDavid du Colombier 10*14414594SDavid du Colombier 0. unpack: 11*14414594SDavid du Colombier mkdir ~/9pfreebsd 12*14414594SDavid du Colombier cd ~/9pfreebsd 13*14414594SDavid du Colombier zcat 9pfreebsd.tgz | tar -xf - 14*14414594SDavid du Colombier 15*14414594SDavid du Colombier this creates the file freebsd-3.2.il-kernel.patch and the 16*14414594SDavid du Colombier directory mount_9fs. 17*14414594SDavid du Colombier 18*14414594SDavid du Colombier 1. get a fresh copy of the kernel. for example: 19*14414594SDavid du Colombier cp -r /usr/src/sys ~/9pfreebsd/freebsd-3.2 20*14414594SDavid du Colombier 21*14414594SDavid du Colombier 2. apply the patch: 22*14414594SDavid du Colombier cd ~/9pfreebsd/freebsd-3.2 23*14414594SDavid du Colombier patch -p0 < ../freebsd-3.2.il-kernel.patch 24*14414594SDavid du Colombier 25*14414594SDavid du Colombier 3. build a new kernel: 26*14414594SDavid du Colombier cd ~/9pfreebsd/freebsd-3.2/i386/conf 27*14414594SDavid du Colombier config IL 28*14414594SDavid du Colombier cd ../../compile/IL; make depend; make 29*14414594SDavid du Colombier 30*14414594SDavid du Colombier 4. boot the new kernel: 31*14414594SDavid du Colombier cp -p /kernel /kernel.good 32*14414594SDavid du Colombier cp ~/9pfreebsd/freebsd-3.2/compile/IL/kernel /kernel 33*14414594SDavid du Colombier reboot 34*14414594SDavid du Colombier 35*14414594SDavid du Colombier 5. build mount_9fs: 36*14414594SDavid du Colombier cd ~/9pfreebsd; make 37*14414594SDavid du Colombier 38*14414594SDavid du Colombier> Using IL 39*14414594SDavid du Colombier 40*14414594SDavid du Colombier 1. connect via IL: 41*14414594SDavid du Colombier 42*14414594SDavid du Colombier if( (s = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_IL)) < 0 ) { 43*14414594SDavid du Colombier perror("socket"); 44*14414594SDavid du Colombier exit(1); 45*14414594SDavid du Colombier } 46*14414594SDavid du Colombier 47*14414594SDavid du Colombier bzero(&sin, sizeof(sin)); 48*14414594SDavid du Colombier sin.sin_family = AF_INET; 49*14414594SDavid du Colombier sin.sin_addr.s_addr = dest_addr; 50*14414594SDavid du Colombier sin.sin_port = htons(dest_port); 51*14414594SDavid du Colombier if( connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0 ) { 52*14414594SDavid du Colombier perror("connect"); 53*14414594SDavid du Colombier exit(1); 54*14414594SDavid du Colombier } 55*14414594SDavid du Colombier 56*14414594SDavid du Colombier 2. listen via IL: 57*14414594SDavid du Colombier 58*14414594SDavid du Colombier if( (s = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_IL)) < 0 ) { 59*14414594SDavid du Colombier perror("socket"); 60*14414594SDavid du Colombier exit(1); 61*14414594SDavid du Colombier } 62*14414594SDavid du Colombier 63*14414594SDavid du Colombier bzero(&sin, sizeof(sin)); 64*14414594SDavid du Colombier sin.sin_family = AF_INET; 65*14414594SDavid du Colombier sin.sin_addr.s_addr = INADDR_ANY; 66*14414594SDavid du Colombier sin.sin_port = htons(port_number); 67*14414594SDavid du Colombier 68*14414594SDavid du Colombier if( bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0 ) { 69*14414594SDavid du Colombier perror("bind"); 70*14414594SDavid du Colombier exit(1); 71*14414594SDavid du Colombier } 72*14414594SDavid du Colombier 73*14414594SDavid du Colombier if( listen(s, 5) < 0 ) { 74*14414594SDavid du Colombier perror("listen"); 75*14414594SDavid du Colombier exit(1); 76*14414594SDavid du Colombier } 77*14414594SDavid du Colombier 78*14414594SDavid du Colombier len = sizeof(sin); 79*14414594SDavid du Colombier if ( (c = accept(s, (struct sockaddr *)& sin, &len)) < 0 ) { 80*14414594SDavid du Colombier perror("accept"); 81*14414594SDavid du Colombier exit(1); 82*14414594SDavid du Colombier } 83*14414594SDavid du Colombier 84*14414594SDavid du Colombier 85*14414594SDavid du Colombier> Using 9fs 86*14414594SDavid du Colombier 87*14414594SDavid du Colombier 1. limitations: 88*14414594SDavid du Colombier 89*14414594SDavid du Colombier The current implementation is mostly tested with a single user on 90*14414594SDavid du Colombier the client. No one else can access the mounted file system except 91*14414594SDavid du Colombier the authenticator. But two users can mount the same file system 92*14414594SDavid du Colombier on the client with different nodes. This is not yet tested much. 93*14414594SDavid du Colombier 94*14414594SDavid du Colombier 2. mapping plan9 usernames to UNIX uids 95*14414594SDavid du Colombier 96*14414594SDavid du Colombier Mount_9fs requires a translation between plan9 usernames and UNIX 97*14414594SDavid du Colombier uids. /etc/9uid.conf contains the map. The format is: 98*14414594SDavid du Colombier 99*14414594SDavid du Colombier plan9_username unix_uid 100*14414594SDavid du Colombier 101*14414594SDavid du Colombier Not all plan9 users have to have an UNIX account on the 102*14414594SDavid du Colombier client. Just give them a unique uid which can be non-existent in 103*14414594SDavid du Colombier /etc/passwd. 104*14414594SDavid du Colombier 105*14414594SDavid du Colombier 3. mounting 9fs: 106*14414594SDavid du Colombier 107*14414594SDavid du Colombier To mount by a regular user, the root has to set vfs.usermount to 1 108*14414594SDavid du Colombier first (sysctl -w vfs.usermount=1). Then follow the steps below. 109*14414594SDavid du Colombier 110*14414594SDavid du Colombier To mount by root: 111*14414594SDavid du Colombier 112*14414594SDavid du Colombier mount_9fs -u 9user@9auth_server 9fileserver:path node 113*14414594SDavid du Colombier 114*14414594SDavid du Colombier This mounts "path" on 9fileserver on local "node" on behalf of 115*14414594SDavid du Colombier "9user". Plan9 authentication server "9auth_server" is 116*14414594SDavid du Colombier contacted to obtain a ticket. 117*14414594SDavid du Colombier 118*14414594SDavid du Colombier mount_9fs will prompt for "9username"'s plan9 password. 119*14414594SDavid du Colombier 120*14414594SDavid du Colombier umount works as usual. 121*14414594SDavid du Colombier 122*14414594SDavid du Colombier Only the caller of mount_9fs has access to the mounted file system. 123*14414594SDavid du Colombier 124*14414594SDavid du Colombier 4. WARNING: 125*14414594SDavid du Colombier 126*14414594SDavid du Colombier The password is stored in kernel memory and can be read via kmem. 127*14414594SDavid du Colombier 128*14414594SDavid du Colombier> Bugs and Fixes: 129*14414594SDavid du Colombier 130*14414594SDavid du Colombier You are welcome to contact dong@research.bell-labs.com for bug 131*14414594SDavid du Colombier reports and fixes. 132*14414594SDavid du Colombier 133*14414594SDavid du Colombier 134*14414594SDavid du Colombier 135