木叶三忍的博客

web开发

Menu Close

Category: Linux (page 1 of 2)

Linux手把手搭建samba服务实战

场景描述:平常我比较喜欢在电脑上装Linux虚拟机,作为我的开发环境。因此涉及到windows和linux的文件共享场景,我会装Samba服务器或者NFS之类的软件,今天记录下Samba服务器在CentOS6.8下的安装。

准备:

请确保确定到root用户,可以使用su -命令执行切换,此外请确保禁用了Selinux和防火墙。

第一步:更新yum仓库:

yum update

第二步:安装Samba

yum -y install samba

第三步:创建一个用于操作的用户

useradd konohanaruto -s /sbin/nologin

设置密码:

smbpasswd -a konohanaruto

连续输入两次密码之后,则代表成功创建用户!

如果不想创建新用户也行,但是smbpasswd -a xxxx必须被执行,smb密码和系统用户密码的shadow并不是一样的加密方式,我习惯了root,所以我通常:

smbpasswd -a root

这样就能设置我的密码,再次强调,和系统密码没半毛钱关系,这里改了smb密码后系统用户密码不会被改变,反之一样!

第四步:修改配置文件

vim /etc/samba/smb.conf 在内容最后加上如下内容:

[Development]
comment = Project Directory
path = /www/
create mask = 755
directory mask = 777
writeable = yes
browseable = yes

说明:

[Development]:访问时的显示名称
path:你需要共享的目录
create mask:创建文件后的文件所具有的权限,由于受umask影响,虽然设置755,最终可能还会是744权限
directory mask:同上
writeable:目录是否可写入
browseable:是否可以浏览目录内容

最后在window端访问我的共享:

会提示输入用户名和密码,按照你的设定输入即可,然后将会看到:

接着:

最后将可以看到像本地磁盘一般,挂载在我们的windows主机上:

CentOS6下搭建LAMP、LNMP或LEMP基本环境软件包组的安装

 

安装完centos6系统后, 可以执行

yum update

更新一下最新版本的各种包信息。

然后, 安装环境必须的包组

yum -y groupinstall “Development Tools” “Additional Development”

CentOS6.8环境下搭建LAMP服务器Apache、Mysql、PHP的详细步骤

 

需要yum源的,可以参考我之前的文章:

http://www.muyesanren.com/2017/03/18/centos-require-aliyun-yum-repo/

 

安装下基本的所需组件:

yum groupinstall “Development Tools” “Additional Development”

 

一、安装Apache httpd:

先安装一个依赖包:

yum -y install pcre-devel

安装apr:

tar xf apr-1.4.6.tar.gz

cd apr-1.4.6

./configure –prefix=/usr/local/apr

make

make install

安装apr-util包:

tar xf apr-util-1.5.4.tar.gz

cd apr-util-1.5.4

./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr

make

make install

开始安装httpd:

tar xf httpd-2.4.20.tar.gz

cd httpd-2.4.20

./configure --prefix=/usr/local/httpd \
--sysconfdir=/etc/httpd \
--enable-so \
--enable-rewrite \
--enable-ssl \
--enable-cgi \
--enable-cgid \
--enable-modules=most \
--enable-mods-shared=most \
--enable-mpms-shared=all \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util

make && make install

额外说明:

–enable-so必须指定,不然php将无法被apache加载!

 

修改httpd的主配置文件,设置其Pid文件的路径

编辑/etc/httpd/httpd.conf,添加如下行, 最后一行也行!(为下方脚本作准备,不加会报错):

PidFile “/var/run/httpd.pid”

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#	       HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/httpd/bin/apachectl
httpd=${HTTPD-/usr/local/httpd/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
	echo -n $"Stopping $prog: "
	killproc -p ${pidfile} -d 10 $httpd
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  status)
        status -p ${pidfile} $httpd
	RETVAL=$?
	;;
  restart)
	stop
	start
	;;
  condrestart)
	if [ -f ${pidfile} ] ; then
		stop
		start
	fi
	;;
  reload)
        reload
	;;
  graceful|help|configtest|fullstatus)
	$apachectl $@
	RETVAL=$?
	;;
  *)
	echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
	exit 1
esac

exit $RETVAL

可能出现的错误一:

Starting httpd: AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using 61.183.1.186. Set the ‘ServerName’ directive globally to suppress this message

解决如下:

vim /etc/httpd/httpd.conf

删除ServerName的注释#, 并设置为localhost或者是127.0.0.1

可能出现的错误二:

Stopping httpd: [FAILED]

Starting httpd: httpd (pid 17161) already running

解决: 请确保上方步骤中那个pid文件信息行行已加入/etc/httpd/httpd.conf

配置开机自启动:

chkconfig –add httpd

chkconfig httpd on

二、安装Mysql:

同: http://www.muyesanren.com/2017/03/19/centos6-lnmp-build-explain

三、安装PHP:

yum install -y libmcrypt libmcrypt-devel

tar xf php-5.6.24.tar.gz

cd php-5.6.24

./configure --prefix=/usr/local/php \
 --with-mysql=/usr/local/mysql \
 --with-openssl \
 --with-mysqli=/usr/local/mysql/bin/mysql_config \
 --enable-mbstring \
 --with-freetype-dir \
 --with-jpeg-dir \
 --with-png-dir \
 --with-zlib \
 --with-libxml-dir=/usr \
 --enable-xml \
 --enable-sockets \
 --with-apxs2=/usr/local/httpd/bin/apxs \
 --with-mcrypt \
 --with-config-file-path=/etc \
 --with-config-file-scan-dir=/etc/php.d \
 --with-bz2 \
 --enable-maintainer-zts

 

make && make install

cp php.ini-production /etc/php.ini

编辑apache配置文件httpd.conf,以apache支持php

vim /etc/httpd/httpd.conf, 查找AddType出现的相似的代码块,或在最后面添加也行,如下:

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

同样再定位至DirectoryIndex index.html , 修改为:

DirectoryIndex index.php index.html

 

创建/usr/local/httpd/htdocs/test.php, 插入如下代码:

<?php

phpinfo();

 

可能出现页面无法解析或者下载的情况:

排错方案一:查看apache是否加载了php模块,或者说modules目录下是否有存在php模块

ls -l /usr/local/httpd/modules/ | grep php

libphp5.so

如果有这个模块, 接着:

/usr/local/httpd/bin/httpd -M | grep php

php5_module (shared)

这两个都确定存在,最后再次 vim /etc/httpd/httpd.conf

查看是否有这么一行, 如果不存在就添加之:

LoadModule php5_module modules/libphp5.so

排错方案二:按照方案一设置了, 还是无法解决php无法解析问题

导出一下头文件和库文件

ln -sv /usr/local/httpd/include /usr/include/httpd

ldconfig

最后再次: service httpd restart, 然后再次测试, 一切OK!

CentOS6.8下搭建LNMP环境安装Nginx、Mysql、PHP详细步骤

安装下基本的所需组件:

yum groupinstall “Development Tools” “Additional Development”

一、Nginx的安装:

下载nginx.tar.gz包, 过程省略!

安装pcre扩展包:

yum -y install pcre-devel

添加nginx用户和nginx组:

groupadd -r nginx

useradd -r -g nginx nginx

编译配置nginx:

./configure \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre

最后:

make && make install

为nginx添加启动脚本文件, 编辑/etc/init.d/nginx, 添加如下内容:

#!/bin/sh
#
#nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/etc/nginx/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

为脚本赋予执行权限:

chmod +x /etc/init.d/nginx

添加至服务管理列表,并让其开机自动启动:

chkconfig –add nginx

chkconfig nginx on

而后就可以启动服务并测试了:

service nginx start

二、编译安装mysql5.6.32

groupadd mysql

useradd -r -g mysql -s /bin/false mysql

tar xf mysql-5.6.32.tar.gz

cd mysql-5.6.32

mkdir bld

cd bld

cmake ..

make

make install

cd /usr/local/mysql

chown -R mysql .

chgrp -R mysql .

scripts/mysql_install_db –user=mysql

chown -R root .

chown -R mysql data

bin/mysqld_safe –user=mysql &

cp support-files/mysql.server /etc/init.d/mysqld

chkconfig –add mysqld

chkconfig mysqld on

cp support-files/my-default.cnf /etc/my.cnf

vim /etc/profile.d/mysqld, 添加如下内容:

export PATH=$PATH:/usr/local/mysql/bin

vim /etc/man.config, 在最后一行添加如下内容:

MANPATH /usr/local/mysql/man

输出mysql的头文件至系统头文件路径/usr/include,如下:

ln -sv /usr/local/mysql/include /usr/include/mysql

输出mysql的库文件给系统库查找路径:

echo ‘/usr/local/mysql/lib’ > /etc/ld.so.conf.d/mysql.conf

而后让系统重新载入系统库:

ldconfig

最后, 重新启动测试下效果:

如果报错pid文件不存在,可以尝试以下方案:

尝试方案:

chown -R mysql:mysql /usr/local/mysql/data

chmod -R 755 /usr/local/mysql/data

终极方案:

清空mysql数据目录下所有内容:

rm -rf data/*

重新初始化:

scripts/mysql_install_db –user=mysql

三、编译安装php5.6.24

yum install -y libmcrypt libmcrypt-devel

tar xf php-5.6.24.tar.gz

cd php-5.6.24

./configure \
 --prefix=/usr/local/php \
 --with-mysql=/usr/local/mysql \
 --with-openssl \
 --enable-fpm \
 --enable-sockets \
 --enable-sysvshm \
 --with-mysqli=/usr/local/mysql/bin/mysql_config  \
 --enable-mbstring \
 --with-freetype-dir \
 --with-jpeg-dir \
 --with-png-dir \
 --with-zlib-dir \
 --with-libxml-dir=/usr \
 --enable-xml \
 --with-mhash \
 --with-mcrypt \
 --with-config-file-path=/etc \
 --with-config-file-scan-dir=/etc/php.d \
 --with-bz2 \
 --with-curl

make && make install

为php提供配置文件:

cp php.ini-production /etc/php.ini

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

chmod +x /etc/init.d/php-fpm

chkconfig –add php-fpm

chkconfig php-fpm on

为php-fpm提供配置文件:

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

编辑php-fpm的配置文件:

vim /usr/local/php/etc/php-fpm.conf

配置fpm的相关选项为你所需要的值:

pm.max_children = 150

pm.start_servers = 8

pm.min_spare_servers = 5

pm.max_spare_servers = 10

接下来就可以启动php-fpm了:

service php-fpm start

四、整合nginx和php

1、编辑/etc/nginx/nginx.conf,启用如下选项:

location ~ \.php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    include fastcgi_params;
}

2、编辑/etc/nginx/fastcgi_params,将其内容更改为如下内容:

提示:快速清空内容: >/etc/nginx/fastcgi_params

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

 

并在所支持的主页面格式中添加php格式的主页,类似如下:

location / {
    root html;
    index index.php index.html index.htm;
}

而后重新载入nginx的配置文件:

service nginx reload

3、在/usr/html新建index.php的测试页面,测试php是否能正常工作:

vim /usr/html/index.php

<?php

phpinfo();

五、配置nginx的虚拟主机,并且都支持PHP

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

cd /etc/nginx

创建额外配置文件目录:

mkdir conf.d

编辑主配置文件:

vim nginx.conf

在http代码块中引入附加的配置文件, 类似:

include conf.d/vhosts.conf; #引入额外配置文件

include mime.types;

编辑额外的配置虚拟主机配置文件:

vim /etc/nginx/conf.d/vhosts.conf

添加内容如下:

server{
    listen 80;
    server_name lnmp.server;
    charset utf-8;
    index index.php index.html index.htm;
    root /www/lnmp.server;
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
        include fastcgi_params;
    }

}

 

创建虚拟主机根目录:

mkdir -p /www/lnmp.server

添加测试文件:

vim /www/lnmp.server/index.php

内容如下:

<?php

phpinfo();

 

编辑本地hosts文件, vim /etc/hosts, 添加一行:

127.0.0.1 lnmp.server

最后测试:

curl lnmp.server

安装完成!有遗漏的欢迎联系我的微信号wikitest, 或直接下方留言!

CentOS6.8引入阿里云yum源

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

Linux 是如何分区格式化磁盘并挂载使用的?

在 Linux 是去如何分区格式化一块磁盘分区的,并使用之?流程如下图

wKioL1PA5fvj5VhvAADvlciwNEs674.jpg

1、分区

(1)、首先要,知道一块磁盘是否有空间没有划分分区的?

划分分区是根据柱面(cylinders),有没有剩余的柱面才可以再划分分区,否则的话是不可以的。

但是要注意的是:

我们最多可以划分4个主分区,如果查看磁盘上还有剩余的柱面(cylinders)的话,也是不可再划分分区了。也就是说这些剩余的柱面

是再也没法使用了。除非重新对该磁盘划分分区。

查看是否有剩余柱面:

[root@Node1 ~]# fdisk  -l /dev/sda
 
Disk /dev/sda: 85.9 GB, 85899345920 bytes
255 heads, 63 sectors/track, 10443 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00088117
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda3            7859        8120     2103516   83  Linux
                      |           |
                  \|/         \|/
           磁盘分区的开始柱面   磁盘分区的结束柱面

说明:

可以使用上述方式,查看一个磁盘的是否有空闲。因为磁盘分区是根据“柱面cylinders”,

所以,如果最后一个分区的结束柱面数小于磁盘的总的柱面数的话,表明该磁盘还有没有被划分的柱面。

如果,最后一个分区的结束柱面数等于磁盘的总的柱面数的话,该磁盘的所有柱面都被划分分区了。

(2)、使用工具:【fdisk】【sfdisk】【parted】划分分区。

【fdisk】是一个交互式的磁盘分区工具。

[root@Node1 ~]# fdisk /dev/sda -->进入【fdisk】的交互交界后使用下述的命令完成磁盘分区操作
                      m         查看fdisk的帮助
              p         列出磁盘的分区情况
              n         创建新的分区
              d         删除分区
                      t         指定分区使用什么系统主要是跟文件系统相对应的。
              w         保存退出
              q         不保存退出

这样就完成了磁盘的分区的创建。内核是自己不会识别刚创建的分区的。我们要在新创建的分区上安装软件(也就是格式化分区,也就是创建文件系统),

内核必须要知道有该分区。否则的话是无法在该分区创建文件系统的。

2、让内核识别分区,CentOS 的5版本和 CentOS 的6版本使用的工具不一样。

CentOS 5 使用【partitions】
    CentOS 6 使用【partx】或【kpartx】

(1)、怎么知道内核是否识别到磁盘和分区呢?可以通过内核提供给用户空间的一个接口/proc 来查修内核工作的一些信息。

[root@Node1 ~]# cat /proc/partitions
major minor  #blocks  name
 
   8        0   83886080 sda
   8        1     204800 sda1
   8        2   62914560 sda2
   8        3    2103516 sda3
 253        0   20971520 dm-0
 253        1    2097152 dm-1
 253        2   10485760 dm-2
 253        3   20971520 dm-3

说明:上述标识的就是内核识别到的磁盘分区。如果你刚创建的分区没有列出来,就要通知内核了。

(2)、怎么样,通知内核识别新建的分区

【kpartx】是【partx】的升级版

partx -a   DEVOCE
  kpartx -a  DEVOCE
  kpartx -f  DEVOCE 
  kpartx -fa DEVOCE

如果,内核识别到刚创建的分区了,就可以在该分区上创建指定的文件系统了。

 

3、格式化(创建文件系统)

(1)、选择文件系统

文件系统也是一个软件,它的作用就是直接管理磁盘上的文件的。该软件和平时的软件不同,它是直接做到内核的,通常把它做成内核的一个模块。能够实现同一类功能的软件很多,比如:可以管理磁盘上的文件的软件(文件系统)有:ext2、ext3、ext4、xfs、ufs、ceph、htrfs等。

这文件系统各有各的特点,它们在不同场景有不同的表现能力。所以,我们要根据实际应用来选择管理我们磁盘的软件(文件系统)。这得先要了解它们各有什么特点。才可以根据实际应用,选择最符合应用需要的文件系统。比如:我们要存储的一个文件通常是16M,那么就要选择一个支持大文件存储的文件系统。有些文件系统支持的磁盘块(block),很大。假如我们创建文件系统时设置 block size 大小8M,2块block就可以把一个文件存储完了。如果我们创建文件系统的时候,的block 的大小为2M.

那么我们存储16M的数据得需要8个磁盘块。这8块需要块在磁盘上不一定是连续的,那么就会产生“异步IO”。速度肯定比我们把一个文件存储在一块磁盘块慢得多。

不过,我们选择的文件系统要支持大的磁盘块才可以。

我们选择了最适合现在的应用的文件系统,操作系统支持才可以使用。因为文件系统是由内核管理的。那么怎么知道,我们使用的操作系统是否支持呢?以CentOS 6

为例:

[root@Node1 ~]# cat /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   usbfs
nodev   pipefs
nodev   anon_inodefs
nodev   inotifyfs
nodev   devpts
nodev   ramfs
nodev   hugetlbfs
        iso9660
nodev   pstore
nodev   mqueue
nodev   selinuxfs
        ext4
nodev   rpc_pipefs
nodev   autofs

通过上述方法,就可以知道:CentOS 6 是否支持我们选择的文件系统了。

用户是通过,VFS(虚拟文件系统),与底层的很多的文件系统打交道的。VFS是底层这些文件系统的一个抽象层。所以,我们可以这样认为只要VFS支持的文件系统。Linux系统都支持。

注意:有时候我们会有这种情况:通过 linux 的官方,知道支持该文件系统,但是 CentOS 却不支持。这是什么原因呢?

因为,在编译 linux 内核源代码的时候,把支持该文件系统的功能关闭了。如果,我们又想使用该文件系统呢,只有重新编译内核。

我们可以通过查看文件 /boot/config-2.6.32-358.el6.i686  在编译内核的时候是如何配置的。我们也可以参考该配置文件,把支持该文件系统的功能开启后重新编译内核。

(2)、使用工具安装文件系统(格式化)。【mkfs】或【mke2fs】

格式化会把扇区(512)组织成块(block),而我们存储数据的时候,是以块来存储的,如:我们的块大小为2M,而我们要存储5M大小的文件。那么我们就需要使用3个磁盘块(block)来存储该文件。剩余的1M空闲,是不可用来存储其它文件数据的。它霸占了这1M的存储空间(浪费)所以,我们分区的时候要根据实际需要设定块(block)的大小。

如果我们的分区磁盘空间完全被使用完,当系统管理员进行维护的时候,就就尴尬了。所以我们得有预留空间,给管理员执行维护操作.

在 Windows 系统中,可以给不同的盘起不同的名称。Linux 系统也可以,不过称之为“卷标”。不过计算识别该分区还是根据设备号的。只不过是一个标识而已。

【mke2fs】该命令对文件系统的可定制性很强,所以选择该命令来定制符合我们需要的文件系统。

Usage: mke2fs OPTIONS... DEVICE
   -c                        检测块的好坏再创建文件系统
   -t  {ext2,ext3,ext4}     指定文件系统
   -b   {1024,2048,4096}     指定块大小 
   -L   LABEL                指定卷标
   -j   相当于 -t ext3  
   -i   #   # 创建 innode 的百分比
   -N   #   直接指定可用的inode数
   -m  # 指定预留空间占整个分区空间的百分之五。Reserved block count 预留块数。默认预留5%

4、挂载

在 Linux 系统,新的分区格式化好是不可以直接使用的,需要“挂载”才可以使用。这不像 Windows 。Linux 层次式的倒树状结构来管理目录文件,

所有目录文件都属于根(/),当然我们访问某一个目录文件也要通常根(/),一级级访问。如下图:访问/var/log/message 的过程。从下图可以看得出我们访问一个文件要多次去查 inode table.为了提高查表的速度,系统会把 innode table缓存在内存的缓冲区中。不竟访问内存的速度要比访问磁盘的速度快得多。通常也会把用户访问过的目录文件与inode的对应关系缓存起来。下一次再访问该数据就可以直接到磁盘上去取数据了。这些数据通常会保存在 buffer 和 cached 中。

wKiom1PA6bfSOJAvAAIYxpo04ZM476.jpg

我们访问一个文件要经过很多查找过程,特别是文件所在的目录比较深的时候。所以,如果我们的文件

在Linux的目录树中离根(/)越近,访问该文件会比较快点。

既然,我们访问磁盘中的文件入口只有一个(根),所以我们要把新格式化好的分区与根(/)下的一个目录关联起来。让它属于根(/)的一员。那么该目录就是

该分区设备的访问入口了,但它还是属于根(/)的.这样就使得本无层次的分区有了层次结构(分区是属于文件树的第几层)了。挂载使用【mount】命令:

mount [option]... [-t fstype] [-o option] 设备 挂载点
                   指定文件系统  设备的选项参数
-t       fstype    指定文件系统类型(一般情况下不需要指定,自动识别)
-r       readonly   只读挂载
-w       read and  write   读写挂载
-L       以卷标指定设备, mount -L MYDATA 挂载点
-U       以UUID 的方式指定设备  mount UUID='uuid' 挂载点
-a       自动挂载所有(/etc/fstab文件中定义的)的支持自动挂载的所有设备
-n       挂载时,不更新/etc/mtab文件
-o   option   其实是指定在设备上操作数据时候的动作。
     async               异步I/O 往该分区写数据时候,是采用异步方式。数据暂时存放在内存中
                         然后再把数据一次性同步到磁盘上。虽然这在一定程序上提高了写操作的
                         性能,但是对于数据安全很高的应用就直接考虑了。
     sync                同步I/O 
     atime/noatime       文件和目录被访问时是否更新最近一次的访问时间戳比较繁忙的系统见议
                         关闭。因为,更新就需要写,增加额外的工作。如果可以忽略的话可以禁
                         止。                    
    auto/noauto          设备是否支持【mount -a】自动挂载.写在 /etc/fstab 文件中的设备才
                         可以使用该方法自动挂载。
    diratime/nodiratime  目录被访问时是更新最近一次的访问时间戳
    dev/nodev            是否支持在此设备上使用设备
    exec/noexec          是否允许执行此设备上的二进制程序文件
    suid/nosuid          是否支持在此设备的文件上使用suid
    remount              重新挂载,通常用于不卸载时重新挂载指定挂载选项
    ro                   只读 
    rw                   读写
    acl                  在此设备是否支持使用facl,默认不支持。

注意:挂载时可以不指定选项,只要默认选项符合你当前系统应用的要求,默认选项有哪些呢?

defaults
        Use default options: rw, suid, dev, exec, auto,  nouser,  async,and relatime.

显然,如果我们需要用到 acl 功能,就不可以使用默认了。

Linux 系统识别设备是依靠设备号的,可以查看 /dev 目录中的设备文件(设备的一个访问入口罢了)。系统比较人性化,使用字符串来标识设备,如:sda1 表示第一块磁盘的第一分区。但是系统识别 sda1 设备还是靠设备号的。像我们还可以给分区创建一个卷标来标识该分区。所以我们挂载设备的时候标识挡挂载的设备就有多种方式了

如下:

使用UUID号来标识设备

[root@Node1 /]# mount -o acl UUID="47b2cb89-20de-4adb-8cc5-e45e172d0028" /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)
 
[root@Node1 /]# mount -o acl -U 47b2cb89-20de-4adb-8cc5-e45e172d0028 /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)

使用设备名称挂载设备

[root@Node1 /]# mount -o acl /dev/sda3 /mydata
[root@Node1 /]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw,acl)

使用自定义的卷标挂载设备

[root@Node1 mydata]# mount -L MYDATA /mydata
[root@Node1 ~]# mount | grep "\<sda3\>"
/dev/sda3 on /mydata type ext4 (rw)

说明:虽然它们都可以标识设备并挂载成功,但是它们是有区别的,在主机很多磁盘的情况下。最好使用 UUID的方式挂载。

UUID是唯一的设备标识符,不会重复。是该设备的终身标志。如我们的***。

补充:

【blkid】查看指定块设备的信息

[root@Node1 ~]# blkid /dev/sda1
/dev/sda1: UUID="12e178c7-8a7e-4d2e-a33b-b3b17f8ef842" TYPE="ext4"

修改分区的各项参数属性:

tune2fs
      -j                     ext2 升级为 ext3.  注意:只可升级不可降级。但是,我们在挂载
                             的时候可以明确指定不使用,日志功能。
      -L   LABEL             修改卷标
      -m  #                  修改预留百分比
      -O  [^]FEATURE          启用指定特性,特性前加^,表示关闭此种特性。
      -o  [^]mount-options    开始或关闭指定的挂载选项

CentOS6下安装DRBD详细步骤

DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。

DRBD功能如下:

单主模式:典型的高可靠性集群方案。
复主模式:需要采用共享cluster文件系统,如GFS和OCFS2。用于需要从2个节点并发访问数据的场合,需要特别配置。
复制模式:3种模式:
协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。
协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。
一般用协议C。选择协议将影响流量,从而影响网络时延。
有效的同步:按线性而不是当初写的顺序同步块。同步损坏时间内的不一致数据。
在线的设备检验:一端顺序计算底层存储,得到一个数字,传给另一端,另一端也计算,如果不一致,则稍后进行同步。建议一周或一月一次。
复制过程的一致性检验:加密后,对方若不一致则要求重传。防止网卡、缓冲等问题导致位丢失、覆盖等错误。
Split brain:当网络出现暂时性故障,导致两端都自己提升为Primary。两端再次连通时,可以选择email通知,建议手工处理这种情况。
当数据写在缓冲区里,没有真正写到磁盘上时,系统崩溃会导致数据丢失。而disk flush是指将数据真正写到磁盘上后才返回。
有些带电池的硬盘控制器,如带电池的带点出Dell PERC Raid卡,不但自带缓存而且自带电池,会在系统意外断电或者崩溃后将最后的数据写入磁盘,对这类控制器,可以使用disk flush,从而在保证性能的前提下提高了数据的安全性。
磁盘错误处理策略:
传递给上层:可能造成文件系统remounting成只读,不推荐。
对上层屏蔽:用另一端的相应块进行读写,应用不中断。可以在任何方便的时候再切换。
不一致的(inconsistent)数据:不能以任何方式访问和使用的数据。如正在同步时的目标节点数据,这些数据不能识别,不能mount,甚至不能通过磁盘的自动检测。
过期的(outdated)数据:在备机上的数据,与主机一致,但不需要同步。如主备机网络中断后,备机上的数据就是过期的。
DRBD有接口允许应用程序在网络中断时将备机数据标识为过期的。DRBD拒绝将这个节点提升为主角色。这些管理接口在Heartbeat框架上得到完整实现。
一旦过期资源的复制链接恢复,他的过期标志自动清除,接着进行后台同步。

首先,更新下yum并且安装一些需要的扩展:

yum -y update 

yum -y install gcc make automake autoconf libxslt libxslt-devel flex rpm-build kernel-devel 

reboot

下一步,在家目录下创建一些必要的目录,用来存储rpm包:

mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

下一步,下载.tar.gz包:

wget http://oss.linbit.com/drbd/drbd-utils-latest.tar.gz \
http://oss.linbit.com/drbd/8.4/drbd-8.4.5.tar.gz

下一步,解压并切换到这两个目录下执行操作:

tar xf drbd-8.4.5.tar.gz 

cd drbd-8.4.5

make km-rpm

cd ../

tar xf drbd-utils-latest.tar.gz

cd drbd-utils-8.9.6

./configure

make rpm

######在家目录生成的很多文件,我们切换进去######

cd ~/rpmbuild/RPMS/x86_64

最后,我们执行:

rpm -Uvh drbd-utils-*.rpm drbd-km-*.rpm

OK,安装完毕!

Linux常见主机之间出现的连接等错误的解决方案

列举下例子:

No route to host 防火墙

contect refuse 防火墙,端口没打开

command not found 命令敲错

no such file or directory 文件或目录不存在

Access denied 权限,selinux问题

permission denied 权限,selinux问题

一般出现此类问题,先看命令是否有问题

接着先ping xx.xx.xx.xx是否通畅

最后telnet xx.xx.xx.xx 端口

就可以得出结论了。

rsync客户端以及服务器端配置,推送、数据拉取、定时备份以及常见错误解决思路

rsync可以是一个网络服务(port socket)

rsync命令是客户端命令:

第一种工作模式:local
rsync -avz /etc/hosts /tmp/ ==== cp
rsync -avz –delete /null/ /tmp/ ==== rm

第二种工作模式:remote shell
push:
rsync -avzP -e ‘ssh -p 22’ /tmp/ root@192.168.2.113:/tmp/
pull:
rsync -avzP -e ‘ssh -p 22’ root@192.168.2.113:/tmp/ /tmp/

关键语法说明:
1. -avz相当于-vzrtopgDl, 标识同步文件时文件和目录属性不变。
2. -P显示同步的过程,可以用–progress替换
3. -e ‘ssh -p 22’,标识通过ssh的通道传输数据,-p 22可省略
4. root@192.168.2.113:/tmp/ 远程的主机系统用户, 地址, 路径。
5. /tmp本地的路径

==============服务器端配置===============

一、vi /etc/syncd.conf (这是服务器端配置文件,默认不存在的,所以我们自己创建),并粘贴如下内容:

#Rsync server
#created by konohanaruto
##rsyncd.conf start##

# 客户端连接进来,等同于以下的用户和组的访问权限
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false

# 主机的IP段,我家里的路由都是192.168.2打头,所以我就可以填192.168.2.0
hosts allow = 192.168.2.0/24
hosts deny = 0.0.0.0/32

# 用于认证的虚拟用户,就是一个字符串而已,可以随意定义
auth users = rsync_backup

# 虚拟用户的密码文件存放地址,格式usename:password
secrets file = /etc/rsync.password
##################用户操作的模块部分#####################
[backup]

# 注释信息
comment = backup-server by konohanaruto 2017-03-01 21:39:28

# 操作的目录
path = /backup

二、创建rsync用户,创建/backup目录

useradd rsync -s /sbin/nologin -M

检查:

id rsync

mkdir /backup

chown -R rsync /backup

三、创建密码文件

echo “rsync_backup:123456” > /etc/rsync.password

#此项必须为600

chmod 600 /etc/rsync.password

四、启动并检查服务

rsync –daemon

netstat -tnlp | grep rsync

五、加入开机启动并检查

echo “rsync –daemon” >> /etc/rc.local

cat /etc/rc.local

 

=========rsync客户端============

一、创建密码文件,注意,只需要密码即可

echo “123456” >> /etc/rsync.password

chmod 600 /etc/rsync.password

二、推数据

格式,man一下daemon模式

Access via rsync daemon:
Pull: rsync [OPTION…] [USER@]HOST::SRC… [DEST]
rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]
Push: rsync [OPTION…] SRC… [USER@]HOST::DEST
rsync [OPTION…] SRC… rsync://[USER@]HOST[:PORT]/DEST

 

实践:

rsync -avz  /src rsync_backup@192.168.2.127::backup –password-file=/etc/rsync.password

三、拉数据

rsync -avz rsync_backup@192.168.2.127::backup /src –password-file=/etc/rsync.password

可能报错误如下:

1.

rsync: failed to connect to 192.168.2.127: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

这个是由于防火墙的原因,解决如下:

/etc/init.d/iptables stop   [立刻关闭,重启后失效]

chkconfig iptables off   [重启后生效]

额外补充下防火墙的基本使用:

重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off 或者 /sbin/chkconfig –level 2345 iptables off
即时生效,重启后失效
service 方式
开启: service iptables start
关闭: service iptables stop
iptables方式
查看防火墙状态:
/etc/init.d/iptables status
暂时关闭防火墙:
/etc/init.d/iptables stop
重启iptables:
/etc/init.d/iptables restart

OK,再次推数据,一切正常。如果还失败,请保证你的selinux配置正确关闭。

查看SELinux状态:

1、/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态

SELinux status:                 enabled

2、getenforce                 ##也可以用这个命令检查

关闭SELinux:

1、临时关闭(不用重启机器):

setenforce 0                  ##设置SELinux 成为permissive模式

setenforce 1                  ##setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可

2.

failed to create pid file……

原因:未正常停止服务,解决方案,rm -rf [pid文件],然后重新再启动。

总结:

一、注意目录的斜线问题

客户端如果目录后方带有斜线,则推送的将是目录的所有内容,而不包括这个目录本身,也就是说只是目录里面的内容被推送了,建议是都加斜线!

二、安全性

一般我们在生产环境建议加上–address=ADDRESS绑定一个内网IP,拒绝外网连接。

好,我们先杀掉之前的rsync进程:

pkill rsync

检查:

netstat -tnlp | grep rsync

接着我们绑定一个内网ip地址:

rsync –daemon –address=192.168.2.127

生产环境中,我们可能要跨机房做实时同步,而且要保证安全,这样解决方式有两种:① 拉专线,做局域网 ② 用VPN搭建局域网环境,实现数据实时同步。

 

CentOS6中挂载NFS后提示Permission denied,rw权限无法写入的问题

挂载的配置在/etc/exports文件中,当然我们可以查看帮助:

man exports

挂载NFS后,虽然给了rw权限,但是还是提示无法写入,报错:Permission denied,那是因为NFS把访问的用户的所有权限全部压缩成某个用户了,是哪个呢?让我们来看看nfs的其它,挂载后输入:

cat /var/lib/nfs/etab 
/data	192.168.2.*(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

可以看到,我们得所有访客被压缩成uid为65534的用户了。

cat /etc/passwd | grep 65534
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

用户名为nfsnobody,所以解决方案有两种。

一、递归设置一下目录为777,当然这个并不是好的解决方案

二、设置下相应目录的属主等改为65534这个用户(推荐)

 

 

© 2019 木叶三忍的博客. All rights reserved.

Theme by Anders Norén.