测试中出现的问题:
1、无法在开发板上删除通过nfs共享的文件夹
解决方法:加入no_root_squash参数后解决问题
nfs 共享时是否加入了no_root_squash 这样在客户机挂载时就有root 权限.
如果没有的话,客户机挂载时就没有root 权限,只有noboday ,这时需要服务器就要设置对应读写权限了.
例如 一个目 /home
对应权限 drwxr-xr-x home
下层目录 ls /home
drwx------ 26 wang wang 4096 12月 3 12:48 wang
user wang uid=500,gid=500
example 1
nfs server /etc/exports
/home *(rw,sync)
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
mkdir: 无法创建目录‘1’: 权限不够
此时root 的身份已经为noboday,虽然共享权限为rw,但是只能r
example 2
nfs server /etc/exports
/home *(rw,sync,all_squash,anonuid=500.anongid=500)
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
mkdir: 无法创建目录‘1’: 权限不够
cd /mnt/wang
mkdir 1
ls -l
drwxr-xr-x 2 wang wang 4096 12月 12 23:45 1
此时root 的身份已经为wang,虽然共享权限为rw,但是只能在/mnt/wang 下面,这种情况很象你上面的相象
example 3
nfs server /etc/exports
/home *(rw,sync,no_root_squash)
我们在客户
mount ip:/home /mnt
user root
cd /mnt
mkdir 1
ls -l
drwxr-xr-x 2 root root 4096 12月 12 23:49 1
此时root 的身份已经为root,可以在共享目录里面进行任何操作
2、insmod内核模块时出现错误:
[root@(none) ramdisk]# insmod ok.o
insmod: unresolved symbol __put_user_bad
解决方法:编译模块的时候是用优化选项O2解决问题!
源程序:
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include<linux/types.h>
#include<asm/hardware.h> //没有的 话导至 devfs_handle_t 找不到
#define SUCCESS 0
#define DEVICE_NAME "chardev"
#define BUF_LEN 80 /* Max length of the message from the device */
static devfs_handle_t dev_handle;
int Major; /* Major number assigned to our device driver */
int Device_Open = 0; /* Is device open? Used to prevent multiple */
char msg[BUF_LEN]; /* The msg the device will give when asked */
char *msg_Ptr;
int lj_open(struct inode *inode, struct file *file)
{
static int counter = 0;
if (Device_Open) return -EBUSY;
Device_Open++;
sprintf(msg,"I already told you %d times Hello world!\n", counter++);
msg_Ptr = msg;
printk("<1>device_open call\n");
return SUCCESS;
}
int lj_release(struct inode *inode, struct file *file)
{
Device_Open --; /* We're now ready for our next caller */
printk("<1>device_release call\n");
return 0;
}
ssize_t lj_read(struct file *filp,
char *buffer, /* The buffer to fill with data */
size_t length, /* The length of the buffer */
loff_t *offset) /* Our offset in the file */
{
int bytes_read = 0;
if (*msg_Ptr == 0)
return 0;
while (length && *msg_Ptr)
{
put_user(*(msg_Ptr++), buffer++);
length--;
bytes_read++;
}
return bytes_read;
}
ssize_t lj_write(struct file *filp,
const char *buff,
size_t len,
loff_t *off)
{
printk ("<1>Sorry, this operation isn't supported.\n");
return -EINVAL;
}
static struct file_operations keybd_fops =
{
read:lj_read, //注意此处是:而不是= //.read=lj_read 才是=
write:lj_write,
open:lj_open,
release:lj_release,
};
int init_module(void)
{
Major = register_chrdev(240, DEVICE_NAME, &keybd_fops);
dev_handle = devfs_register(NULL,DEVICE_NAME, DEVFS_FL_DEFAULT,
240,0,S_IFCHR|S_IRUSR|S_IWUSR,&keybd_fops,NULL);
//注册字符驱动 第一个参数是主设备号 如果第一个参数是0 表示由内核自动分配
//第二个是设备名 可以在/proc/devices里面看到
//第三个是对此设备的操作函数 具体操作可以看file_operations结构定义 在linux/fs.h里面
if (Major < 0) {
printk ("Registering the character device failed with %d\n", Major);
return Major;
}
Major = 240;
printk("<1>I was assigned major number %d. To talk to\n", Major);
printk("<1>Remove the device file and module when done.\n");
return 0;
}
void cleanup_module(void)
{
int ret = unregister_chrdev(Major, DEVICE_NAME);
devfs_unregister(dev_handle);
printk("bye \n");
if (ret < 0) printk("Error in unregister_chrdev: %d\n", ret);
}
//测试方法
//echo"hello"> /dev/chardev
//cat /dev/chardev >hello
//然后看hello里的内容
|