kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

网络硬盘NFS的安装与配置

http://www.linuxidc.com/Linux/2014-11/109637.htm

NFS 是共享文件的服务的一种协议 下面给大家介绍一下这个服务器的的安装和配置。

安装

1
sudo apt-get install nfs-common nfs-kernel-server

配置

1
vim /etc/exprots

在正文的最下面输入一行

1
2
3
4
5
/srv/nfs_share *(rw)

/srv/nfs_share 表示的是我们要共享的文件目录
* 表示互联网上任何主机都可以访问 
(rw) 表示对服务器进行访问的主机可以进行的操作 也就是可读可写

如果我们只想让我们本地局域网上的主机对我们的服务器进行访问的话 可以这样写

1
/srv/nfs_share 192.168.*.*(rw)

访问

本机访问

1
sudo mount -o rw locahost:/srv/nfs_share /mnt/nfs

上面的意思是把本地的目录/srv/nfs_share 挂载到 目录/mnt/nfs上 ,这时候我们体会不到挂载点发生了变化 我们可以自己用相关的命令查询,我就不多介绍了

非本地的主机

1
sudo mount -o rw 域名:/srv/nfs_share /mnt/nfs

这个时候我们会发现NFS太简单了,所以系统管理员就麻烦了

假如在共享的目录中有我们的重要的文件,怎么办?
1
/srv/nfs_share/secret (noaccess)

就是任何主机都不能访问/srv/nfs_share/secret 这个子目录

如何限制root的权限
1
/srv/nfs_share 192.168.*。*(rw,root-aquash)
查看客户端挂载共享目录的状态
1
$ nfsstat -c
查看服务器的状态
1
$ nfsstat -s

http://stevenz.blog.hexun.com/16127677_d.html

服务器IP:172.0.0.1,主机名:p470-1, 通过NFS共享/disk1目录

在客户端使用 mount -t nfs p470-1:/disk1 /disk1 时出现

1
mount: mount to NFS server 'p470-1' failed: RPC Error: Program not registered.

错误提示。

出错原因:p470-1由于网络原因nfs服务被中断,重新开启p470-1的nfs服务然后在客户端重新mount disk1即可

service nfs restart 或 /etc/rc.d/init.d/nfs restart

VMware 'Host SMBus controller not enabled!'

https://www.centos.bz/faq/111/

Ubuntu/CentOS guest instances in VMware sometimes come up with the boot error message:

1
piix4_smbus 0000:00:007.3: Host SMBus controller not enabled!

This error is being caused because VMware doesn’t actually provide that level interface for CPU access, but Ubuntu try to load the kernel module anyway.

How to fix it:
在虚拟机中

1
sudo vim /etc/modprobe.d/blacklist.conf

add the line:

1
blacklist i2c-piix4

reboot


似乎这个错误在centos6 + 3.10* 的内核,有时kdump不起作用。

字符设备驱动和等待队列样例

前两篇的样例

字符设备驱动程序
Linux内核中的等待队列

waitqueue.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/wait.h>
#include <linux/semaphore.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>

#include <linux/socket.h>
#include <linux/tcp.h>
#include <linux/proc_fs.h>
#include <net/net_namespace.h>

#include <net/tcp.h>


static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);
static ssize_t globalvar_write(struct file *, const char *, size_t, loff_t*);

struct file_operations globalvar_fops =
{
	.owner     = THIS_MODULE,
	.read = globalvar_read,
	.write = globalvar_write,
};

#define LEN 1024
static char global_var[LEN];
static int read_index = 0;
static int write_index = 0;
static spinlock_t var_lock;
static wait_queue_head_t waitq;
static int flag = 0;
static int major;

static const char procname[] = "testvar";

static int __init globalvar_init(void)
{
	init_waitqueue_head(&waitq);
	spin_lock_init(&var_lock);
//    if (!proc_net_fops_create(&init_net, procname, S_IRUSR, &globalvar_fops)) {
	if (!(major = register_chrdev(0, "globalvar", &globalvar_fops))) {
		printk("globalvar register failure\n");
		return -1;
	}
	printk("major = %d\n", major);
	return 0;
}

static void __exit globalvar_exit(void)
{
//    proc_net_remove(&init_net, procname);
	unregister_chrdev(major, "globalvar");
}

static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
	int read_len;
	//等待数据可获得
	if (wait_event_interruptible(waitq, flag != 0))
		return -ERESTARTSYS;

	spin_lock(&var_lock);
	read_len = write_index - read_index;
	if (copy_to_user(buf, global_var+read_index, read_len)) {
		spin_unlock(&var_lock);
		return -EFAULT;
	}
	read_index = write_index;
	flag = 0;
	spin_unlock(&var_lock);
	return read_len;
}

static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off)
{
	spin_lock(&var_lock);
	if (copy_from_user(global_var+write_index, buf, len)) {
		spin_unlock(&var_lock);
		return -EFAULT;
	}
	write_index += len;
	spin_unlock(&var_lock);

	flag = 1;
	//通知数据可获得
	wake_up_interruptible(&waitq);
	return len;
}

module_init(globalvar_init);
module_exit(globalvar_exit);
MODULE_LICENSE("GPL");

Makefile

1
2
3
4
5
6
7
obj-m += waitqueue.o

PWD = $(shell pwd)
KERNEL := /lib/modules/`uname -r`/build

all:
	make -C $(KERNEL) M=$(PWD) modules
安装模块
1
insmod ./waitqueue.ko
查看对应的设备号
1
2
$ cat /proc/devices | grep globalvar
$ 249 globalvar
建立文件
1
mknod /dev/globalvar c 249 0
终端1: cat文件
1
cat /dev/globalvar
终端2: echo数据到文件
1
2
3
echo 123 > /dev/globalvar
echo 1234567 > /dev/globalvar
echo 123 > /dev/globalvar

这时就能看见终端1读到了内容。