首先在Ubuntu下面,搭建nfs服务器。实现命令如下所示:
sudo apt-get install portmap sudo apt-get install nfs-kernel-server然后搭建nfs客户端,命令所示:
sudo apt-get install nfs-common搭建完成后,修改服务器端的配置文件/etc/exports,指明共享文件夹路径,*:允许所有的网段访问,也可以使用具体的IP。 rw:挂接此目录的客户端对该共享目录具有读写权限sync:资料同步写入内存和硬盘no_root_squash:root用户具有对根目录的完全管理访问权限。修改完上述配置文件保存退出。 修改完成后,在Ubuntu上面测试nfs服务器功能是否实现。首先重启nfs服务器,前面要加上sudo,赋予权限,否则后面会出现,permission denied的问题。然后使用mount,挂载/tftpboot 到/mnt/tftpboot文件夹下面。
mount 192.168.0.222:/tftpboot /mnt/tftpboot ls /mnt/tftpboot接下来要在虚拟机上面挂载nfs,在此之前,一定要先配置文件系统支持nfs:
配置好后,一定要再次编译(make dep ,make),否则配置没有生效,nfs无法启动。然后使用tftp下载内核到开发板,启动开发板后,执行命令 portmap &;之后再挂载nfs服务器指定的文件目录,到开发板上面。
添加完成后,一定要再次编译,然后下载到开发板上面,这样可以对比两次启动时的打印情况。 可以发现,添加后在/etc/rc之后出现了,刚刚添加进去的命令执行的返回情况。
编写程序,使之实现登陆用户的作用。首先在虚拟机上面新建一个C文件,然后打开并编辑,(参考文件user/sash.c,main();user/login/login.c;passwd.c三个文件,然后查看etc/passwd文件,发现里面保存的是加密后的账户和密码。因为不知道原始账户和密码,所以先复制passwd到passwd1,然后编写测试程序,自定义账户和密码(123456),然后经过加密函数crypt和加密符“ab”,得到新的加密后的账户和密码,保存到passwd1里面,接着编写login_passwd.c程序),写好程序后先在虚拟机上面测试(测试程序见附录),编译的时候,报错,检查程序没有问题,然后查看系统函数crypt:man crypt发现编译的时候未加链接库。(编译的时候加上-lcrypt)。加上后编译通过,然后在虚拟机上面测试:
测试通过后,打开user/sash/sash.c函数,参考其main()函数中的最后一句代码是开发板启动进入shell时的打印输出。因此,将刚刚测试通过的代码复制进入printf(“\nSash command shell (version %s)\n”,version);之前。
添加完成后,删除刚刚在scu目录下的测试程序,然后退出到UCLinux-dist目录,执行make命令,然后启动开发板,打开secureCRT软件,下载zRomfs,zImage。Shell之前的打印输出:
输入设定好的账户和密码,成功进入shell,否则提示输入错误,重新输入。
附录:测试程序login_passwd.c
#if 1 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <getopt.h> #include <errno.h> #include <string.h> #include <sys/utsname.h> #include <pwd.h> #include <signal.h> #include <sys/stat.h> #include <sys/time.h> #include <sys/wait.h> #include <crypt.h> int main() { char usernamebuf[128]; char crtyppassword1[128], crtyppassword2[128]; char *p,*passwd,*cryptmode,fpbuf[128],fpbuf1[13],fpbuf2[13]; FILE *fp; int i,j=0,z=0; int x,y; for(;;) { fflush(stdout); fflush(stdin); printf("User: "); fgets(usernamebuf,sizeof(usernamebuf),stdin); //保存用户到usernamebuf p = strchr(usernamebuf, '\n'); if( p != 0 ) *p=0; passwd = getpass("Enter the passwd :"); //(不回显)保存密码到passwd printf("\n"); cryptmode = "ab"; strcpy(crtyppassword1, crypt(usernamebuf,cryptmode)); //加密用户名到1 strcpy(crtyppassword2, crypt(passwd,cryptmode)); //加密密码到2 //printf("crypt_user is %s\n",crtyppassword1); //printf("crypt_passwd is %s\n",crtyppassword2); fflush(stdout); fflush(stdin); if((fp = fopen("/s1/uClinux-dist/romfs/etc/passwd1","r"))== NULL)//这里的路径要和自己虚拟机上的路劲一致,下载进入开发板时,改为/etc/passwd1 { printf("open failed \n"); return 1; } if(fgets(fpbuf,sizeof(fpbuf),fp)== NULL) { printf("get data failed \n"); return 2; } //printf(" the pervious data is :%s\n",fpbuf); /*for(i = 0; i<128 ; i++) { if((fpbuf[i] == '=')&&(i<10)) { j = 0; fpbuf1[j] = fpbuf[i+1]; } else if(fpbuf[i] == '=') { j = 0; fpbuf2[j] = fpbuf1[i+1]; } else ; }*/ for(i = 5 ; i<18; i++) { fpbuf1[z] = fpbuf[i]; z++; } for( i=26; i<39; i++) { fpbuf2[j] = fpbuf[i]; j++; } //printf("read user is %s\n",fpbuf1); //printf("read passwd is %s\n",fpbuf2); x = strncmp(crtyppassword1,fpbuf1,13); y = strncmp(crtyppassword2,fpbuf2,13); if(x!=0) { printf("user mistake \n"); printf("\n"); } else if(y!=0) { printf("passwd mistake \n"); printf("\n"); } else break; } printf("user and passwd correct!!! \n"); printf("\n"); fclose(fp); return 0 ; } #endif