centos 7.x编写开机启动服务

centos 7以上是用Systemd进行系统初始化的,Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。关于Systemd的详情介绍在这里。

Systemd服务文件以.service结尾,比如现在要建立nginx为开机启动,如果用yum install命令安装的,yum命令会自动创建nginx.service文件,直接用命令

设置开机启动即可。
在这里我是用源码编译安装的,所以要手动创建nginx.service服务文件。
开机没有登陆情况下就能运行的程序,存在系统服务(system)里,即:

1.在系统服务目录里创建nginx.service文件

内容如下

[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

保存退出。

2.设置开机启动

3.其它命令
启动nginx服务

设置开机自启动

停止开机自启动

查看服务当前状态

重新启动服务

查看所有已启动的服务

4.Systemd 命令和 sysvinit 命令的对照表

Sysvinit 命令
Systemd 命令
备注

service foo start
systemctl start foo.service
用来启动一个服务 (并不会重启现有的)

service foo stop
systemctl stop foo.service
用来停止一个服务 (并不会重启现有的)。

service foo restart
systemctl restart foo.service
用来停止并启动一个服务。

service foo reload
systemctl reload foo.service
当支持时,重新装载配置文件而不中断等待操作。

service foo condrestart
systemctl condrestart foo.service
如果服务正在运行那么重启它。

service foo status
systemctl status foo.service
汇报服务是否正在运行。

ls /etc/rc.d/init.d/
systemctl list-unit-files –type=service
用来列出可以启动或停止的服务列表。

chkconfig foo on
systemctl enable foo.service
在下次启动时或满足其他触发条件时设置服务为启用

chkconfig foo off
systemctl disable foo.service
在下次启动时或满足其他触发条件时设置服务为禁用

chkconfig foo
systemctl is-enabled foo.service
用来检查一个服务在当前环境下被配置为启用还是禁用。

chkconfig –list
systemctl list-unit-files –type=service
输出在各个运行级别下服务的启用和禁用情况

chkconfig foo –list
ls /etc/systemd/system/*.wants/foo.service
用来列出该服务在哪些运行级别下启用和禁用。

chkconfig foo –add
systemctl daemon-reload
当您创建新服务文件或者变更设置时使用。

telinit 3
systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3)
改变至多用户运行级别。

5.Sysvinit 运行级别和 systemd 目标的对应表

Sysvinit 运行级别
Systemd 目标
备注

0
runlevel0.target, poweroff.target
关闭系统。

1, s, single
runlevel1.target, …

centos为某一网卡设置固定ip

编辑 /etc/sysconfig/network-scripts/目录下ifcfg-(网卡名称) 的文件,如 ifcfg-eth0,修改参考如下:

重启网络服务生效

/etc/init.d/network restart

编译LFS

成功编译并运行linux from scratch 7.7 system,有必要作下总结。
本次用的编译LFS的环境是:

虚拟机是virtalbox
宿主系统为CentOS 7.0 x86_64 (core版本)
LFS版本为 7.7 system

我用两块硬盘,一块安装宿主系统,另一个作为LFS的编译安装盘,编译成功后,脱离宿主系统那块硬盘,单独引导启动LFS linux的那块硬盘,登录进入LFS linux。

虚拟机上安装好centos后,在虚拟机上加一块硬盘,大小20G左右,分区如下

sdb1分100多M以后打算给/boot的单独分区,sdb2给swap分区,sdb5 作为系统根目录。
然后根据LFS手册说明创建好文件系统,把sdb5挂载到/mnt/lfs作为工作目录。按手册下载源文件,创建目录,配置环境等,就开始编译工具链,编译工具链有几个地方需要注意
1,手册中所有的软件编译命令都默认在解压出来的软件目录中进行,也就是说必须先用tar解压,再cd进行软件目录。
2,编译完成后用”cd .. “退出软件目录,回到source目录
3,除非特别说明,删除解压出来的目录和所有编译过程中生成的 <package>-build 目录。也就是说编译成功后把解压出来的源文件目录删除,如果有build目录,也要删除,以免影响下下编译。

编译工具链的系统基础软件都很顺利。

由于打算给/boot单独的分区,在编译内核之前,在chroot环境中,先挂载sdb1分区到/boot目录

这样编译出来的kernel就会安装到sdb1分区上。

接下配置grub启动

完成后,一切看上去已经很OK,于是把宿主系统的那块硬盘卸掉,单独启动LFS linux,也成功出现了系统菜单选择,选择后回车后傻眼了,提示找不到分区。

通过grub命令发现,硬盘是hd0,而不是hd1,原因很简单,原来宿主系统还是,宿主系统那块盘是hd0,LFS 系统的那块盘是hd1,而现在已经把宿主系统的硬盘卸掉了,只剩下一块LFS linux,理所当然是hd0。

于是在grub命令下,于是手动设置root和加载linux内核

成功加载内核并启动后,报这个错误,也是没发现sdb硬盘,这让我想到了/etc/fstab 的配置,里面还是sdb,没办在,登录不进系统。

于是关闭虚拟机,重新把宿主系统的那块硬盘加入,引导进入宿主系统,用chroot进入lfs环境,修改/etc/fstab文件如下:

在chroot环境中,把lfa linux的/boot分区挂进来,修改/boot/grub/grub.cfg文件,修改后内容如下

保存退出。

关闭系统,把宿主系统卸掉,只引导LFS linux盘,成功进入系统,用root登录,各功能都正常。

linux的sed命令

sed ,全名叫 stream editor,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

 

使用

基本的执行流程是:按条件搜索,然后执行命令,条件用address来表示,命令用command表示

 sed [-nefr] ‘AddressCommand' file

参数:

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e :直接在命令列模式上进行 sed 的动作编辑;

-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

 

Address:

1.startline , endline 起始结束行

     如 1,10 表示1到10行

2,/RegExp/ 正则表达式

     /^root/ 表示以root字符串开头的行

3./pattern1/,/pattern2/,第一次被pattern1匹配到的行开始,到第一次被pattern2匹配到的行结束

     如:/hello/,/china/

4,lineNumber 指定的行

     如:3 表示第三行,$表示最后一行,$-1表示倒数第二行

5,startLine,+N 从startLine开始,向后的N行

     如:10,+5

 

Command:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

          例子:

          在包含了hello的行后面添加一行,内容为newline

         $ sed '/hello/a \# newline’ test.txt  

c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

    …

linux常用

一,文件权限
chmod u+x test.txt
chmod u-x test.txt
chmod u=rwx test.txt
数字形式
chmod 755 test.txt
4 2 1
r w x
每一位用二进制表示
其中:
4表示二进制100
2表示二进制010
1表示二进制001

建立文件链接
ln
硬链接(与源文件一模一样,指向同一个目录,更链接无法给目录做链接)
ln -s test.txt test2.txt
删除源文件
rm -f test.txt
cat test2.txt
发现依然可以打开

ln 源文件 新建链接名
软链接(相当于给源文件建立快捷方式,软链接可以给目录做链接)
ln -s 源文件 新建链接名
ln -s test.txt test_l
链接建立后,修改源文件的内容
cho “hello world ” > test.txt
cat test_l
文件内容也会跟着改变
删除源文件后,就无法打开链接文件
rm -f test.txt
$ cat test_l
cat: test_l: No such file or directory

所属用户
每一个文件都有一个拥有者,文件拥有者可以改变文件的权限
root用户可以用chown来改变文件的拥有者,可以用chgrp 来更改文件的群组
chown user1 test.txt
chown user1:user1
chgrp user2 test.txt

二.标准输出
ls -l > list.file

错误输出
ls-l 2> err.file
ls-l 2>> err.file

双重输出重定向
find /Users/ -name passwd > stdout.file 2> stderr.file

使用&将输出到同一个文件
find /Users/ -name passwd &> out.file
find /Users/ -name passwd > stdout.file 2>&1

linux管道
使用 | 将前一个过滤器的输出直接送到后一个过滤器的输入,允许多个管道
比如
ls | grep pass
ls -l …

nginx屏蔽某些ip访问

最近发现很多奇怪的访问,比如访问xmlrpc.php文件,查了一下,是一种暴力破解攻击的行为。还有很多访问404的页面,也很可能是一种不正常访问行为。

面对这些行为,首先要做的就是博客密码的密码,尽可能地设置复杂密码,提高破解的难度。

还有一种技术手段,就是屏蔽掉该ip(然并卵,换个ip一样能访问),也能只看到一个屏蔽一个了。

我用是nginx服务器,需要在nginx的目录下(其它目录也可以)创建blockips.conf文件,加入以下代码。

在http中加入代码

保存后,重启nginx即可,被屏蔽的ip访问时,会跳到

403 Forbidden

页面

Shadowsocks优化加速

最近闲时把digitalocean服务器上的shadowcocks优化了一下,优化后google搜索基本在2秒以内出结果,我基本达到了我科学上网的要求,更重要的是工作的时候提高了我的效率。如果想还快一点,可以用国内的一台vps做二级代理,速度可提升不少。

Shadowsocks要比vpn轻很多,同时也要快很多,在网终环境不好的时候,vpn也经常容易断,影响效率。
平时科学上网大多数时候都是用Shadowsocks,速度快不说,还不用老让我重连,然后Shadowsocks还有很多优化空间。
1.加密方式推荐使用rc4-md5
TIPS: 加密方式推荐使用rc4-md5,因为 RC4 比 AES 速度快好几倍,如果用在路由器上会带来显著性能提升。旧的 RC4 加密之所以不安全是因为 Shadowsocks 在每个连接上重复使用 key,没有使用 IV。现在已经重新正确实现,可以放心使用。/etc/shadowsocks.json配置文件如下;
{
    “server”:”my_server_ip”,
    “server_port”:8000,
    “local_address”: “127.0.0.1”,
    “local_port”:1080,
    “password”:”mypassword”,
    “timeout”:300,
    “method”:”rc4-md5″
}

重新启动即可
ssserver -c /etc/shadowsocks.json -d stop
ssserver -c /etc/shadowsocks.json -d start

2.锐速加速
锐速是一款非常不错的TCP底层加速软件,可以非常方便快速地完成服务器网络的优化,配合 ShadowSocks 效果奇佳。目前锐速官方也出了永久免费版本,适用带宽20M、3000加速连接,个人使用是足够了。如果需要,先要在锐速官网注册个账户。

然后确定自己的内核是否在锐速的支持列表里,如果不在,请先更换内核,如果不确定,请使用 手动安装。

确定自己的内核版本在支持列表里,就可以使用以下命令快速安装了。

wget http://my.serverspeeder.com/d/ls/serverSpeederInstaller.tar.gz
tar xzvf serverSpeederInstaller.tar.gz
bash serverSpeederInstaller.sh
输入在官网注册的账号密码进行安装。
然后选择需要加速的接口、上行及下行最大带宽,这里不需要输入任何内容,参数设置直接回车默认即可,
最后两项输入 y 开机自动启动锐速,y 立刻启动锐速。之后可以通过lsmod查看是否有appex模块在运行。

到这里还没结束,我们还要修改锐速的3个参数,vi /serverspeeder/etc/config

rsc=”1″ #RSC网卡驱动模式
advinacc=”1″ #流量方向加速
maxmode=”1″ #最大传输模式
digitalocean vps的网卡支持rsc和gso高级算法,所以可以开启rsc=”1″,gso=”1″。

重新启动锐速

service serverSpeeder restart

注:
如果遇到..Failed to write configuration: /proc/net/appex/wanKbps的错误,
需要删除掉

rm -rf /serverspeeder/

然后重新尝试在官网手动下载安装包serverSpeederInstaller.tar.gz
解压重复以上安装步骤bash serverSpeederInstaller.sh即可

附:/serverspeeder/etc/config 各参数配置

启动锐速: /serverspeeder/bin/serverSpeeder.sh start
加载锐速模块, 使用/serverspeeder/etc/config 文件中的配置作为锐速的初始化参数;

停止锐速:/serverspeeder/bin/serverSpeeder.sh stop
卸载加速模块;卸载前请确认没有其它进程在访问/proc/net/appex/目录,例如确认控制台当前目录是否是/proc/net/appex/;

实时修改锐速参数: /serverspeeder/bin/serverSpeeder.sh reload
修改/serverspeeder/etc/config 文件中的配置后运行此命令,此时模块不退出,参数被实时修改;

如何卸载锐速?
在确保锐速没有运行的情况下,您可以通过两种方式来卸载锐速:
1. 使用安装脚本的卸载功能卸载锐速,如:./serverSpeederInstaller.sh uninstall
2. 通过简单的删除操作,如’rm -rf /serverspeeder/’,即可将锐速完全卸载;
通过修改/appex/etc/config 文件,可以为 LotServer 设定不同的配置参数;常用参
数的说明如下:
1) accif=”eth*”
加速接口;eth*一般为服务器上对外提供服务的网络接口,例如 eth0, eth1„,一
般通过 …

makefile

概述
——

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。

在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。

关于程序的编译和链接
——————————

在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.

好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

Makefile 介绍
———————

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

一、Makefile的规则

在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target … : prerequisites …
command

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。(任意的Shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。呵呵。还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。内容还多着呢。:)

二、一个示例

正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o

main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c …

linux常用shell命令记录

获取本机内网IP

/sbin/ifconfig | grep “inet addr” -m 1 | cut -d “:” -f 2 | cut -d ” ” -f 1
输出unix时间戳

date +%s
从路径中获取文件名

basename /usr/bin/sort
Output “sort”.
basename include/stdio.h .h
Output “stdio”.
遍历指定路径文件

file_list=ls dir
for file in $file_list
do
echo $file
done
gdb attach指定进程名的进程

#! /bin/sh

if [ $# -lt 1 ]; then
echo “please give a name”
exit 1
fi

ENTRY=ps x | grep $1 -m 1
PID=echo $ENTRY | cut -d ” ” -f 1
while true; do