Linux系统网络配置与管理:从网络绑定到服务脚本
1. 网络绑定配置
1.1 网络绑定文档与选项
在网络绑定配置方面,互联网上有许多指南,而
http://www.kernel.org/doc/Documentation/networking/bonding.txt
以及
/usr/share/doc/kernel-doc-*/Documentation/networking/bonding.txt
中的内核文档提供了简洁且实用的信息。本配置中设置的选项包括
miimon=100
,它表示每 100 毫秒(即每秒 10 次)检查一次链路;
fail_over_mac=1
意味着每个网络适配器保留自己的 MAC 地址,并且在故障转移后更新远程 ARP 缓存。这些选项及更多内容在上述位置的
bonding.txt
文件中有详细记录。
1.2 检查绑定状态
在系统运行时,可以通过
cat /proc/net/bonding/bond0
命令检查绑定设备的状态,该命令会提供绑定设备及其底层从设备的详细状态信息。
1.3 潜在问题
自动化网络配置可能会导致机器无法通过网络访问,更糟糕的是使用了已被其他设备占用的 IP 地址。因此,在配置设备之前,需要进行一些基本检查。此外,网络设备命名并非总是可预测的,可以通过配置
udev
子系统来强制特定端口使用指定名称,如
eth0
或
eth1
。
1.4 脚本库功能
1.4.1
addroute
函数
该函数用于向设备添加静态网络路由。在 Red Hat 系统中,路由信息存储在
/etc/sysconfig/network-scripts
目录下的
route-NIC
文件中。为避免丢失现有路由,使用
>>
追加内容到文件,而不是使用
>
覆盖。
function addroute
{
# Add a route to a device
# $1 = network adapter (eg eth0, bond0)
# $2 = destination
# $3 = router
cd /etc/sysconfig/network-scripts
echo “Adding $2 via $3 on $1”
echo “$2 via $3” >> route-$1
}
1.4.2
makeslave
函数
此函数用于创建网络适配器的配置文件,使其成为虚拟绑定设备的从设备。它接受两个参数:要创建的网络适配器和它所属的绑定设备。为确保覆盖现有配置,使用
>
写入文件。
function makeslave
{
# $1 = network adapter
# $2 = bond
cat - > ifcfg-$1 <<EOF
DEVICE=$1
BOOTPROTO=none
ONBOOT=yes
MASTER=$2
SLAVE=yes
USERCTL=no
EOF
}
1.4.3
addbond
函数
该函数是脚本库的核心,用于配置具有浮动 IP 地址的虚拟绑定设备。它会根据当前情况选择最合适的网卡使用该 IP 地址,并在检测到故障时在适配器之间切换。
function addbond
{
# $1 = bond, $2=network adapter 1, $3 = network adapter 2
# $4 = IP address or name, $5 = netmask
BOND=$1
DEV1=$2
DEV2=$3
IP=`getent hosts $4 | awk ‘{ print $1 }’`
NAME=`getent hosts $4 | awk ‘{ print $1 }’`
NETMASK=$5
if [ -z “$NAME” ] || [ -z “$5” ]; then
echo “Usage: addbond bond dev1 dev2 ip netmask”
return 1
fi
/bin/ip a | grep “^ inet ${IP}/” > /dev/null
if [ “$?” -ne “0” ]; then
if ping -c1 -w1 $IP > /dev/null 2>&1
then
echo “Error: $NAME ($IP) is responding to ping. Not configuring $IP”
return
fi
fi
cd /etc/sysconfig/network-scripts
if [ -f ifcfg-$BOND ]; then
echo “Error: $BOND is already configured”
fi
[ -f ifcfg-$DEV1 ] && mv ifcfg-$DEV1 bak.ifcfg-$DEV1
[ -f ifcfg-$DEV2 ] && mv ifcfg-$DEV2 bak.ifcfg-$DEV2
if grep $BOND /etc/modprobe.conf > /dev/null
then
echo “Error: $BOND is already defined in /etc/modprobe.conf”
return
fi
echo “Creating bond device $BOND from $DEV1 and $DEV2”
echo “with the IP address ${IP}/${NETMASK}”
makeslave $DEV1 $BOND
makeslave $DEV2 $BOND
cat - > ifcfg-$BOND <<EOF
DEVICE=$BOND
BOOTPROTO=none
IPADDR=$IP
NETMASK=$NETMASK
ONBOOT=yes
EOF
cat - >> /etc/modprobe.conf << EOF
alias $BOND bonding
options $BOND mode=1 miimon=100 fail_over_mac=1
EOF
ifdown $DEV1
ifdown $DEV2
modprobe $BOND
ifup $BOND
}
1.5 配置示例
以下是
client-ks.cfg
文件中
%post
部分的示例配置,设置
bond0
使用
eth0
和
eth4
,
bond1
使用
eth1
和
eth5
:
%post
. /mnt/source/netlib
makebond bond0 eth0 eth4 192.168.1.53 255.255.255.0
addroute bond0 192.168.9.0 192.168.1.1
makebond bond1 eth1 eth4 192.168.2.53 255.255.255.0
1.6 总结
在安装过程中,虽然环境较为简单,但在安装后阶段可以进行大量定制。网络绑定在这个阶段进行配置非常有用,使用脚本库可以使 Kickstart 文件保持简洁,并且对脚本的修改只需应用到 Kickstart 服务器上的副本,而无需在大量客户端特定的 Kickstart 文件中进行修改。
2. 系统管理脚本
2.1 系统管理任务概述
系统管理包含四个常见任务的脚本示例,分别是用于系统启动时自动启动应用程序的 init 脚本、处理 GET 和 POST 请求的 CGI 脚本、使用配置文件提供默认值和记录用户选择的脚本,以及实现锁定机制以确保多个并发进程安全共享资源的脚本。
2.2 init 脚本
2.2.1 技术与概念
系统启动脚本通常被称为 init 脚本,由
init
守护进程从
/etc/init.d
目录启动。一些操作系统,如 Ubuntu 和 Solaris,开始采用更易于并行化的系统,分别使用
Upstart
和
SMF
替代传统的 init 脚本。而 BSD 和 Slackware 也有自己独特的 init 脚本变体。
Linux 标准库(LSB)要求 init 脚本实现
start
、
stop
、
restart
、
force-reload
和
status
等功能,还建议实现
try-restart
和
reload
功能。完整规范可参考
http://refspecs.freestandards.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html
。
2.2.2 启动过程
当使用
start
参数调用 init 脚本时,脚本会检查是否存在 PID 文件,如果存在则退出;否则,在后台启动应用程序,并将 PID 记录在
$PIDFILE
中。
2.2.3 关闭过程
当使用
stop
参数调用时,脚本会检查应用程序的状态,如果未运行则退出;如果运行,则从
$PIDFILE
中获取 PID 并终止进程,成功后删除 PID 文件。
2.2.4 状态检查
检查状态时,脚本首先检查
$PIDFILE
,然后使用
ps -o comm= -p $PID
命令获取进程名称,若与应用程序名称不一致则返回非零退出码,否则返回
ps
命令的退出码。
2.2.5 重启和强制重新加载
restart
功能通过先调用
stop
再调用
start
实现;
force-reload
目前与
restart
功能相同,可根据需要进行更具体的实现。
2.2.6 默认情况
如果传入的参数不符合上述情况,脚本会输出错误信息并以返回码 2 退出。
2.2.7 潜在问题
不同系统使用不同方式注册服务,LSB 定义了特殊格式的注释,可用于
chkconfig
注册服务。例如:
### BEGIN INIT INFO
# Provides: lsb-ourdb
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop OurDB
# Description: OurDB is a very fast and reliable database
# engine used for illustrating init scripts
### END INIT INFO
2.2.8 脚本结构
init 脚本通常以检查第一个参数的
case
语句为核心,根据参数执行相应操作。脚本开头的注释部分用于
chkconfig
工具识别服务信息,在不支持
chkconfig
的系统中,这些注释会被忽略。
2.2.9 服务依赖关系
Provides
字段定义了脚本提供的服务名称,
Required-Start
和
Required-Stop
字段用于确定脚本的执行顺序。例如,如果
/etc/init.d/udev
声明
Provides: udev
,而
/etc/init.d/network-manager
声明
Required-Start: $remote_fs dbus udev
,则
udev
脚本会在
network-manager
脚本之前执行。
2.2.10 系统设施
系统定义了七个设施,如下表所示:
| 名称 | 描述 |
| ---- | ---- |
|
$local_fs
| 所有本地文件系统已成功挂载 |
|
$network
| 网络子系统可用 |
|
$named
| IP/主机名查找(如 DNS)可用 |
|
$portmap
| RPC 服务可用 |
|
$remote_fs
| 远程(网络)文件系统可用 |
|
$syslog
| 系统日志记录器可用 |
|
$time
| 系统时钟被认为是准确的 |
2.2.11 示例脚本
#!/bin/bash
### BEGIN INIT INFO
# Provides: myapp
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop myapp
# Description: MyApplication is a great utility for
# doing things with systems.
### END INIT INFO
INSTDIR=/usr/local/bin
PIDFILE=/var/run/myapp.pid
APP=myapp
case $1 in
start)
if [ -f $PIDFILE ]; then
echo “Error: $PIDFILE already exists.”
通过以上网络绑定配置和系统管理脚本的介绍,我们可以更好地管理 Linux 系统的网络和服务,提高系统的可靠性和可用性。
2.2.12 脚本执行流程
下面通过 mermaid 格式的流程图来展示 init 脚本的执行流程:
graph TD;
A[脚本启动] --> B{参数类型};
B -- start --> C{PID 文件是否存在};
C -- 是 --> D[输出错误信息并退出];
C -- 否 --> E[后台启动应用程序];
E --> F[记录 PID 到 $PIDFILE];
B -- stop --> G{应用程序是否运行};
G -- 否 --> H[退出];
G -- 是 --> I[从 $PIDFILE 获取 PID];
I --> J[终止进程];
J -- 成功 --> K[删除 $PIDFILE];
B -- status --> L{检查 $PIDFILE};
L --> M[获取进程名称];
M -- 与 APP 不一致 --> N[返回非零退出码];
M -- 与 APP 一致 --> O[返回 ps 命令退出码];
B -- restart --> P[调用 stop];
P -- 成功 --> Q[调用 start];
B -- force - reload --> R[调用 restart];
B -- 其他 --> S[输出错误信息并以返回码 2 退出];
2.3 CGI 脚本
2.3.1 功能概述
提供两个相关的 CGI 脚本,分别处理 GET 和 POST 请求。这将展示如何处理从浏览器向服务器传递数据的两种方法,同时也会涉及处理用户提交数据的安全问题。
2.3.2 处理 GET 请求
GET 请求通常用于从服务器获取数据,数据会附加在 URL 后面。在 CGI 脚本中,需要解析 URL 中的参数。
2.3.3 处理 POST 请求
POST 请求用于向服务器提交数据,数据会包含在请求体中。脚本需要读取请求体并解析其中的参数。
2.3.4 安全考虑
处理用户提交的数据时,需要考虑安全问题,例如防止 SQL 注入、XSS 攻击等。可以对用户输入进行过滤和验证。
2.4 配置文件的使用
2.4.1 功能概述
配置文件可以用于提供默认值,向用户显示这些默认值,并记录用户之前选择的值。
2.4.2 操作步骤
-
定义配置文件格式
:可以使用简单的键值对格式,例如
key = value。 - 读取配置文件 :在脚本中读取配置文件,解析其中的键值对。
- 显示默认值 :将配置文件中的默认值显示给用户。
- 记录用户选择 :当用户做出选择后,将选择的值更新到配置文件中。
2.5 锁定机制
2.5.1 功能概述
实现锁定机制可以确保多个并发进程能够安全地共享关键资源,避免相互干扰。
2.5.2 操作步骤
- 选择锁定方式 :可以使用文件锁、信号量等方式实现锁定。
- 加锁操作 :在访问关键资源之前,尝试获取锁。如果锁已被其他进程持有,则等待。
- 访问资源 :获取锁后,访问关键资源。
- 解锁操作 :访问完成后,释放锁,允许其他进程访问。
3. 总结与建议
3.1 总结
本文介绍了 Linux 系统中网络绑定配置和系统管理脚本的相关知识。网络绑定配置可以提高网络的可靠性和可用性,通过脚本库可以方便地进行配置。系统管理脚本涵盖了 init 脚本、CGI 脚本、配置文件使用和锁定机制等方面,这些脚本可以帮助我们更好地管理系统服务和资源。
3.2 建议
- 在进行网络绑定配置时,要仔细检查 IP 地址的使用情况,避免冲突。
- 编写 init 脚本时,要遵循 LSB 标准,确保脚本的兼容性和可维护性。
- 处理用户提交的数据时,要充分考虑安全问题,对输入进行严格的过滤和验证。
- 在使用锁定机制时,要选择合适的锁定方式,并确保加锁和解锁操作的正确性。
通过以上介绍和建议,希望能够帮助大家更好地管理 Linux 系统的网络和服务,提高系统的稳定性和安全性。
超级会员免费看

被折叠的 条评论
为什么被折叠?



