0

0

基于Kickstart的Hadoop集群自动化部署

php中文网

php中文网

发布时间:2016-06-07 16:34:41

|

2976人浏览过

|

来源于php中文网

原创

在 基于Kickstart PXE的CentOS无人值守安装 一文中,介绍了一种高度自动化的RedHat Linux安装方式。由于Kickstart支持脚本,利用Kickstart技术也可以实现Hadoop集群的自动化部署。本文试构建一种利用Kickstart脚本根据资源分配文件自动化部署Hadoop集群的方

在 基于kickstart & pxe的centos无人值守安装 一文中,介绍了一种高度自动化的redhat linux安装方式。由于kickstart支持脚本,利用kickstart技术也可以实现hadoop集群的自动化部署。本文试构建一种利用kickstart脚本根据资源分配文件自动化部署hadoop集群的方案。

Kickstart配置文件结构

Kickstart文件由三部分按规定顺序组成,每部分内部没有顺序要求。三部分按顺序分别为:[1]

  • 命令部分,这里应该包括必需的选项.
  • %packages部分,这部分选择需要安装的软件包.
  • %pre和%post部分,这两个部分可以按任何顺序排列而且不是必需的.

Ret Hat系列的Linux在安装过程中,Anaconda安装管理程序会创建一个简单的Kickstart文件,保存为/root/anaconda-ks.cfg。可以直接修改该文件来创建我们自己的Kickstart配置文件。下面是文本用到的基础Kickstart文件:

# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
url --url=http://192.168.60.144/pxe/
lang zh_CN.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
#password=root
rootpw  --iscrypted $6$.L9W0uhR$TxVuurKHI254jwC9i0I6q/TPzJc.2RQYLy/YP.v5xfgzsOsP1ylRR0uvkLNP/ibfPmNiWkFrqtDJ.wBOJ5unu1
firewall --disabled
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone --utc Asia/Shanghai
text
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
zerombr
#autostep --autoscreenshot
#ignoredisk --only-use=sda
clearpart --all --drives=sda
part / --bytes-per-inode=4096 --fstype="ext4" --size=4096
part /boot --bytes-per-inode=4096 --fstype="ext4" --size=100
part swap --bytes-per-inode=4096 --fstype="swap" --size=1024
part /home --bytes-per-inode=4096 --fstype="ext4" --grow --size=1
#repo --name="CentOS"  --baseurl=cdrom:sr0 --cost=100
%packages --nobase
@core
%end
halt

该文件并未包含%post脚本,将会在后文用脚本添加。

%pre是Kickstart预安装脚本,可以在ks.cfg文件被解析后马上加入要运行的命令.这个部分必须处于kickstart文件的最后(在命令部分之后)而且必须用%pre命令开头.可以在%pre部分访问网络;然而,此时命名服务还未被配置,所以只能使用IP地址。需要注意的是,预安装脚本不在改换了的根环境(chroot)中运行。

%pre部分常用选项
--interpreter /usr/bin/python,允许指定不同的脚本语言,如Python.把/usr/bin/python替换成想使用的脚本语言. [2]

%post部分是安装后脚本,这部分内容必须在kickstart的最后而且用%post命令开头.它被用于实现某些功能,如安装其他的软件和配置其他的命名服务器.
需要注意的是,如果用静态IP信息和命名服务器配置网络,可以在%post部分访问和解析IP地址.如果使用DHCP配置网络,当安装程序执行到%post部分时,/etc/resolv.conf文件还没有准备好.此时,可以访问网络,但是不能解析IP地址.因此,如果使用DHCP,必须在%post部分指定IP地址.另外,post-install 脚本是在 chroot 环境里运行的.因此,某些任务如从安装介质复制脚本或RPM将无法执行. [3]
%post部分常用选项:

--nochroot #允许指定想在chroot环境之外运行的命令. 下例把安装介质中的/etc/resolv.conf文件复制到刚安装的文件系统里.%post --nochroot cp /etc/resolv.conf /mnt/sysimage/etc/resolv.conf--interpreter /usr/bin/python #允许指定不同的脚本语言,如Python.把/usr/bin/python替换成想使用的脚本语言. --log=/tmp/post-install.log #指定post脚本执行日志的保存路径

本文利用post脚本实现Hadoop集群的安装与自动配置。

Hadoop集群资源分配文件结构

资源分配文件用于Hadoop集群的网络资源分配。post脚本根据本机MAC地址查找资源分配文件,获取本机的主机名、IP地址等信息,然后自动配置。其中MAC地址需要事先知道,服务器一般厂商会提供。虚拟机需要自己指定。这里注意,VMware中不要用自动生成MAC地址功能,生成的 00:50:56开头的一开机就会变成00:0C:29,所以需要手动指定以 00:0C:29开头的MAC地址。

一个示例资源分配文件

#主机名       MAC地址        IP地址         掩码         网关      运行进程           集群角色 标识
Master 00:0C:29:11:00:00 192.168.60.20 255.255.255.0 192.168.60.2 NameNode,JobTracker  master  HADOOP
Slave1 00:0C:29:00:00:01 192.168.60.31 255.255.255.0 192.168.60.2 DataNode,TaskTracker slave   HADOOP
Slave2 00:0C:29:00:00:02 192.168.60.32 255.255.255.0 192.168.60.2 DataNode,TaskTracker slave   HADOOP

自动化部署方案

首先需要搭建能够进行Hadoop集群安装配置的PXE Installer服务器。该服务器提供Hadoop所需软件包、资源配置文件及Hadoop安装脚本[4]。本次实验集群中的每台机器都被配置为rsync服务器,以便同步Master的公钥文件。

拓扑结构如图所示:

Kickstart部署Hadoop拓扑结构

Kickstart部署Hadoop拓扑结构

部署流程图

PXE自动部署Hadoop流程图

PXE自动部署Hadoop流程图

实施部署

为PXE服务器配置脚本添加选项

修改 PXE服务器配置脚本,添加参数选项,增加配置Hadoop自动部署的函数。

#检查参数
[ $# -eq 0 ] && { PrintHelp; exit 1; }
[ $1 != "-d" ] && [ $1 != "-h" ] || [ $1 = "--help" ] && { PrintHelp; exit 1;}
if [ $1 = "-h" ]; then
	[ $# -eq 1 ] && { echo -e "Please specify the resourcefile. examples can be found at conf/network.conf. \nExample: ./init_pxeserver.sh -h conf/network.conf"; exit 1;}
	[ ! -f $2 ] && { echo -e "resourcefile error! please check resourcefile path\n"; exit 1;}
fi

根据参数将PXE Installer配置成不同类型,-d 为default,即Centos自动安装服务器,-h为Hadoop自动部署服务器。他们的不同主要是ks文件的不同。选项为-h时配置适用于Hadoop自动部署的ks文件。

[ $1 = "-h" ] && HadoopKS 2>&1 | tee -a /tmp/init_pxeserver.log

自动配置Hadoop ks文件

向默认的ks文件添加部署Hadoop的post脚本。用 cat > ks.cfg

根据资源分配文件配置网络信息

首先获取本机的MAC地址,然后以MAC地址为索引找到本机的IP,掩码,网关,主机名等信息,然后自动配置。脚本还配置了集群机器的hosts文件,添加集群所有主机的A记录。

curl -o network.conf http://$IPADDR/$CONFDIR/network.conf &>/dev/null && echo -e "[SUCC]: resourcefile download ok! "
MAC=`ifconfig eth0 |grep HWaddr |awk '{print \$5}'`
IP=`grep "\$MAC" network.conf |grep HADOOP |awk '{print \$3}'`
HOST=`grep "\$MAC" network.conf |grep HADOOP |awk '{print \$1}'`
NETMASK=`grep "\$MAC" network.conf |grep HADOOP |awk '{print \$4}'`
GATEWAY=`grep "\$MAC" network.conf |grep HADOOP |awk '{print \$5}'`
#set static ip addr
IFCFG=/etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "s/BOOTPROTO.*/BOOTPROTO=static/g" \$IFCFG
echo "IPADDR=\$IP" >>\$IFCFG
echo "NETMASK=\$NETMASK" >>\$IFCFG
echo "GATEWAY=\$GATEWAY" >>\$IFCFG
# add hostname to /etc/hosts
cat network.conf |grep HADOOP |awk '{print \$3" "\$1}' >>/etc/hosts
# reset hostname
sed -i "s/HOSTNAME.*/HOSTNAME=\$HOST/g" /etc/sysconfig/network

?安装Hadoop

这里比较简单,直接从Installer下载软件包和安装脚本,运行安装脚本即可。

mkdir soft && cd soft
curl -o $HADOOPFILE http://$IPADDR/$SOFTDIR/$HADOOPFILE &>/dev/null && echo -e "[SUCC]: hadoop download ok! "
curl -o $JDKFILE http://$IPADDR/$SOFTDIR/$JDKFILE &>/dev/null && echo -e "[SUCC]: jdk download ok! "
cd ../
curl -o hadoop_centos.sh http://$IPADDR/$CONFDIR/hadoop_centos.sh &>/dev/null && echo -e "[SUCC]: hadoop_centos.sh download ok! "
bash hadoop_centos.sh &>/dev/null && echo -e "[SUCC]: run hadoop_centos.sh ok! "

?配置rsync服务

slave需要同步master的密钥,可以在master上配置允许匿名访问的rsync服务器[5],然后在slave上拉取master公钥。

curl -o xinetd-2.3.14-39.el6_4.x86_64.rpm http://$IPADDR/$SOFTDIR/package/xinetd-2.3.14-39.el6_4.x86_64.rpm &>/dev/null && echo -e "[SUCC]: xinetd down ok! "
curl -o rsync-3.0.6-9.el6_4.1.x86_64.rpm http://$IPADDR/$SOFTDIR/package/rsync-3.0.6-9.el6_4.1.x86_64.rpm &>/dev/null && echo -e "[SUCC]: rsync down ok! "
rpm -ivh xinetd-2.3.14-39.el6_4.x86_64.rpm &>/dev/null && echo -e "[SUCC]: xinetd install ok! "
rpm -ivh rsync-3.0.6-9.el6_4.1.x86_64.rpm &>/dev/null && echo -e "[SUCC]: rsync install ok! "
sed -i "s/disable.*/disable = no/g" /etc/xinetd.d/rsync
cat > /etc/rsyncd.conf <<key
max connections=40
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.pwd
[pubkey]
uid=nobody
gid=nobody
path=/tmp/
read only = no
list = no
ignore errors = no
hosts allow=$NETWORK/$NETMASK
key
cat > /etc/rsyncd.pwd <<pas
pas
/etc/init.d/xinetd restart

?同步master公钥

将master的公钥文件id_dsa.pub复制到rsync服务器目录,slave拉取即可。这里涉及到一个失败重传的过程,由于slave可能早于master的安装进程,当slave执行到拉取密钥的时候,master可能还没有准备好密钥。脚本设置slave如果拉取公钥失败,则等待5s后重试,共重试100次。因此请尽量保证master早于slave。另外,像集群添加新的slave时,请保持master为开机状态。

phpList
phpList

phpList提供开源电子邮件营销服务,包括分析、列表分割、内容个性化和退信处理。丰富的技术功能和安全稳定的代码基础是17年持续开发的结果。在95个国家使用,在20多种语言中可用,并用于去年发送了250亿封电子邮件活动。您可以使用自己的SMTP服务器部署它,或在http://phplist.com上获得免费的托管帐户。

下载
# slave pull d_dsa.pub from master
MASTER=`cat network.conf |grep master |awk '{print \$1}'`   # hostname of master
SLAVE=`cat network.conf |grep slave |awk '{print \$1}'`     # hostname of slave
if [ "\$HOST" = "\$MASTER" ]; then
	cp $HOMEDIR/.ssh/id_dsa.pub /tmp/id_dsa.pub
	cd /tmp
	chmod 777 id_dsa.pub
else
	i=0
	while [ \$i -lt 100 ]
	do
		#pull from master
		rsync Master::pubkey/id_dsa.pub . &>/dev/null && r=0 || r=1
		#check if rsync successfull and retry
		if [ \$r -eq 0 ]; then
			break;
		else
			sleep 5		#sleep 5 second then retry
			((i+=1))	#retry 100 times
			echo "retry  \$i ..."
		fi
	done
	cat $HOMEDIR/.ssh/authorized_keys | grep `cat id_dsa.pub`  &>/dev/null && r=0 || r=1
	[ \$r -eq 1 ] && cat id_dsa.pub >> $HOMEDIR/.ssh/authorized_keys
fi
# add id_dsa.pub of Controller
cat $HOMEDIR/.ssh/authorized_keys | grep "$KEY"  &>/dev/null && r=0 || r=1
[ \$r -eq 1 ] && echo "$KEY" >> $HOMEDIR/.ssh/authorized_keys

?Hadoop集群配置

涉及到core-site.xml,hdfs-site.xml,mapred-site.xml几个文件的配置,及masters,slaves的配置[6]。这里需要注意,像集群新加slave时,请直接在资源分配文件末尾添加。新加集群存在masters,slaves及hosts文件不同步的问题,可以考虑用cfengine或者puppet,待后续解决。

#配置集群
cd /etc/hadoop
#使用下面的core-site.xml
cat > core-site.xml <<core
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="http://www.annhe.net/configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
	<property>
		<name>fs.default.name</name>
		<value>hdfs://\$MASTER:9000</value>
	</property>
</configuration>
core
#使用下面的hdfs-site.xml
cat > hdfs-site.xml <<hdfs
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="http://www.annhe.net/configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
	<property>
		<name>dfs.replication</name>
		<value>2</value>
	</property>
</configuration>	
hdfs
#使用下面的mapred-site.xml
cat > mapred-site.xml <<mapred
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="http://www.annhe.net/configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
	<property>
		<name>mapred.job.tracker</name>
		<value>\$MASTER:9001</value>
	</property>
</configuration>
mapred
#添加master和slave主机名
cat > masters <<masters
\$MASTER
masters
cat > slaves << slaves
\$SLAVE
slaves

集群验证测试

第一次启动Hadoop时,需要格式化Hadoop的HDFS,执行:

[root@Master ~]# hadoop namenode -format
14/05/12 01:07:43 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = Master/192.168.60.20
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:27:42 PDT 2013
STARTUP_MSG:   java = 1.7.0_51
************************************************************/
Re-format filesystem in /tmp/hadoop-root/dfs/name ? (Y or N) y
Format aborted in /tmp/hadoop-root/dfs/name
14/05/12 01:07:59 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at Master/192.168.60.20
************************************************************/

然后启动Hadoop,执行

[root@Master ~]# start-all.sh
starting namenode, logging to /var/log/hadoop/root/hadoop-root-namenode-Master.out
Slave1: starting datanode, logging to /var/log/hadoop/root/hadoop-root-datanode-Slave1.out
Slave2: starting datanode, logging to /var/log/hadoop/root/hadoop-root-datanode-Slave2.out
Master: starting secondarynamenode, logging to /var/log/hadoop/root/hadoop-root-secondarynamenode-Master.out
starting jobtracker, logging to /var/log/hadoop/root/hadoop-root-jobtracker-Master.out
Slave1: starting tasktracker, logging to /var/log/hadoop/root/hadoop-root-tasktracker-Slave1.out
Slave2: starting tasktracker, logging to /var/log/hadoop/root/hadoop-root-tasktracker-Slave2.out

宿主机中,编辑hosts文件,加入Hadoop集群主机的IP记录:

#Hadoop
192.168.60.10  ctrl
192.168.60.20  master
192.168.60.31  slave1
192.168.60.32  slave2

然后用浏览器访问 http://master:50070和http://master:50030

Jobtracker

Jobtracker

NameNode

NameNode

测试mapreduce程序,本地创建几个文本文件,上传到HDFS上:

[root@Master ~]# mkdir hadoop
[root@Master ~]# cd hadoop/
[root@Master hadoop]# mkdir input
[root@Master hadoop]# echo "hello hadoop" >>input/hadoop.txt
[root@Master hadoop]# echo "hello world" >>input/hello.txt
[root@Master hadoop]# echo "hi my name is hadoop" >>input/hi.txt
[root@Master hadoop]# hadoop fs -mkdir input
[root@Master hadoop]# hadoop fs -put input/* input

用浏览器 查看HDFS上的文件

浏览HDFS文件

浏览HDFS文件

执行Wordcount

[root@Master hadoop]# hadoop jar /usr/share/hadoop/hadoop-examples-1.2.1.jar wordcount input/ output
14/05/12 01:30:00 INFO input.FileInputFormat: Total input paths to process : 3
14/05/12 01:30:00 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/05/12 01:30:00 WARN snappy.LoadSnappy: Snappy native library not loaded
14/05/12 01:30:01 INFO mapred.JobClient: Running job: job_201405120108_0002
14/05/12 01:30:02 INFO mapred.JobClient:  map 0% reduce 0%
14/05/12 01:30:20 INFO mapred.JobClient:  map 33% reduce 0%
14/05/12 01:30:28 INFO mapred.JobClient:  map 100% reduce 0%
14/05/12 01:30:35 INFO mapred.JobClient:  map 100% reduce 100%
14/05/12 01:30:37 INFO mapred.JobClient: Job complete: job_201405120108_0002
14/05/12 01:30:37 INFO mapred.JobClient: Counters: 29
14/05/12 01:30:37 INFO mapred.JobClient:   Job Counters
14/05/12 01:30:37 INFO mapred.JobClient:     Launched reduce tasks=1
14/05/12 01:30:37 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=49355
14/05/12 01:30:37 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
14/05/12 01:30:37 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
14/05/12 01:30:37 INFO mapred.JobClient:     Launched map tasks=3
14/05/12 01:30:37 INFO mapred.JobClient:     Data-local map tasks=3
14/05/12 01:30:37 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=14236
14/05/12 01:30:37 INFO mapred.JobClient:   File Output Format Counters
14/05/12 01:30:37 INFO mapred.JobClient:     Bytes Written=47
14/05/12 01:30:37 INFO mapred.JobClient:   FileSystemCounters
14/05/12 01:30:37 INFO mapred.JobClient:     FILE_BYTES_READ=106
14/05/12 01:30:37 INFO mapred.JobClient:     HDFS_BYTES_READ=371
14/05/12 01:30:37 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=218711
14/05/12 01:30:37 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=47
14/05/12 01:30:37 INFO mapred.JobClient:   File Input Format Counters
14/05/12 01:30:37 INFO mapred.JobClient:     Bytes Read=46
14/05/12 01:30:37 INFO mapred.JobClient:   Map-Reduce Framework
14/05/12 01:30:37 INFO mapred.JobClient:     Map output materialized bytes=118
14/05/12 01:30:37 INFO mapred.JobClient:     Map input records=3
14/05/12 01:30:37 INFO mapred.JobClient:     Reduce shuffle bytes=118
14/05/12 01:30:37 INFO mapred.JobClient:     Spilled Records=18
14/05/12 01:30:37 INFO mapred.JobClient:     Map output bytes=82
14/05/12 01:30:37 INFO mapred.JobClient:     Total committed heap usage (bytes)=617562112
14/05/12 01:30:37 INFO mapred.JobClient:     CPU time spent (ms)=6190
14/05/12 01:30:37 INFO mapred.JobClient:     Combine input records=9
14/05/12 01:30:37 INFO mapred.JobClient:     SPLIT_RAW_BYTES=325
14/05/12 01:30:37 INFO mapred.JobClient:     Reduce input records=9
14/05/12 01:30:37 INFO mapred.JobClient:     Reduce input groups=7
14/05/12 01:30:37 INFO mapred.JobClient:     Combine output records=9
14/05/12 01:30:37 INFO mapred.JobClient:     Physical memory (bytes) snapshot=553525248
14/05/12 01:30:37 INFO mapred.JobClient:     Reduce output records=7
14/05/12 01:30:37 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=2894249984
14/05/12 01:30:37 INFO mapred.JobClient:     Map output records=9

用浏览器查看

runningjobs

运行中的任务

completjobs

完成的任务

查看结果

[root@Master hadoop]# hadoop fs -cat output/*
hadoop  2
hello   2
hi      1
is      1
my      1
name    1
world   1
cat: File does not exist: /user/root/output/_logs

用浏览器查看结果

result

Wordcount执行结果

遇到的问题

?去除M-oM-;M-?

用notepad++,编码为 utf8无BOM即可

rsync 提示 no route to master

密钥总是拉取失败,rsync无法连接master。通过添加调试代码发现在post脚本中设置完网络信息之后需要重启网络。因为虽然hosts中存在集群中各主机的IP信息,但是没有重启网络之前各主机的IP仍然是从PXE服务器那里自动获取的。这里涉及到时序的问题,因为slave要访问master,master需要先配置完网络并重启网络后才能被slave访问到。所以slave需要等待master配置完成。脚本设置最多等待100x5s,即500s。

^[[36m[SUCC]: Stop iptables ^[[0m
^[[36m[SUCC]: Chkconfig iptables off ^[[0m
/tmp
^[[36m[SUCC]: resourcefile download ok! ^[[0m
^[[36m[SUCC]: hadoop download ok! ^[[0m
^[[36m[SUCC]: jdk download ok! ^[[0m
^[[36m[SUCC]: hadoop_centos.sh download ok! ^[[0m
^[[36m[SUCC]: xinetd down ok! ^[[0m
^[[36m[SUCC]: rsync down ok! ^[[0m
^[[36m[SUCC]: xinetd install ok! ^[[0m
^[[36m[SUCC]: rsync install ok! ^[[0m
Stopping xinetd: ^[[60G[^[[0;31mFAILED^[[0;39m]^M
Starting xinetd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M
rsync: failed to connect to Master: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124124) [receiver=3.0.6]

另外防火墙也可能导致rsync失败,可以在ks文件中直接关闭防火墙。[7]

firewall(可选)
                这个选项对应安装程序里的「防火墙配置」屏幕:
                firewall --enabled|--disabled [--trust=] <device> [--port=]
                --enabled或者--enable,拒绝不是答复输出请求如DNS答复或DHCP请求的进入连接.如果需要使用在这个机器上运行的服务,可以选择允许指定的服务穿过防火墙.
                --disabled或--disable,不要配置任何iptables规则.
                --trust=,在此列出设备,如eth0,这允许所有经由这个设备的数据包通过防火墙.如果需要列出多个设备,使用--trust eth0 --trust eth1.不要使用以逗号分隔的格式,如--trust eth0, eth1.
                <incoming>,使用以下服务中的一个或多个来替换,从而允许指定的服务穿过防火墙.
                        --ssh
                        --telnet
                        --smtp
                        --http
                        --ftp
                --port=,可以用端口:协议(port:protocal)格式指定允许通过防火墙的端口.
                        例如,如果想允许IMAP通过的防火墙,可以指定imap:tcp.还可以具体指定端口号码,要允许UDP分组在端口1234通过防火墙,输入1234:udp.要指定多个端口,用逗号将它们隔开.

?ssh登录时提示"是否要添加HostKey"

ssh登录某台机器的时候,如果这台机器从来没有使用ssh登录过(严格来说应该是~/.ssh/known_hosts文件中没有这台机器的HostKey),那么,ssh会产生一个提示,询问是否需要添加这台机器的HostKey,回答yes/no即可,虽然只要不删除~/.ssh/known_hosts文件中该机器的HostKey,则这个提示将不会出现,但是如果我们需要书写一些自动化脚本的时候,这就会成为问题。
man了一下ssh_config,发现有解决的办法:创建文件~/.ssh/config,添加一行:
StrictHostKeyChecking no
即可。以后ssh将会自动添加HostKey到~/.ssh/known_hosts,不会再询问。默认该项配置是ask,所以会询问。如果配置成yes,则每次必须手动将hostkey添加到~/.ssh/known_hosts文件中,这是最严格的配置。[8]

参考资料

[1]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[2]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[3]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[4]. 知行近思. http://www.annhe.net/article-2672.html
[5]. CSDN博客. http://blog.csdn.net/zombee/article/details/6793672
[6]. 陆嘉桓. Hadoop实战 第二版
[7]. ChinaUnix博客. http://blog.chinaunix.net/uid-17240700-id-2813881.html
[8]. 163博客. http://blog.163.com/kartwall@126/blog/static/8942370200831485241268/

附录

完整代码

详见github:https://github.com/annProg/paper/blob/master/code/init_pxeserver.sh

扩展阅读

[1].?MORE-Kickstart-Tips-and-Tricks.?Tricks.
http://www.redhat.com/promo/summit/2010/presentations/summit/decoding-the-code/wed/cshabazi-530-more/MORE-Kickstart-Tips-and-Tricks.pdf


本文遵从CC版权协定,转载请以链接形式注明出处。
本文链接地址: http://www.annhe.net/article-2798.html

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

21

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

106

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

50

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

87

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

27

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

61

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

50

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 6.7万人学习

Rust 教程
Rust 教程

共28课时 | 6.6万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号