使用gcc编译驱动模块遇到的问题

背景

由于工作中需要了解Linux的驱动模块,所以就开始学习,初看Linux驱动编程,跟着博客写一个块设备驱动学习,练习环境为centos6.5 gcc版本为6.3。

遇到的问题

跟着敲完那个简单的驱动程序后,发现编译出错,错误信息为

include/linux/compiler-gcc.h:89:30: fatal error: linux/compiler-gcc6.h: No such file or directory

一通百度,说gcc版本太高,去下载一个compiler-gcc6.h文件,放到内核源码文件夹里面,按着做了,结果编译又出问题了,错误信息为

include/linux/compiler.h:163:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
static __always_inline void data_access_exceeds_word_size(void)
include/linux/compiler.h:169:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
static __always_inline void data_access_exceeds_word_size(void)
include/linux/compiler.h:173:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
static __always_inline void __read_once_size(volatile void *p, void *res, int size)
include/linux/compiler.h:190:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'
static __always_inline void __write_once_size(volatile void *p, void *res, int size)

解决方法

又是一通百度,发现跟我情况不符,看了下博客发表时间,08年,果断换了一个centos6.0的机器,gcc版本为4.6,编译完美通过,环境因素很重要啊。。。

PHP脚本中使用exec总结

背景

总结一下这两天加班遇到的坑,由于本次任务涉及到在PHP中使用exec函数运行shell命令,并解析返回值。屁颠屁颠的写好代码,上传到服务器,服务器环境配置centos6.5+Nginx,ssh到服务器,在控制台运行php xxx.php结果完美显示。蛋疼的是前端调用脚本的时候,没有数据,返回false,一脸懵逼,开始想问题所在,试着在浏览器地址栏直接访问xxx.php没有结果。然后把代码改成

exec("ls 2>&1", $result);
var_dump($result);

显示ls命令没找到,试着加上路径

exec("/bin/ls 2>&1", $result);
var_dump($result);

显示权限不够。

解决方法

  1. lsof -i:80 查看你Nginx的用户是谁,我这里是nginx

  2. 在脚本中添加file_put_contents(“/tmp/test.log”, “xxx”)查看test.log的用户是谁。我这里是nobody

  3. 在vim /etc/sudoers添加权限

    nobody ALL=(ALL) NOPASSWD:ALL
    nginx ALL=(ALL) NOPASSWD:ALL

  4. 重启nginx服务。

Esxi5.1挂载NFS存储遇到的问题及解决办法

背景

如何配置NFS以及怎样在Esxi中添加NFS,可以参考VMware ESXI 5.5使用NFS添加存储器, 我也是按照这个博客来配置的。

遇到的问题

遇到如下问题:

解决方法

必须要检查你的esxi主机是否配置了VMkernel,检查步骤如下:
1、使用 VI/vSphere Client 连接到 Virtual Center/vCenter Server。
2、选择 ESX/ESXi 主机。
3、单击配置选项卡。
4、单击网络。
5、查看 VMKernel 的网络图,或单击属性 > 端口 > VMKernel。如果 VMKernel 未列出,必须添加它。

手动挂载

手动挂载命令:

esxcli storage nfs add -H NFS_IP|NFS_HOSTNAME -s Share_mount_point_on_the_NFS -v DatastoreName

注意事项

必须保证esxi主机与NFS服务器在同一网段或者能够相互通信

linux下编译vddk例程的错误总结

背景

vddk是visual disk development kit的缩写,是VMware vSphere提供的可用来操作虚拟磁盘的一套SDK,具体可看VDDK Document,在这里记录一下编译问题。

遇到的问题

按照官方文档编译vixDiskLibSample.cpp时报错

Package vix-disklib was not found in the pkg-config search path.
Perhaps you should add the directory containing `vix-disklib.pc'
to the PKG_CONFIG_PATH environment variable
No package 'vix-disklib' found

解决方法

按照官方文档的说明编辑~/.bash_profile,添加如下内容:

PKG_CONFIG_PATH=/usr/lib/pkgconfig
export PKG_CONFIG_PATH

LD_LIBRARY_PATH=/usr/lib/vmware-vix-disklib/lib64

export LD_LIBRARY_PATH

其中/usr/lib/vmware-vix-disklib/lib64是vddk安装后,默认的lib路径,添加完成后执行

source bash_profile

再次编译就成功了

Linux常用命令

vim

1、使用u退回上一步
2、使用U一次撤销对当前行的全部操作
3、vim + filename 表示把光标定位到文件最后一行
4、vim +数字 filemame 定位到数字行,如果超过文件行数,定位到最后一行
5、vim +/word filename 定位到Word第一次出现的行,按n切换
6、vim file1 file2 file3 一次性打开或者创建多个文件,底行模式下使用:n向后切换文件,:N和prev向前切换文件
7、:w save
:q quit
:! 强制
:ls 列出当前编辑器打开的所有文件
:n 切换到下一个文件
:N 切换到前一个文件
:15 定位到15行
:/xxx 表示从光标位置向后搜索xxx,定位到第一次出现的时候
:?xxx搜索
8、命令行模式常用命令
h 光标左移
j 光标下移
k 光标上移
l 光标右移
Ctrl+f 向下翻页(front)
Ctrl+b 向上翻页(back)
Ctrl+d 向下翻半页(down)
Ctrl+u 向上翻半页(up)

df

查看磁盘分区使用状况
-l 仅显示本地磁盘(默认)
-a 显示所有文件系统的磁盘使用情况
-h 以1024进制计算最适合的单位显示磁盘容量
-H 以1000进制计算最适合的单位显示磁盘容量
-T 显示磁盘分区类型
-t 显示指定类型文件系统的磁盘分区
-x 不显示指定类型文件系统的磁盘分区

du

统计磁盘上的文件大小
-b 以byte为单位统计文件
-k 以KB为单位统计文件
-m 以MB为单位统计文件
-h 按照1024进制以最适合的单位统计文件
-H 按照1000进制以最适合的单位统计文件
-s 指定统计目标

lsof

可以列出被进程所打开的文件的信息。被打开的文件可以是
1.普通的文件
2.目录
3.网络文件系统的文件
4.字符设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.底层的socket字流,网络socket,unix域名socket
9.在linux里面,大部分的东西都是被当做文件的…..还有其他很多

怎样使用lsof

这里主要用案例的形式来介绍lsof 命令的使用

  1. 列出所有打开的文件:
    lsof
    备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位
  2. 查看谁正在使用某个文件
    lsof /filepath/file
  3. 递归查看某个目录的文件信息
    lsof +D /filepath/filepath2/
    备注: 使用了+D,对应目录下的所有子目录和文件都会被列出
  4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法
    lsof | grep ‘/filepath/filepath2/’
  5. 列出某个用户打开的文件信息
    lsof -u username
    备注: -u 选项,u其实是user的缩写
  6. 列出某个程序所打开的文件信息
    lsof -c mysql
    备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了
  7. 列出多个程序多打开的文件信息
    lsof -c mysql -c apache
  8. 列出某个用户以及某个程序所打开的文件信息
    lsof -u test -c mysql
  9. 列出除了某个用户外的被打开的文件信息
    lsof -u ^root
    备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示
  10. 通过某个进程号显示该进行打开的文件
    lsof -p 1
  11. 列出多个进程号对应的文件信息
    lsof -p 123,456,789
  12. 列出除了某个进程号,其他进程号所打开的文件信息
    lsof -p ^1
    13 . 列出所有的网络连接
    lsof -i
  13. 列出所有tcp 网络连接信息
    lsof -i tcp
  14. 列出所有udp网络连接信息
    lsof -i udp
  15. 列出谁在使用某个端口
    lsof -i :3306
  16. 列出谁在使用某个特定的udp端口
    lsof -i udp:55
    特定的tcp端口
    lsof -i tcp:80
  17. 列出某个用户的所有活跃的网络端口
    lsof -a -u test -i
  18. 列出所有网络文件系统
    lsof -N
  19. 域名socket文件
    lsof -u
  20. 某个用户组所打开的文件信息
    lsof -g 5555
  21. 根据文件描述列出对应的文件信息
    lsof -d description(like 2)
  22. 根据文件描述范围列出文件信息
    lsof -d 2-3

top系列

iotop – I/O 监控

iotop 命令利用 Linux 内核监控 I/O 使用情况,它按进程或线程的顺序显示 I/O 使用情况。

htop – 交互式的进程查看器

htop 是一款免费并开源的基于 ncurses 的 Linux 进程查看器。它比 top 命令更简单易用。您无需使用 PID、无需离开 htop 界面,便可以杀掉进程或调整其调度优先级。

atop – 高级版系统与进程监控工具

atop 是一个非常强大的交互式 Linux 系统负载监控器,它从性能的角度显示最关键的硬件资源信息。您可以快速查看 CPU、内存、磁盘和网络性能。它还可以从进程的级别显示哪些进程造成了相关 CPU 和内存的负载。

iftop – 显示主机上网络接口的带宽使用情况

iftop 命令监听指定接口(如 eth0)上的网络通信情况。它显示了一对主机的带宽使用情况。

vmstat

虚拟内存统计
显示 Slab 缓存的利用率

vmstat -m

获取有关活动和非活动内存页面的信息

vmstat -a   

grep

高亮搜索关键字

step1:修改/.bashrc,在/.bashrc中添加如下内容
alias grep=’grep –color=auto’
step2:重新加载.bashrc文件
source ~/.bashrc

netstat

-a :all,表示列出所有的连接,服务监听,Socket资料
-t :tcp,列出tcp协议的服务
-u :udp,列出udp协议的服务
-n :port number, 用端口号来显示
-l :listening,列出当前监听服务
-p :program,列出服务程序的PID

ps

显示长输出格式

# ps -Al

显示完整输出格式(它将显示传递给进程的命令行参数)

# ps -AlF

显示线程(轻量级进程(LWP)和线程的数量(NLWP))

# ps -AlFH

在进程后显示线程

# ps -AlLm

显示系统上所有的进程

# ps ax
# ps aux

显示进程树

# ps -ejH
# ps axjf
# pstree

显示进程的安全信息

# ps -eo euser,ruser,suser,fuser,f,comm,label
# ps axZ
# ps -eM

显示指定用户(如 vivek)运行的进程

# ps -U vivek -u vivek u

设置用户自定义的输出格式

# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
# ps -eopid,tt,user,fname,tmout,f,wchan

显示某进程(如 lighttpd)的 PID

# ps -C lighttpd -o pid=

# pgrep lighttpd

# pgrep -u vivek php-cgi

显示指定 PID(如 55977)的进程名称

# ps -p 55977 -o comm=

找出占用内存资源最多的前 10 个进程

# ps -auxf | sort -nr -k 4 | head -10

找出占用 CPU 资源最多的前 10 个进程

# ps -auxf | sort -nr -k 3 | head -10

##ss

ss 命令用于获取套接字统计信息。它可以显示类似于 netstat 的信息。不过 netstat 几乎要过时了,ss 命令更具优势。要显示所有 TCP 或 UDP 套接字:

# ss -t -a

# ss -u -a

显示所有带有 SELinux 安全上下文Security Context的 TCP 套接字:

# ss -t -a -Z 

pmap

pmap 命令用以显示进程的内存映射,使用此命令可以查找内存瓶颈。

# pmap -d PID

显示 PID 为 47394 的进程的内存信息,请输入:

# pmap -d 47394     

sar

?sar 命令用于收集、汇报和保存系统活动信息。要查看网络统计,请输入:

# sar -n DEV | more

显示 24 日的网络统计:

# sar -n DEV -f /var/log/sa/sa24 | more

显示实时使用情况:

# sar 4 5     

mpstat

mpstat 命令显示每个可用处理器的使用情况,编号从 0 开始。命令 mpstat -P ALL 显示了每个处理器的平均使用率:

# mpstat -P ALL     

w

显示了当前登录在该系统上的用户及其进程。

# w username    

tcpdump

tcpdump 命令是简单的分析网络通信的命令。您需要充分了解 TCP/IP 协议才便于使用此工具。例如,要显示有关 DNS 的流量信息,请输入:

# tcpdump -i eth1 'udp port 53'

查看所有去往和来自端口 80 的 IPv4 HTTP 数据包,仅打印真正包含数据的包,而不是像 SYN、FIN 和仅含 ACK 这类的数据包,请输入:

# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

显示所有目标地址为 202.54.1.5 的 FTP 会话,请输入:

# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'

打印所有目标地址为 192.168.1.5 的 HTTP 会话:

# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'

捕获所有目标地址为 192.168.1.5 的 HTTP 会话,并保存:

# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http' -w output.cap &

使用 wireshark 查看文件的详细内容,请输入:

# tcpdump -n -i eth1 -s 0 -w output.cap src or dst port 80    

lsb_release

lsb_release是读取/etc/redhat-release文件中的第一行记录,这里面记载了系统版本

!

**!**在Linux命令行中有特色含义,即感叹号后面的内容会被截断,所以如果需要将感叹号当作普通字符处理,需要使用单引号,如下:

echo "hello world'!'"
 

fdisk

fdisk只能给磁盘做MBR分区,MBR只能有四个主分区,每个分区最大2TB

parted

parted既可以做MBR分区也可以做GPT分区,GPT几乎没有分区限制,也没有大小限制

ntpdate

ntpdate命令是用来设置本地日期和时间。它从指定的每个服务器获得了一些样本,并应用标准 NTP 时钟过滤器和选择算法来选择最好的样本。
可使用如下命令进行网络时间更新

ntpdate -u ntp.api.bz

-u参数可以越过防火墙与主机同步;ntp.api.bz:NTP服务器(上海)。

iptables

iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。

pkill

pkill命令可以按照进程名杀死进程。
语法

pkill(选项)(参数)

选项
-o:仅向找到的最小(起始)进程号发送信号;
-n:仅向找到的最大(结束)进程号发送信号;
-P:指定父进程号发送信号;
-g:指定进程组;
-t:指定开启进程的终端。

kill

firewall-cmd

防火墙命令行

  1. 开启指定host访问端口 firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4” source address=”xxx.xxx.xxx.xxx” port protocol=”tcp” port=”xxxx” accept”
  2. 刷新防火墙规则 firewall-cmd –rel

wget

wget拉取http请求
语法
wget(选项)(参数)
选项
–max-redirect 0:设置重定向次数,设置为0,表示不跟随302

free

查看系统剩余内存大小

sed

文本操作命令
语法
sed(选项)(参数)

  1. 删除指定行,例如删除第6行: sed -i ‘6 d’ a.txt,删除第1-5行: sed -i ‘1,5 d’ a.txt
  2. 匹配字符串后追加行,例如匹配到aaa后追加hello:sed -i ‘/aaa/ ahello’ a.txt;
  3. 指定行后追加一行,例如sed -i ‘N;2a\ xxxx’ a.txt,N之后的数字要是偶数,如果想插入换行符,sed -i ‘N;2a\ \nxxxx’ a.txt

echo

用于输出指定的字符串或者变量,带换行符的字符串需要用<>,最后用EOF表示字符串结束

watch

可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令

awk

用于处理文本

htop

用于查看系统状态

xargs

用于管道传递参数

smem

查看内存占用

killall

杀掉所有名字相同的进程

centos6.5下lamp环境部署laravel

安装composer,命令如下

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer 

切换到Apache默认目录下

cd /var/www/
composer create-project laravel/laravel --prefer-dist "5.1.11"
composer install

修改权限

cd laravel
chmod -R 777 storage/

修改配置

vim/etc/httpd/conf/httpd.conf

DocumentRoot “/var/www/html”改为DocumentRoot “/var/www/laravel/public”

重启Apache服务

service httpd restart

MySQL常见问题

修改目录后MySQL无法启动

这种问题一般是selinux造成的
1、终端输入sestatus,如出现SELinux status: enabled,则selinux为开启状态,
2、编辑/etc/selinux/config 文件,将SELINUX=enforcing改为SELINUX=disabled,重启机器

修改密码

修改密码分为两种情况,一种情况是拥有原来密码,另外一种情况则是忘记密码

拥有原来的myql的root的密码;

方法一:

在mysql系统外,使用mysqladmin

# mysqladmin -u root -p password "test123"
Enter password: 【输入原来的密码】

方法二:

通过登录mysql系统,

# mysql -uroot -p
Enter password: 【输入原来的密码】
mysql>use mysql;
mysql> update user set password=password("test") where user='root';
mysql> flush privileges;
mysql> exit;      

忘记原来的myql的root的密码;

首先,你必须要有操作系统的root权限了。要是连系统的root权限都没有的话,先考虑root系统再走下面的步骤。
类似于安全模式登录系统,有人建议说是pkill mysql,但是我不建议哈。因为当你执行了这个命令后,会导致这样的状况:
/etc/init.d/mysqld status
mysqld dead but subsys locked
这样即使你是在安全模式下启动mysql都未必会有用的,所以一般是这样/etc/init.d/mysqld stop,如果你不幸先用了pkill,那么就start一下再stop咯。

# mysqld_safe --skip-grant-tables &

&,表示在后台运行,不再后台运行的话,就再打开一个终端咯。

# mysql
mysql> use mysql;
mysql> UPDATE user SET password=password("test123") WHERE user='root';   
mysql> flush privileges;
mysql> exit;                         

本来mysql是不分大小写的,但是这个是修改的mysql中的mysql数据库的具体的值,要注意到。

插入10万条记录的SQL

drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 100000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

MySQL开启远程访问

  1. 选择mysql库,选user表 新增用户
mysql> insert into user(Host,User,Password) values('%','用户名(必须是英文数字)','密码');

刷新权限

mysql>flush privileges;
  1. 授权给新增的用户
mysql> Grant all privileges on *.* to '用户名'@'%' identified by '密码' with grant option;

注释:其中:“ . ”代表所有数据库和表(也就是root权限) 其格式为:数据库名称 . 表名
刷新权限

mysql>flush privileges;

数据库优化十个原则

  1. 尽量避免在列上进行计算,这样会导致索引失效
select * from t where year(d)>=2011   =>   select * from t where d>='2011-01-01';
  1. 使用join时,应该用小结果集驱动大结果集。同时把复杂的join查询拆分成多个query。因为join多个表时,可能导致更多的锁定和堵塞。
  2. 注意like模糊查询的使用,避免%%。
  3. 仅列出需要查询的字段,这对速度不会又明显的影响,主要考虑节省内存。
  4. 使用批量插入语句节省交互。
  5. limit的基数比较大时使用between。
  6. 不要使用rand函数获取多条随机记录。
  7. 避免使用null
  8. 不要使用count(id),而应该是count(*)
  9. 不要做所谓的排序操作,而应尽可能在索引中完成排序
  10. 适当使用联合索引,加快查询速度