开发板上面实现NFS挂载操作+shell前的用户程序实现登陆账户和密码
一.配置NFS
首先在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
由于/etc/rc是由vendors/Marvell/Firefox/rc创建的,故修改该文件,在末尾添加三行命令:
添加完成后,一定要再次编译,然后下载到开发板上面,这样可以对比两次启动时的打印情况。
可以发现,添加后在/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