环境部署:CentOS7 下 Redis4 安装与配置(Redis开机启动)

一、前言

环境信息

  • CentOS 7
  • Redis 4.0.2

二、安装步骤

  • 安装基础依赖
#安装基础依赖包
sudo yum install -y gcc gcc-c++ make jemalloc-devel epel-release
  • 下载Redis( https://redis.io/download )
#从官网获取最新版本的下载链接,然后通过wget命令下载
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
  • 解压到指定目录
#创建目录
sudo mkdir /usr/redis
#解压
sudo tar -zvxf redis-4.0.2.tar.gz -C /usr/redis
  • 编译&安装
#进入目录
cd /usr/redis/redis-4.0.2
#编译&安装
sudo make & make install
  • 启动redis-server
#进入src目录
cd /usr/redis/redis-4.0.2/src
#启动服务端
sudo ./redis-server
  • 启动redis客户端测试
#进入src目录
cd /usr/redis/redis-4.0.2/src
#启动客户端
sudo ./redis-cli

设置:set key1 value1
获取:get key1

三、Redis配置

1、 配置本机外访问

  • 修改配置:绑定本机IP&关闭保护模式
#修改配置文件
sudo vi /usr/redis/redis-4.0.2/redis.conf

#更换绑定
#将bind 127.0.0.1 更换为本机IP,例如:192.168.11.11
bind 192.168.11.11

#关闭保护模式
protected-mode no
  • 开放端口
#增加redis端口:6379
sudo firewall-cmd --add-port=6379/tcp --permanent
#重新加载防火墙设置
sudo firewall-cmd --reload
  • Redis指定配置文件启动
#进入目录
cd /usr/redis/redis-4.0.2
#指定配置文件启动
sudo ./src/redis-server redis.conf
  • Redis客户端连接指定Redis Server
#进入目录
cd /usr/redis/redis-4.0.2
#连接指定Redis Server
sudo ./src/redis-cli -h 192.168.11.11

2、配置Redis开机启动

将Redis配置成为系统服务,以支持开机启动

  • 创建Redis服务
#创建服务文件
sudo vi /usr/lib/systemd/system/redis.service

#文件内容
[Unit]
Description=Redis Server
After=network.target

[Service]
ExecStart=/usr/redis/redis-4.0.2/src/redis-server /usr/redis/redis-4.0.2/redis.conf --daemonize no
ExecStop=/usr/redis/redis-4.0.2/src/redis-cli -p 6379 shutdown
Restart=always

[Install]
WantedBy=multi-user.target
  • 设置Redis服务开机启动&开启服务
#设置Redis服务开机启动
sudo systemctl enable redis
#启动Redis服务
sudo systemctl start redis

新玩法,CentOS7中LVM通过扩展逻辑卷扩展swap空间

在我们日常运维工作中,偶尔也会遇到需要扩展swap空间的操作。扩展swap空间的方法很多,现在让我们一起来探讨一下,在LVM下扩展swap空间的方法。

1、查看一下卷组,是否还有空闲空间能用于扩展swap空间。

[root@Geeklp201 ~]# vgdisplay

未分类

从倒数第二行,我们可以看到,本机centos卷组的空闲空间小于5GB,分出1GB来扩展swap空间足够了。
  
2、查看逻辑卷。

[root@Geeklp201 ~]# lvdisplay

未分类
  
逻辑卷swap的路径为/dev/centos/swap。扩展逻辑卷swap。
  

[root@Geeklp201 ~]# lvextend -L 2GB /dev/centos/swap
Size of logical volume centos/swap changed from 1.00 GiB (256 extents) to 2.00 GiB (512 extents).
Logical volume centos/swap successfully resized.

扩展成功!然而,用free命令看一下,当前swap空间并未增加。还需要执行以下几步:
  

[root@Geeklp201 ~]# swapoff /dev/centos/swap
[root@Geeklp201 ~]# mkswap /dev/centos/swap
mkswap: /dev/centos/swap: warning: wiping old swap signature.

正在设置交换空间版本 1,大小 = 2097148 KiB
  
无标签,UUID=4250fdac-92c1-43f4-b266-c9d9c69a2783

[root@Geeklp201 ~]# swapon /dev/centos/swap

未分类

增加成功!都不用去修改fstab文件,是不是很方便?

Centos7修改docker的Data Space Total大小

记得备份你的容器

此处就不多做介绍了

–storage-opts 参数

devicemapper文档:https://github.com/moby/moby/tree/master/daemon/graphdriver/devmapper
docker官方文档:https://docs.docker.com/engine/reference/commandline/dockerd/#options-per-storage-driver

修改docker的启动参数

停止docker,修改配置,重新加载配置

<code><span class="hljs-built_in">sudo</span> systemctl stop docker
<span class="hljs-built_in">sudo</span> vi /lib/systemd/system/docker.service</code>

找到 ExecStart=/usr/bin/dockerd
在这一行后面加上
--storage-opt dm.loopdatasize=8G --storage-opt dm.loopmetadatasize=4G --storage-opt dm.basesize=8G 即可,意思是为,设置devicemapper的data为8G,metadata为4G,镜像的大小不能大于8G

记得还要抹去现有的空间,请确保你已经完成了第一步

<code>sudo rm -rf /var/lib/docker
sudo mkdir -p /var/lib/docker/devicemapper/devicemapper/
sudo dd <span class="hljs-keyword">if</span>=<span class="hljs-regexp">/dev/zero</span> of=<span class="hljs-regexp">/var/lib</span><span class="hljs-regexp">/docker/devicemapper</span><span class="hljs-regexp">/devicemapper/data</span> bs=<span class="hljs-number">1</span>M count=<span class="hljs-number">0</span> seek=<span class="hljs-number">8192</span>
sudo dd <span class="hljs-keyword">if</span>=<span class="hljs-regexp">/dev/zero</span> of=<span class="hljs-regexp">/var/lib</span><span class="hljs-regexp">/docker/devicemapper</span><span class="hljs-regexp">/devicemapper/metadata</span> bs=<span class="hljs-number">1</span>M count=<span class="hljs-number">0</span> seek=<span class="hljs-number">4096</span></code>

完成后运行

<code><span class="hljs-built_in">sudo</span> systemctl daemon-reload
<span class="hljs-built_in">sudo</span> systemctl start docker
docker info</code>

查看是否设置正确,貌似比预设的大了一点点。

未分类

CentOS7 配置 httpd虚拟机(Apache设置多个网站)

本文在 CentOS 7系统中使用httpd配置两个基于域名访问的虚拟主机。

当前环境

[root@bing /]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Oct 19 2017 20:39:16
[root@bing /]# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

这里配置两个例子

虚拟机1:www.bing1.com

虚拟机2:www.bing2.com

1. 创建虚拟机文件目录

  • mkdir -pv /var/www/bing1 #www.bing1.com网站目录
  • mkdir -pv /var/www/bing2 #www.bing2.com网站目录
  • mkdir -pv /var/log/httpd/bing1 #www.bing1.com日志目录
  • mkdir -pv /var/log/httpd/bing2 #www.bing2.com日志目录

2. 创建虚拟主机配置文件

  • vi /etc/httpd/conf.d/vhost.conf
# 虚拟主机1的配置

<VirtualHost *:80>

ServerName www.bing1.com                             #虚拟机1设置域名为www.bing1.com
DocumentRoot /var/www/bing1                          #虚拟机网站目录
ErrorLog “/var/log/httpd/bing1/error_log”                            #错误日志
CustomLog “/var/log/httpd/bing1/access_log” combined    #访问日志
<Directory /var/www/bing1>

Options -Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted                                                        #允许所有请求

</Directory>

</VirtualHost>
# 虚拟主机2的配置

<VirtualHost *:80>

ServerName www.bing2.com
DocumentRoot /var/www/bing2
ErrorLog “/var/log/httpd/bing2/error_log”
CustomLog “/var/log/httpd/bing2/access_log” combined
<Directory /var/www/bing2>

Options -Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted

</Directory>

</VirtualHost>
  • #保存后重启apache
  • systemctl restart httpd #重启apache

完成上面配置后就可以了

在bing1和bing2目录创建html页面测试,内容如下

[root@bing /]# cat var/www/bing1/index.html
this is bing1
[root@bing /]# cat var/www/bing2/index.html
this is bing2

修改客户端主机的hosts文件,以便能解析域名

hosts在windows环境下的路径为C:WindowsSystem32driversetc。在该文件中添加两行

192.168.31.197  www.bing1.com

192.168.31.197  www.bing2.com

访问结果如下:

未分类

解决CentOS7出现的”Failed to start firewalld.service”问题

如果我们从CentOS6过渡到CentOS7系统来的话,会发现原来的iptables被firewalld取代,而且相应的命令格式也稍微有些变化。今天老左有在设置添加放行端口的时候的出现”FirewallD is not running”的错误提示,应该是没有开启firewalld导致的。

未分类

解决CentOS7出现的”Failed to start firewalld.service”问题
既然没有启动,于是就执行”systemctl start firewalld”启动,但是又出现”Failed to start firewalld.service: Unit is masked.”错误。继续找解决方法,然后输入”systemctl unmask firewalld.service”。

未分类

解决CentOS7出现的”Failed to start firewalld.service”问题
然后再启动”systemctl start firewalld.service”即可解决问题没有报错。

centos7下安装iptables防火墙(关闭firewalld)

说明:centos7默认使用的firewalld防火墙,由于习惯使用iptables做防火墙,所以在安装好centos7系统后,会将默认的firewall关闭,并另安装iptables进行防火墙规则设定

系统操作环境centos7

[root@serve1 ~]# cat /etc/redhat-release    
CentOS Linux release 7.4.1708 (Core)

关闭firewalld防火墙

systemctl stop firewalld    #关闭firewalld防火墙
systemctl disable firewalld    #禁止开机自启

安装iptables防火墙并开启

yum install iptables-services    #安装iptables防火墙
systemctl start iptables    #启动
systemctl enable iptables    #开机自启

关闭SELinux

vim /etc/selinux/config
SELINUX=disabled    #把enforcing改为disabled
setenforce 0     #即时生效

CentOS7上搭建FTP服务+VSFTPD配置全解析

FTP 服务

   FTP是早期的应用级协议之一,是一种基于C/S结构的双通道协议。

   可以作为FTP服务器的软件有很多,比如Wu-ftpd,Proftpd,Pureftpd,ServU,IIS,都可以。其中vsftpd是CentOS默认的FTP服务器。也是我们今天的主角,接下来将会进行重点介绍。   既然是一种C/S结构的应用,有服务端就会有客户端。在Linux平台上可以作为FTP客户端的软件也有很多,诸如ftp,lftp,lftpget,wget,curl等。在Windows上也有很多的图形界面客户端,例如 filezilla,CuteFtp,FlashFXP,LeapFtp 等。

FTP 用户认证

FTP 的用户一共有三种类型

  • 匿名用户:ftp,anonymous,对应Linux用户ftp
  • 系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
  • 虚拟用户:特定服务的专用用户,独立的用户名/密码文件

VSFTPD服务

  • vsftpd 服务,由vsftpd包提供,直接使用yum安装就可以。
  • 用户认证配置文件:/etc/pam.d/vsftpd
  • 服务脚本: /usr/lib/systemd/system/vsftpd.service,/etc/rc.d/init.d/vsftp
  • 配置文件:/etc/vsftpd/vsftpd.conf
  • 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
  • 系统用户共享文件位置:用户家目录
  • 虚拟用户共享文件位置:为其映射的系统用户的家目录

VSFTPD服务配置

vsftpd 服务配置 大多数都在配置文件/etc/vsftpd/vsftpd.conf中,所以我们的大部分配置只要修改这个文件就可以。

查看帮助文档

可以使用man命令查看配置文件的帮助文档,查看有哪些选项是我们需要的,以及各种值分别代表什么含义。

man 5 vsftpd.conf

命令端口

ftp默认端口是21端口,如果配置文件中没有明确指定的话,就是21端口。当然也可以明确指定,或者指定为别的端口。在配置文件中添加下面这一行就可以。

listen_port=21

主动模式端口

ftp 的链接方式有两种,分别是主动模式和被动模式。这两种模式都是从服务器的角度来查看和定义的。

# 这这里的选项一直定义为YES就可以。
# 如果不写这一行,默认的也是YES
connect_from_port_20=YES 

# 如果要重新定义主动模式的端口为其他的值的话,那就再加上下面行,并指定端口值
ftp_data_port=2020 

被动模式端口范围

linux客户端默认使用被动模式,windows 客户端默认使用主动模式。在配置文件中加入下面两行,代表可以定义被动模式的端口范围。

pasv_min_port=6000 
pasv_max_port=6010

# 如果这个属性指定为0的话,那么就随机分配
pasv_min_port=0 

使用当地时间

设置是否使用当地时间。默认就是YES.

use_localtime=YES

匿名用户

是否支持匿名用户

# YES 支持匿名用户
anonymous_enable=YES

匿名用户略过口令检查,默认为no。如果为YES的时候,匿名用户登陆时,不会提示用户名和密码,直接登陆。如果为NO的话,匿名用户登陆时还是会提示输入密码,只不过,系统不会再去验证密码的正确性。系统默认的匿名账户有两个,分别是ftp和anonymous。

no_anon_password=YES

匿名上传。首先,文件系统上用户的家目录,要具备写权限。其次,ftp服务器要开启允许匿名上传的配置。也就是说,ftp用户的家家目录需要进行配置权限。

anon_upload_enable=YES 

匿名用户能够创建目录。这一点与匿名上传一样,不仅需要注意服务的配置,同时需要注意用户的家目录权限。

anon_mkdir_write_enable=YES

默认只能下载全部读的文件。这句话的意思是说,如果启动了这句话,则匿名用户只能下载所有用户都具备读权限的文件。如果有一个文件,有一个用户不剧本读权限,匿名用户就不能够下载。

anon_world_readable_only=YES

匿名用户能否删除和修改上传的文件。默认是no,也就是不可以。

anon_other_write_enable=YES

指定匿名上传文件的umask值。umask的值可以直接影响到上传文件的权限。

anon_umask=077 

指定上传文件的默认的所有者和权限。 完成了这些指定之后,匿名用户上传的元数据就是我们指定的那些内容。

chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644

系统用户

默认情况下,操作系统的账户是可以直接使用用户名和密码来登陆的。并且登陆成功之后,默认进入到了自己的家目录。
所有系统用户都映射成guest用户,但是映射的guest账户,需要人为地去指定下。同时这个guest账户与匿名账户类似,不允许家目录具有写权限,否则容易导致安全隐患。

guest_enable=YES

#配合上面选项才生效,指定guest用户
guest_username=ftp 

是否允许Linux用户登陆,默认是允许的,当然也可以禁止。

local_enable=YES 

是否允许Linux用户上传文件,如果用户默认允许登陆的话,linux用户登陆成功之后,默认位于自己的家目录,这时是允许上传文件的。 如果将下面的这句话,改成no,则服务拒绝linux用户上传文件,即便位于自己的家目录也不可以。

write_enable=YES

指定系统用户上传文件的默认权限

local_umask=022

非匿名用户登录所在目录,当使用Linux用户登陆成功之后,就不会默认在自己的家目录了。相反,会位于下面指定的目录里。

local_root=/ftproot

禁锢所有系统用户在家目录中

禁锢所有的用户在家目录中的意思是说,用户登陆成功之后,不能够随意切换目录,只能够在自己的家目录中进行操作。 服务默认是NO,也就是不禁锢,这样的话,有比较大的安全隐患。

chroot_local_user=YES

禁锢或者不禁锢特定的用户

可以针对某一些用户进行单独的设置,例如对某一些用户进行禁锢,而对另外一些用户进行禁锢。
在/etc/vsftpd/chroot_list文件中,指定需要做出特殊处理的用户。当chroot_list_enable选项为YES的时候,列表中的用户不被禁锢。而不在列表中的用户则被禁锢。反之,则相反。

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

wu-ftp日志:默认启用

wu-ftp日志,默认安装,默认启用。

xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成

vsftpd日志:默认不启用

vsftpd日志,默认不启用,如果想要启用的话,应该手动进行配置修改。

#使用vsftpd日志格式,默认不启用
dual_log_enable=YES 
#(默认)可自动生成
vsftpd_log_file=/var/log/vsftpd.log

登录提示信息

登陆提示信息图形界面是看不到的,只适用于ftp作为客户端的时候。可以使用下面的方式来进行配置。但是优先级却不一样。

ftpd_banner=“welcome to mage ftp server"

# 这一句话优先生效
banner_file=/etc/vsftpd/ftpbanner.txt 

目录访问提示信息

当用户进入到某一个目录之后,可以给用户一个提示消息。用来提示这个目录的作用。在相应的目录下建立一个隐藏文件 .message,在该文件中进行信息提示描述。

dirmessage_enable=YES (默认)
message_file=.message(默认)

使用pam(Pluggable Authentication Modules)完成用户认证

pam模块是Linux中的一种安全验证机制。所以vsftpd也可以根据pam模块进行用户的认证。 pam的配置文件/etc/pam.d/vsftpd,在这个文件中指定了默认文件/etc/vsftpd/ftpusers 默认文件中用户拒绝登录. 而vaftpd配置文件中,定义了pam模块。

pam_service_name=vsftpd

是否启用控制用户登录的列表文件

在黑名单中的用户,连密码提示都没有。

# 默认有此设置
# YES的时候启用了userlist
userlist_enable=YES

# YES(默认值)黑名单,不提示口令,NO为白名单
userlist_deny=YES

userlist_file=/etc/vsftpd/users_list 此为默认值

连接限制

链接限制,可以指定链接用户的最大数量,也就是最大的并发链接数。

# 最大并发连接数
# 如果为0的话,默认不限制
max_clients=0 

# 每个IP同时发起的最大连接数
# 如果为0的话,则默认不限制数量
max_per_ip=0 

vsftpd服务指定用户身份运行

vsftpd服务启动时要开启相应的进程,那么相应的进程就有一定的用户身份。如果指定了,那么服务启动之后,就会以指定的用户来启动服务进程。

nopriv_user=nobody

限定传输速率:字节/秒
如果在上传和下载的过程中,没有对速率进行限制,很容易对服务器造成损坏。所以最好进行一下限定。注意单位是 字节

# 匿名用户的最大传输速率
# 如果为0的话,则默认不限制
anon_max_rate=0 

# 本地用户的最大传输速率
# 如果为0的话,则默认不限制
local_max_rate=0 

限定链接时间:秒

指定用户连接到ftp服务器上的时间。时间单位是秒,这样做的好处是,如果用户连接到服务器之后,却不做任何操作的话,很容易浪费资源。这样是一种浪费。

# 主动模式数据连接超时时长
connect_timeout=60
# 被动模式数据连接超时时长
accept_timeout=60 
# 数据连接无数据输超时时长
data_connection_timeout=300 
# 无命令操作超时时长
idle_session_timeout=60 

优先以文本方式传输

文件在传输的过程中,可以指定是以文本方式传输,还是以二进制的方式传输。默认是以二进制的形式进行传输。 这里有一点需要注意,如果指定了以文本方式传输的话,Linux平台和Windows平台对文本的处理方式是不一样的,打个比方说,Linux平台上回车符是一个字节,但是在Windows的平台上是两个字节,也就是CRLF,这样也就导致,如果在Windows平台上使用客户端从Linux上FTP服务器下载文件,Windows会自动对文本进行转化的,反之也是一样。

如果我们传输一个二进制文件的话,二进制文件应该就会被破坏掉。

ascii_upload_enable=YES
ascii_download_enable=YES

配置FTP服务以非独立服务方运行:listen=NO,默认为独立方式

FTP服务既可以作为独立服务运行,也可以作为非独立服务进行运行。所谓非独立服务,指的就是使用xinetd服务代替FTP服务来监听21端口,当有用户访问FTP服务的时候,xinetd服务就会自动启动FTP服务,并提供给用户访问。

listen=YES,表示以独立的服务运行,listen=no表示以非独立的服务进行运行。

cat /etc/xinetd.d/vsftpd
service ftp
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}

实现基于SSL的FTPS

FTP服务,默认用户登陆时的口令是明文的。这样很容易被获取到,那么vsftpd服务是否支持SSL来进行加密呢?

查看是否支持SSL

# 使用下面的命令能够查看到是否支持SSL
# 查看到libssl.so
ldd `which vsftpd` 

创建自签名证书

# 进入到证书路径
cd /etc/pki/tls/certs/
# 使用下面的命令生成证书私钥和证书
make vsftpd.pem

openssl x509 -in vsftpd.pem -noout –text

配置vsftpd服务支持SSL:/etc/vsftpd/vsftpd.conf

#  启用SSL
ssl_enable=YES 
#  匿名不支持SSL
allow_anon_ssl=NO 
#  本地用户登录加密
force_local_logins_ssl=YES 
#  本地用户数据传输加密
force_local_data_ssl=YES
#  指定证书路径
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem

vsftpd虚拟用户

虚拟用户:

所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录。

各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定。

虚拟用户帐号的存储方式:

文件:编辑文本文件,此文件需要被编码为hash格式

奇数行为用户名,偶数行为密码

db_load -T -t hash -f vusers.txt vusers.db

  
关系型数据库中的表中:

实时查询数据库完成用户认证

mysql库:pam要依赖于pam-mysql

/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

实现基于文件验证的vsftpd虚拟用户

1、创建用户数据库文件

# 创建用户文件
vim /etc/vsftpd/vusers.txt

ftp1    用户名
ftp1pass  密码
tom     用户名
tompass 密码


# 进入到相应的目录下
cd /etc/vsftpd/

# 创建数据库文件
db_load -T -t hash -f vusers.txt vusers.db

# 修改数据库权限
chmod 600 vusers.db

2、创建系统用户和访问FTP目录

虚拟用户访问FTP服务器的时候,要进入到自己的家目录下,但是系统中没有虚拟账户所对应的账号家目录,所以我们要创建一个系统用户,与虚拟账户关联起来,这样,当虚拟用户登陆之后,就会进入到我们创建的系统用户的家目录,然后进行数据访问。

对于CentOS7,家目录有写权限,用户在登陆的时候会出错的。所以要做一些特殊处理

# 创建系统用户并指定家目录
useradd -d /var/ftproot -s /sbin/nologin vuser
# 修改家目录权限
chmod +rx /var/ftproot/  

#CentOS 7 中要做出一些特殊的配置 

# 去掉家目录写权限
chmod -w /var/ftproot/

mkdir /var/ftproot/upload
setfacl -m u:vuser:rwx /var/ftproot/upload

3、创建pam配置文件

修改vsftpd的pam模块的配置文件 /etc/pam.d/vsftpd.db ,让vsftpd支持pam模块进行身份验证。

auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

4、指定pam配置文件

修改vsftpd的配置文件 /etc/vsftpd/vsftpd.conf ,给vsftpd指定pam模块。

guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db

5、SELinux设置

如果对SELinux有什么特殊要求的话,可以单独对SELinux进行设置,如果没有特殊要求的话,直接禁用SELinux就可以。

6、虚拟用户建立独立的配置文件

在vsftpd的配置文件中指定,用户配置文件的存储路径,然后在/etc/目录下,创建相应的目录,并且在目录中定义与用户名一致的配置文件并写入相应权限就可以了。

在vsftpd的配置文件 /etc/vsftpd/vsftpd.conf 中指定如下路径.

user_config_dir=/etc/vsftpd/vusers.d/

在etc目录下,创建如下的文件目录,这一个目录与前面在vsftpd配置文件中定义的一致。

mdkir /etc/vsftpd/vusers.d/

进入到/etc/vsftpd/vusers.d/ 目录下,创建与用户名同名的配置文件,例如用户为tom,那么就创建一个与tom一致的配置文件。 将下面的内容,写入配置文件,就可以进行权限控制。

# 虚拟用户上传权限
anon_upload_enable=YES
# 虚拟用户创建文件夹
anon_mkdir_write_enable=YES
# 虚拟的其他用户对指定用户目录的写权限
anon_other_write_enable=YES

或者还可以改变用户的默认登陆目录。也就是FTP用户登陆成功之后的默认路径。

#登录目录改变至指定的目录
local_root=/ftproot

CentOS7服务器连接nas拷贝文件

1. 给nas配置固定ip并用网线直接连接到nas上

先把nas连接到局域网里,在局域网里用windows下的nas厂商提供的工具查找到了nas的ip,进去web页面将ip设置为固定ip 192.168.3.3。 CentOS服务器有两个网卡,em1正在使用(dhcp分配的ip)不可变动,em2没在使用。

用网线将em2和nas的网口直连。配置em2网卡的IP为192.168.3.5。配置centos路由,先查看route。

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.31.0.1      0.0.0.0         UG    100    0        0 em1
172.31.0.0      0.0.0.0         255.255.255.0   U     100    0        0 em1
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

如果发现有em2的route,先route del -net x.x.x.x netmask x.x.x.x dev em2 删掉。
添加到192.168.3.3的route。

route add -host 192.168.3.3 dev em2
[root@localhost ~]# route        
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.31.0.1      0.0.0.0         UG    100    0        0 em1
172.31.0.0      0.0.0.0         255.255.255.0   U     100    0        0 em1
192.168.3.3     0.0.0.0         255.255.255.255 UH    0      0        0 em2
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

这样再ping 192.168.3.3就可以ping通了。

2. 安装SmbClient,把nas的文件夹mount到/mnt/smb下。

yum install samba samba-client samba-swat
mkdir /mnt/smb
smbclient -L 198.168.3.3 -U username%password  #列出该IP地址所提供的共享文件夹
mount -o username=username,password=123456 //192.168.3.3/tmp /mnt/smb/ #mount

这样就可以到/mnt/smb访问nas了。

Centos7 MariaDB安装

MariaDB 是 MySQL 数据库的自由开源分支,与 MySQL 在设计思想上同出一源,在未来仍将是自由且开源的。Red Hat Enterprise Linux/CentOS 7.0 发行版已将默认的数据库从 MySQL 切换到 MariaDB.

安装MariaDB-server

yum -y update  
yum -y install mysql  
yum -y install mariadb-server mariadb-client  
systemctl enable mariadb  
systemctl start mariadb  
systemctl status mariadb  
[root@centos-rpi2 ~]# systemctl status mariadb
● mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2017-10-11 09:46:50 HKT; 4h 12min ago
Main PID: 1425 (mysqld_safe)
CGroup: /system.slice/mariadb.service
├─1425 /bin/sh /usr/bin/mysqld_safe –basedir=/usr
└─1587 /usr/libexec/mysqld –basedir=/usr –datadir=/var/lib/mysql…
Oct 11 09:46:36 centos-rpi2 mariadb-prepare-db-dir[1346]: Initializing MariaD…
Oct 11 09:46:37 centos-rpi2 mariadb-prepare-db-dir[1346]: 171011 9:46:37 [No…
Oct 11 09:46:38 centos-rpi2 mariadb-prepare-db-dir[1346]: 171011 9:46:38 [No…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: PLEASE REMEMBER TO …
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: To do so, start the…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: ‘/usr/bin/mysqladmi…
Oct 11 09:46:39 centos-rpi2 mariadb-prepare-db-dir[1346]: ‘/usr/bin/mysqladmi…
Oct 11 09:46:40 centos-rpi2 mysqld_safe[1425]: 171011 09:46:40 mysqld_safe L….
Oct 11 09:46:40 centos-rpi2 mysqld_safe[1425]: 171011 09:46:40 mysqld_safe S…l
Oct 11 09:46:50 centos-rpi2 systemd[1]: Started MariaDB database server.
Hint: Some lines were ellipsized, use -l to show in full.

配置root账户

mysql -u root -p

直接回车

[root@centos-rpi2 ~]# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 5
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input statement.

MariaDB [(none)]>
use mysql;  
update user set password=password('Shuai_sqj') where user='root';  
grant all privileges on *.* to 'root'@'%' identified by 'Shuai_sqj' with grant option;  
//创建root远程管理  
flush privileges;  
exit

centos7下docker二进制文件编译

系统环境与软件版本

  • OS:Centos7 64bit

  • Kernel Version:3.10.0-693.2.2.el7.x86_64

  • Golang Version: go1.8.4 linux/amd64

  • Docker: 17.05.0-ce

浅谈docker源码编译

官方提供编译步骤依次为:make build和make binary。先看懂Makefile会帮助理解docker基本结构。

  • make build
    其实就是docker build,于是要看Dockerfile文件。其制作一个叫docker-dev的镜像,镜像中会生成源码编译的环境。

  • make binary
    其实就是docker run docker-dev,即运行docker-dev一个容器,并在容器中的bundles文件夹下生成dockers所需的二进制文件。

通过查看Dockerfile以下内容:

# Install tomlv, vndr, runc, containerd, tini, docker-proxy
# Please edit hack/dockerfile/install-binaries.sh to update them.
COPY hack/dockerfile/binaries-commits /tmp/binaries-commits
COPY hack/dockerfile/install-binaries.sh /tmp/install-binaries.sh
RUN /tmp/install-binaries.sh tomlv vndr runc containerd tini proxy bindata

可以看出具体的binary来自脚本install-binaries.sh。

  • install-binaries.sh
    此脚本涉及到docker-containerd系列,docker-runc,docker-init和docker-proxy等组件的源码地址,以及编译命令

  • binaries-commits
    此文件涉及到各类组件的commit编号,使用git checkout -q xxxxxxxx来切换到相对应的tree上

以下内容,实际便是抽出install-binaries.sh中的内容,独立完成,从而获得docker所有编译后的二进制文件。如要生成rpm文件,需进一步研究

Golang的安装与配置

可以在 下载 – Golang中国 (https://www.golangtc.com/download) 中下载相对应的安装包。安装包go1.9.linux-amd64.tar.gz和脚本install_go.sh放在同一个目录下。

代码下载: https://o-my-chenjian.com/download/Make-Docker-Executable-File-On-CentOS7/install_go.sh

#!/bin/bash

cur_path=`pwd`

# 解压go包
sudo tar zxvf ${cur_path}/go1.8.4.linux-amd64.tar.gz -C /usr/local

# 创建GOPATH文件夹
sudo mkdir -p /home/mygo

# 设置go环境变量
sudo echo "export GOROOT=/usr/local/go" >> /etc/profile
sudo echo "export GOPATH=/home/mygo" >> /etc/profile
sudo echo "export PATH=$PATH:$GOROOT/bin" >> /etc/profile
. /etc/profile

# 安装wget
sudo yum install -y wget

# 更新为aliyun源
sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 安装git
sudo yum install -y git

# 安装go包管理工具govendor
go get -u github.com/kardianos/govendor
cp ${GOPATH}/bin/govendor /usr/local/go/bin/

结果如下:

go version
<<'COMMENT'
go version go1.8.4 linux/amd64
COMMENT

ls /home/mygo/ /home/mygo/src/ /home/mygo/src/github.com/ /usr/local/go/bin/

<<'COMMENT'
/home/mygo/:
bin  pkg  src

/home/mygo/src/:
github.com

/home/mygo/src/github.com/:
kardianos

/usr/local/go/bin/:
go  godoc  gofmt  govendor
COMMENT

docker编译二进制文件

安装依赖软件

yum install -y gcc make cmake device-mapper-devel btrfs-progs-devel libarchive libseccomp-devel glibc-static

编译docker等二进制文件

组件:

  • docker: docker-client端
  • dockerd: docker-server端

操作:

cd $GOPATH/src/github.com/

mkdir docker && cd docker

# 下载相关版本的docker源码
git clone -b v17.05.0-ce https://github.com/moby/moby.git

cp -R moby/ docker && rm -rf moby/

# docker编译
cd  $GOPATH/src/github.com/docker/docker/cmd/docker
go build
cp docker /usr/local/bin/

# dockerd编译
cd  $GOPATH/src/github.com/docker/docker/cmd/dockerd
go build
cp dockerd /usr/local/bin/

编译containerd等二进制文件

组件:

  • docker-containerd
  • docker-containerd-ctr
  • docker-containerd-shim

操作:

# 下载相关版本的container源码
git clone https://github.com/containerd/containerd.git "${GOPATH}/src/github.com/docker/containerd"
cd "${GOPATH}/src/github.com/docker/containerd"
git checkout -q 9048e5e50717ea4497b757314bad98ea3763c145

# 组件编译
cd  ${GOPATH}/src/github.com/docker/containerd

make static
<<'COMMENT'
cd ctr && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/ctr
cd containerd && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/containerd
cd containerd-shim && go build -ldflags "-w -extldflags -static -X github.com/docker/containerd.GitCommit=9048e5e50717ea4497b757314bad98ea3763c145 " -tags "" -o ../bin/containerd-shim
COMMENT

cp bin/containerd /usr/local/bin/docker-containerd
cp bin/containerd-shim /usr/local/bin/docker-containerd-shim
cp bin/ctr /usr/local/bin/docker-containerd-ctr

编译docker-runc二进制文件

组件:

  • docker-runc

操作:

cd $GOPATH/src/github.com/

mkdir opencontainers && cd opencontainers

# 下载相关版本的runc源码
git clone -b v1.0.0-rc2 https://github.com/opencontainers/runc.git "${GOPATH}/src/github.com/opencontainers/runc"

# runc编译
cd  ${GOPATH}/src/github.com/opencontainers/runc

make BUILDTAGS="${RUNC_BUILDTAGS:-"selinux"}" static

<<'COMMENT'
CGO_ENABLED=1 go build -i -tags "selinux cgo static_build" -ldflags "-w -extldflags -static -X main.gitCommit="c91b5bea4830a57eac7882d7455d59518cdf70ec-dirty" -X main.version=1.0.0-rc2" -o runc .
COMMENT

cp runc /usr/local/bin/docker-runc

编译docker-init二进制文件

组件:

docker-init

操作:

cd $GOPATH/src/github.com/

mkdir krallin && cd krallin

# 下载相关版本的tini源码
git clone https://github.com/krallin/tini.git "$GOPATH/tini"
cd "$GOPATH/tini"
git checkout -q 949e6facb77383876aeff8a6944dde66b3089574

cmake .
<<'COMMENT'
-- The C compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Performing Test HAS_BUILTIN_FORTIFY
-- Performing Test HAS_BUILTIN_FORTIFY - Failed
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mygo/tini
COMMENT

make tini-static
<<'COMMENT'
Scanning dependencies of target tini-static
[100%] Building C object CMakeFiles/tini-static.dir/src/tini.c.o
Linking C executable tini-static
[100%] Built target tini-static
COMMENT

cp tini-static /usr/local/bin/docker-init

编译docker-proxy二进制文件

组件:

docker-proxy

操作:

cd $GOPATH/src/github.com/docker

# 下载相关版本的proxy源码
git clone https://github.com/docker/libnetwork.git "$GOPATH/src/github.com/docker/libnetwork"
cd "$GOPATH/src/github.com/docker/libnetwork"
git checkout -q 7b2b1feb1de4817d522cc372af149ff48d25028

# proxy编译
go build -ldflags="$PROXY_LDFLAGS" -o /usr/local/bin/docker-proxy github.com/docker/libnetwork/cmd/proxy

运行docker

ll /usr/local/bin/docker*

<<'COMMENT'
-rwxr-xr-x. 1 root root 25845680 Oct 10 14:00 /usr/local/bin/docker
-rwxr-xr-x. 1 root root 12474568 Oct 10 14:01 /usr/local/bin/docker-containerd
-rwxr-xr-x. 1 root root 11435336 Oct 10 14:03 /usr/local/bin/docker-containerd-ctr
-rwxr-xr-x. 1 root root  3858880 Oct 10 14:04 /usr/local/bin/docker-containerd-shim
-rwxr-xr-x. 1 root root 55072232 Oct 10 14:02 /usr/local/bin/dockerd
-rwxr-xr-x. 1 root root   824568 Oct 10 14:59 /usr/local/bin/docker-init
-rwxr-xr-x. 1 root root  2528043 Oct 10 15:10 /usr/local/bin/docker-proxy
-rwxr-xr-x. 1 root root 10894408 Oct 10 14:16 /usr/local/bin/docker-runc
COMMENT

groupadd docker

dockerd
<<'COMMENT'
INFO[0000] libcontainerd: new containerd process, pid: 9024 
WARN[0000] containerd: low RLIMIT_NOFILE changing to max  current=1024 max=4096
WARN[0001] failed to rename /var/lib/docker/tmp for background deletion: %!s(<nil>). Deleting synchronously 
INFO[0001] [graphdriver] using prior storage driver: overlay 
INFO[0001] Graph migration to content-addressability took 0.00 seconds 
INFO[0001] Loading containers: start.
INFO[0001] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address 
INFO[0001] Loading containers: done.
INFO[0001] Daemon has completed initialization
INFO[0001] Docker daemon                                 commit=library-import graphdriver=overlay version=library-import
INFO[0001] API listen on /var/run/docker.sock
COMMENT

ps aux|grep docker
<<'COMMENT'
root     11753  0.2  2.8 343472 28860 pts/1    Sl+  14:09   0:00 dockerd
root     11756  0.0  0.6 267908  6240 ?        Ssl  14:09   0:00 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc
root     11890  0.0  0.0 112660   976 pts/2    R+   14:10   0:00 grep --color=auto docker
COMMENT

docker version
<<'COMMENT'
Client:
 Version:      library-import
 API version:  1.29
 Go version:   go1.8.4
 Git commit:   library-import
 Built:        library-import
 OS/Arch:      linux/amd64

Server:
 Version:      library-import
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.8.4
 Git commit:   library-import
 Built:        library-import
 OS/Arch:      linux/amd64
 Experimental: false
COMMENT

docker pull busybox

docker run -idt busybox
<<'COMMENT'
b6f61b4b5ec9ce2b4331a47a1e8a3552b2162ca0f152ec2e02dfbf169d64a80a
COMMENT

docker ps -a
<<'COMMENT'
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b6f61b4b5ec9        busybox             "sh"                27 minutes ago      Up 27 minutes                           loving_noether
COMMENT

可以看到,在启动dockerd后,会启动另一个程序docker-containerd。

制作docker的systemd-unit

docker.service

cat > docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io

[Service]
Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/local/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target
EOF

启动docker服务

sudo cp docker.service /etc/systemd/system/docker.service
sudo systemctl daemon-reload

sudo systemctl enable docker
<<'COMMENT'
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /etc/systemd/system/docker.service.
COMMENT

sudo systemctl start docker

sudo systemctl status docker
<<'COMMENT'
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-10-11 15:27:51 CST; 3s ago
     Docs: http://docs.docker.io
 Main PID: 1152 (dockerd)
   Memory: 67.2M
   CGroup: /system.slice/docker.service
           ├─1152 /usr/local/bin/dockerd --log-level=error
           └─1156 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd...

Oct 11 15:27:51 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Oct 11 15:27:51 localhost.localdomain systemd[1]: Starting Docker Application Container Engine...
COMMENT

TroubleShooting

  • /bin/bash^M: bad interpreter:没有那个文件或目录

参考: http://blog.csdn.net/yongan1006/article/details/8142527

  • Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误

参考: http://blog.csdn.net/shudaqi2010/article/details/32938715