Difference between revisions of "Network configuration (简体中文)"

From ArchWiki
Jump to: navigation, search
(update translation status)
m (如何诊断问题: Update command.)
Line 517: Line 517:
 
首先,我们要明白:这个问题很怪异。在某些案例中,你根本无法使用(HTTP, FTP, ...),而有时候,你可以连接某些主机(很少)。
 
首先,我们要明白:这个问题很怪异。在某些案例中,你根本无法使用(HTTP, FTP, ...),而有时候,你可以连接某些主机(很少)。
  
当你碰到这个问题时,{{ic|dmesg}}的输出正确,日志也没问题,{{ic|ifconfig}}报告状态正常— 实际上一切都正常。
+
当你碰到这个问题时,{{ic|dmesg}}的输出正确,日志也没问题,{{ic|ip a}}报告状态正常— 实际上一切都正常。
  
 
如果你无法浏览任何网站,不过你能ping通少部分主机,很可能你是遇到了这个问题。:ping使用ICMP协议所以不受TCP问题的影响。
 
如果你无法浏览任何网站,不过你能ping通少部分主机,很可能你是遇到了这个问题。:ping使用ICMP协议所以不受TCP问题的影响。

Revision as of 07:18, 8 March 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary end

翻译状态: 本文是英文页面 Network_Configuration翻译,最后翻译时间:2013-03-02,点击这里可以查看翻译后英文页面的改动。

Tango-preferences-desktop-locale.png本页面需要更新翻译,内容可能已经与英文脱节。要贡献翻译,请访问简体中文翻译组Tango-preferences-desktop-locale.png

附注: please use the first argument of the template to provide more detailed indications.

检查连接

大多数情况下,基本的安装过程已经创建了正确的网络配置。通过运行以下命令来检查:

$ ping -c 3 www.google.com
PING www.l.google.com (74.125.224.146) 56(84) bytes of data.
64 bytes from 74.125.224.146: icmp_req=1 ttl=50 time=437 ms
64 bytes from 74.125.224.146: icmp_req=2 ttl=50 time=385 ms
64 bytes from 74.125.224.146: icmp_req=3 ttl=50 time=298 ms

--- www.l.google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 298.107/373.642/437.202/57.415 ms
提示: 参数 -c 3 表示执行命令 ping 3次 。 参见 man ping

如果像上面这样成功运行,那么你只需要进行下面这些个人配置。

如果上面的命令说 unknown hosts,意思是你的机器无法进行域名解析。这可能和你的服务提供商或者你的路由器/网关有关。你可以尝试 ping 一个静态的 IP 地址来验证你的电脑是否能访问 Internet。

注意: 选项 -c 3 表示发送三次。参见 man ping 获得更多信息。
$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=53 time=52.9 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=53 time=72.5 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=53 time=70.6 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 52.975/65.375/72.543/8.803 ms
注意: 8.8.8.8 是一个容易记忆的静态地址。它是 Google 的主 DNS 服务器,因此它可以视为可信的,通常不会被过滤系统或代理屏蔽。

如果你能够 ping 通这个地址,你可以尝试把这个域名服务器添加到 /etc/resolv.conf 文件中。

设置计算机名

主机名 是一个网络中唯一标识一台机器的名称。要设置主机名:

# hostnamectl set-hostname myhostname
注意: 你不再需要编辑 /etc/hostssystemd 提供了主机名称的解析,它默认安装在所有系统上。

要临时设置主机名(直到下次重启为止),使用 inetutils 中的 hostname 命令:

# hostname myhostname

设备驱动程序

检测驱动状态

Udev 会探测网卡(NIC)并在启动时自动载入必要的模块。 检查 lspci -v 输出中 "Ethernet controller" (或者类似的)条目,它会告诉你哪个内核模块包含了网络设备的驱动程序。例如:

$ lspci -v
 02:00.0 Ethernet controller: Attansic Technology Corp. L1 Gigabit Ethernet Adapter (rev b0)
 	...
 	Kernel driver in use: atl1
 	Kernel modules: atl1

接下来, 用 dmesg | grep module_name 来检查是否已经加载了驱动。例如:

$ dmesg |grep atl1
   ...
   atl1 0000:02:00.0: eth0 link is up 100 Mbps full duplex

如果驱动加载成功,就跳过下一节,否则,你需要知道您特定型号的网络设备需要哪一个模块。

加载设备模块

用 Google 查找芯片组需要的模块/驱动。确定模块名之后,可以手动加载它

# modprobe 模块名

如果 udev 不能在启动时自动探测和加载合适的模块,你可以把它添加到 /etc/module-load.d 目录下的一个 *.conf 文件中,这样就不用每次启动都运行 modprobe 了。例如,如果 tg3 是需要的网络模块:

 # tee /etc/modules-load.d/tg3.conf <<< "tg3"

其他常见的有 Realtek 芯片组用的 8139too,或者 SiS 芯片组用的 sis900 模块。

网络接口

固定网络名

使用多个网卡的设备,需要先确定要使用的网络设备是主网卡(即eth0),还是第二个网卡(eth1)。大部分配置问题都是由于用户配置了 eth0的网络,但实际情况下却把以太网电缆连到了 eth1

Udev 负责给设备命名。由于使用了 udev 和 模块化的网卡驱动,默认情况下重启之后网络接口的编号不是固定的,这是因为驱动程序是并行载入的,也就是说,顺序是随机的。如果你不知道你的网卡会被称作是eth0还是eht1,配置网络连接会变得很困难。你可以使用ifrename来修复这个问题,参见 重命名网络接口。你也可以手工创建 udev 规则,依据接口的 MAC 地址分配接口名称,参见 Udev#Network device

注意: Systemd v197 引入了 Predictable Network Interface Names,自动给网络设备分配静态名称。网络接口现在是以前缀 en(以太网)、wl(WLAN)、或者 ww(WWAN)附上一个自动生成的标识符,产生了一个类似于 enp0s25 的条目。你可以通过添加一个链接来禁用这个行为:
# ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules
从以前版本的 systemd 升级的用户会有一份自动创建的空规则文件。

获取当前网络名

可以通过 sysfs 找到当前的 NIC 名称:

$ ls /sys/class/net
	
lo eth0 eth1 firewire0

启用和禁用网络接口

可以通过如下命令启用或禁用接口:

# ip link set eth0 up
# ip link set eth0 down

查看结果:

$ ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT qlen 1000
[...]

配置 IP 地址

有两种配置方式:通过 DHCP,或者不变的静态地址。

动态 IP 地址

手工运行 DHCP 客户端守护进程

请注意,运行的是 dhcpcd 而并非 dhcpd

# dhcpcd eth0
 dhcpcd: version 5.1.1 starting
 dhcpcd: eth0: broadcasting for a lease
 ...
 dhcpcd: eth0: leased 192.168.1.70 for 86400 seconds

现在,ip addr show dev eth0 将列出你的网络地址。

对一些人来说,dhcpcd 失败时,dhclient(位于软件包 dhclient 中)会有用。

启动时运行 DHCP

如果你只想在你的以太网连接上使用 DHCP,你可以使用 dhcpcd@.service (由软件包 dhcpcd 提供)。

要在 eth0 启用的 DHCP,只要调用:

# systemctl start dhcpcd@eth0

你能这样来使这个服务在启动时自动启用:

# systemctl enable dhcpcd@eth0

如果 dhcpd 服务在你的网卡模块之前启动(FS#30235),手动地把你的网卡添加到 /etc/modules-load.d/*.conf 中。例如,如果你的 Realtek 网卡需要载入 r8169,创建:

/etc/modules-load.d/realtek.conf
r8169
提示: 使用 lspci -k 来找出你的网卡需要什么模块。

如果你使用 DHCP 自动获取 IP 地址,但是想每次启动网络的时候让 DHCP 更改你的 DNS 服务器(域名服务器),在 dhcpcd.conf 的最后一部分中添加:

/etc/dhcpcd.conf
nohook resolv.conf

/etc/dhcpcd.conf 中使用 nooption 选项来阻止 dhcpcd 向 /etc/resolv.conf 添加域名服务器:

/etc/dhcpcd.conf
nooption domain_name_servers

然后把你自己的 DNS 服务器添加到 /etc/resolv.conf.

如果多个不同进程都会更改/etc/resolv.conf (例如,dhcpcd 和 VPN 客户端),请安装 openresolv 软件包,使用它不需要额外地配置dhcpcd

注意: dhcpcd 也能获取静态地址,只需要将 /etc/conf.d/dhcpcd 文件修改为(其中 x.x.x.x 为需要的 IP 地址):
DHCPCD_ARGS="-q -s x.x.x.x"

静态 IP 地址

使用静态 IP 地址有多种原因,例如通过不变的IP地址获得一定程度的可预测性,或者你没有可用的 DHCP 服务器。

注意: 在不使用路由器的情况下和一台安装 Windows 的电脑分享你的网络连接,请确保两台电脑都使用静态 IP ,否则你的局域网将会有问题。

需要确定:

如果你想配置一个内部网络,可以将你的 IP 设置成 192.168.*.* ,子网掩码设置成 255.255.255.0 ,广播地址设置成 192.168.*.255 。网关通常是 192.168.*.1 或者 192.168.*.254。

手动指定

你可以在终端中指定一个静态 IP:

# ip addr add <IP 地址>/<子网掩码> dev <interface>

例如:

# ip addr add 192.168.1.2/24 dev eth0
注意: 子网掩码使用 CIDR 表示法

更多选项参见:man ip

如此添加你的网关(用你的网关 IP 替换):

# ip route add default via <默认网关的 IP 地址>

例如:

# ip route add default via 192.168.1.1

如要你看到 "No such process" 的错误,这意味着你必须以root权限运行ip link set dev eth0 up

启动时使用 systemd 手动连接

这一节详述如何使用 systemd 手动连接网络。

注意: 我们在这些示例中使用 net0 作为接口名称,你必须用你正在配置的接口名称来替换所有出现的地方(包括 BindsToAfter 中出现的值)。
使用 dhcpcd

使用编辑器创建文件 /etc/systemd/system/network.service。这份示例中使用了 wpa_supplicant

/etc/systemd/system/network.service
[Unit]
Description=Wireless Static IP Connectivity
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-net0.device
After=sys-subsystem-net-devices-net0.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip link set dev net0 up
ExecStart=/usr/sbin/wpa_supplicant -B -i net0 -c /etc/wpa_supplicant.conf # Remove this for wired connections
ExecStart=/sbin/dhcpcd net0
	
ExecStop=/sbin/dhcpcd -k net0
ExecStop=/sbin/ip addr flush dev net0
ExecStop=/sbin/ip link set dev net0 down

[Install]
WantedBy=multi-user.target
/nowiki>}}

 # systemctl enable network.service

要进行测试,重启或者停用所有其它网络的守护进程,并以 root 权限执行:

 # systemctl start network.service

===== 使用静态 IP 地址 =====

用编辑器创建文件 {{ic|/etc/systemd/system/network.service}}。这份示例中使用一个静态 IP 地址和 [[wpa_supplicant]]。

{{hc|/etc/systemd/system/network.service|<nowiki>
[Unit]
Description=Network Connectivity
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-net0.device
After=sys-subsystem-net-devices-net0.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip link set dev net0 up
ExecStart=/usr/sbin/wpa_supplicant -B -i net0 -c /etc/wpa_supplicant.conf # Remove this for wired connections
ExecStart=/sbin/ip addr add 192.168.0.10/24 dev net0
ExecStart=/sbin/ip route add default via 192.168.0.1

ExecStop=/sbin/ip addr flush dev net0
ExecStop=/sbin/ip link set dev net0 down

[Install]
WantedBy=multi-user.target

不要忘记启用它!

# systemctl enable network

要进行测试,重启或保证所有其它网络的守护进程已经停止,并以 root 权限执行:

# systemctl start network

计算地址

可以用 ipcalc 软件包提供的 ipcalc 工具自动计算 IP 广播、子网掩码、主机范围等。例如通过火线连接视窗系统主机到 Arch。为了安全和网络组织,将它们分到独立的网络中,然后配置子网掩码和广播地址,网络中只有2台主机。要找出掩码和广播地址,我使用了 ipcalc,提供了它 arch firewire nic 的 IP 地址10.66.66.1,并告诉 ipcalc 要建立一个只有2台主机的网络。

$ ipcalc -nb 10.66.66.1 -s 1
Address:   10.66.66.1

Netmask:   255.255.255.252 = 30
Network:   10.66.66.0/30
HostMin:   10.66.66.1
HostMax:   10.66.66.2
Broadcast: 10.66.66.3
Hosts/Net: 2                     Class A, Private Internet

载入设置

想测试你的设置,可以重启计算机或者重新加载相关的 systemd 服务:

 # systemctl restart dhcpcd@eth0

试着按照这个顺序 ping 一些网络地址:你的网关, DNS 服务器(域名服务器), ISP 服务提供商,以及其他的网络地址。这样可以检查你的网络连接在哪里出了问题。如:

$ ping -c 3 www.google.com

更多设置

笔记本电脑使用 Ifplugd

官方仓库 中的 ifplugd 是一个守护进程,当网络适配器插入的时候自动配置网络,当网络断开的时候自动取消配置(比如某些3G的usb网络适配器)。这对于笔记本电脑这样的使用移动式的网络适配器的情况很有用,因为他只会在网络实际接入的时候才会配置网络接口。另外一个可能会用得着它的情况是,你需要重启你的网络,可是你既不想重启电脑也不想在 shell 中配置。

在默认情况下,它会检查 eth0 设备。要更改这个设置(以及更改其他设置,比如等待时间),可以编辑 /etc/ifplugd/ifplugd.conf

启用 net-auto-wired.service 就会在开机时启动 ifplugd,否则,你可以使用 ifplugd@eth0.service

绑定和链路聚合

你需要官方仓库中的netcfg包,以及AUR中的netcfg-bondingAUR包。

编辑/创建下列文件:

/etc/network.d/bonded
CONNECTION="bonding"
 INTERFACE="bond0"
 SLAVES="eth0 eth1"
 IP="dhcp"
 DHCP_TIMEOUT=10
/etc/modules-load.d/bonding.conf
  bonding

设置 netcfg 使用 bond0 接口.

启动网络:

 $ systemctl enable netcfg@bonded
注意: 要改变绑定模式(默认值是轮循),例如,用于动态链路聚合:

创建 /etc/modprobe.d/bonding.conf

/etc/modprobe.d/bonding.conf
options bonding mode=4
options bonding miimon=100
更多关于不同绑定策略(以及其它驱动程序设置)的信息,参见 Linux Ethernet Bonding Driver HOWTO

为了启用新的绑定端口,需要载入bonding模块, 停止network并启动net-profiles服务:

# modprobe bonding
# systemctl stop network
# systemctl start net-profiles

查看状态和绑定模式:

$ cat /proc/net/bonding/bond0

Wired -> Wireless Failover

Using bonding to fallback to wireless when the wired ethernet goes down, this also detects the presence of either network connection and starts dhcpcd when either or both are connected.

You'll need netcfg, ifplugd, and wpa_supplicant from the official repositories.

First configure the bonding driver to use active-backup:

/etc/modprobe.d/bonding.conf
options bonding mode=active-backup
options bonding miimon=100
options bonding primary=eth0
options bonding max_bonds=0

The `max-bonds` line avoids getting the "Interface bond0 already exists" error.

Next, configure a netcfg profile to enslave the two hardware interfaces:

/etc/network.d/failover
CONNECTION="bond"
DESCRIPTION="A wired connection with failover to wireless"
INTERFACE="bond0"
SLAVE_INTERFACES=("eth0" "wlan0")
IP="no"
SKIPNOCARRIER="no"

Enable the profile on startup.

# systemctl enable netcfg@failover

Configure wpa_supplicant to associate with known networks. This can be done with a netcfg profile (remember to use IP="no"), a wpa_supplicant service running constantly, or on-demand with wpa_cli. Ways to do this are covered on the wpa_supplicant page.

Create an ifplugd action for automatic DHCP assignment on the bonded interface:

/etc/ifplugd/bond_dhcp.action
#!/bin/sh

case "$2" in
  up)
    systemctl start "dhcpcd@$1.service" && exit 0
    ;;
  down)
    systemctl stop "dhcpcd@$1.service" && exit 0
    ;;
  *)
    echo "Wrong arguments" > /dev/stderr
    ;;
esac
exit 1

and make it executable

# chmod +x /etc/ifplugd/bond_dhcp.action

Then create the systemd service which starts ifplugd for bond0:

/etc/systemd/system/net-auto-bonded@.service
[Unit]
Description=Provides automatic dhcp resolution for bonded failover connection
Requires=netcfg@failover.service
After=netcfg@failover.service

[Service]
ExecStart=/usr/bin/ifplugd -i %i -r /etc/ifplugd/bond_dhcp.action -fIns

[Install]
WantedBy=multi-user.target

Enable the net-auto-bonded service and reboot:

# systemctl enable net-auto-bonded@bond0.service
# reboot

If you have a wired and wireless connection to the same network, you can probably now disconnect and reconnect the wired connection without losing connectivity. In most cases, even streaming music won't skip!

IP 别名

IP 别名是指给同一个网络接口分配多个 IP 地址。这样一个网络节点可以有多个网络连接,每个实现不同的作用。

要使用 IP 别名,可以使用 netcfg ,修改 POST_UPPRE_DOWN命令手动创建额外的IP地址,详情参见 这里

示例

你需要使用官方仓库中的netcfg

准备配置文件

/etc/network.d/mynetwork
CONNECTION='ethernet'
DESCRIPTION='Five different addresses on the same NIC.'
INTERFACE='eth0'
IP='static'
ADDR='192.168.1.10'
GATEWAY='192.168.1.1'
DNS=('192.168.1.1')
DOMAIN=
POST_UP='x=0; for i in 11 12 13 14; do ip addr add 192.168.1.$i/24 brd 192.168.1.255 dev eth0 label eth0:$((x++)); done'
PRE_DOWN='for i in 11 12 13 14; do ip addr del 192.168.1.$i/24 dev eth0; done'

然后执行:

$ systemctl enable net-auto-wired.service

更改 MAC/硬件地址

参见 MAC Address Spoofing

疑难排解

更换了连接cable modem的计算机

许多家庭有线电视的运营商(例如加拿大最大的有线电视公司Videotron,还有中国大陆的有线电视宽带公司)都使用记录网卡MAC地址的方法将cable modem配置为只能一台计算机使用。一旦cable modem获得第一台连接它的PC的MAC地址,就不会响应任何其它MAC地址。这样如果你换了台PC(或者路由器),由于新PC(或者路由器)的MAC地址和旧的不同,就没法连接cable modem了。这时候必须复位cable modem以使它重新辨认新的PC。 你得关闭cable modem电源,然后重新打开。一旦cable modem重启并再次登录在线完毕(指示灯熄灭),重启新连接的PC以使它发起一个DHCP请求,或者手动发起DHCP请求。

如果这个方法不能奏效,你需要克隆原来机器上的MAC地址。参见 Change MAC/hardware address

TCP窗口扩缩(window scaling)问题

TCP包头有个窗口(window)值表明其它主机可以发送多少数据回来。这个值只有16个bit,也就是说窗口打消最多只有64Kb。TCP包会被缓存一段时间(得被记录),如果内存限制(过去经常是)的话,主机很容易会用完内存。

回到1992年,内存逐渐增加,RFC 1323被发布以改善情况:窗口扩缩(Window Scaling)。所有包里的窗口值,可以被初始连接时定义的一个缩放因子(Scale Factor)所改变。

8-bit的缩放因子使得窗口可以是初始64Kb的32倍。

但是Internet上有些有问题的路由器和防火墙会将缩放因子重写为0,这导致主机之间产生误解。

Linux内核2.6.17引入了新的计算方式生成更高的缩放因子,间接的使得这些有问题的路由器和防火墙引发的后果更明显。

这导致连接缓慢甚至中断。

如何诊断问题

首先,我们要明白:这个问题很怪异。在某些案例中,你根本无法使用(HTTP, FTP, ...),而有时候,你可以连接某些主机(很少)。

当你碰到这个问题时,dmesg的输出正确,日志也没问题,ip a报告状态正常— 实际上一切都正常。

如果你无法浏览任何网站,不过你能ping通少部分主机,很可能你是遇到了这个问题。:ping使用ICMP协议所以不受TCP问题的影响。

你可以尝试使用WireShark。你也许会看到UDP和ICMP通讯成功,但是TCP通讯不成功(仅对外国主机)。

如何修复(糟糕的方法)

用比较糟糕的方法修复的话,你可以修改缩放因子计算所基于的tcp_rmem值。虽然它对大部分主机有效,但并不担保一定都有效,特别是某些很远的主机。

# echo "4096 87380 174760" > /proc/sys/net/ipv4/tcp_rmem

如何修复(好点的方法)

只需要禁止窗口缩放。虽然窗口缩放是个不错的TCP特性,但它也可能令人不安,特别是当你没法修改除了问题的路由器的时候。有几种方法可以禁止窗口缩放,而看来最可靠的(适用于大部分内核)将下面一行加入到你的{ic|/etc/sysctl.conf}}中 (见 sysctl

net.ipv4.tcp_window_scaling = 0

如何修复(最佳的方法)

这个问题是由有毛病的路由器/防火墙引致的,所以最好换了它。有些用户报告说那些有问题的路由是他们自己的DSL路由。

更多

本段内容是基于LWN文章TCP window scaling and broken routers和一个Kernel Trap 文章:Window Scaling on the Internet

在LKML上也有几篇相关的帖子。

Realtek 没有连接/网络唤醒问题

使用基于Realtek 8168 8169 8101 8111芯片网卡(独立网卡和板载)的用户也许会发现这个问题,启动时网卡不可用,网卡上的连接指示灯不亮。这通常会发生在安装了Windows的双启动系统上。在windows下使用realtek官方驱动(2007年5月后的版本)会引致这个问题。新驱动通过在Windows关机时禁止网卡来关闭网络唤醒功能,直到下一次Windows启动前网卡都会一直不可用。通过观察连接指示灯在Windows启动前一直熄灭,而Windows关机时也会熄灭,你可以发现这个问题。正常操作应该是只要系统一直开着,即使在POST加电过程中,连接指示灯也应该一直亮着的。这个问题也会影响其它没有安装新驱动的操作系统(例如Live CD等)。这里给出几种解决方案:

方法一 还原/变更Win驱动

你可以将你的Windows网卡驱动还原回Microsoft自带的驱动(如果有的话),或者安装2007年5月份以前的Realtek官方驱动(也许在网卡附带的CD上)。

方法二 启动Windows驱动里的网络唤醒功能

也许最好最快的修复方法就是改变Windows驱动里的这个设置。这个方法可以解决很多其它操作系统而不仅仅是Arch的麻烦。在Windows的设备管理器里,找到你的Realtek网卡,双击它。在“高级”标签页中,开启"wake-on-lan after shutdown"选项。

 例如在Windows XP里
 右键点击我的电脑-->管理-->设备管理器-->网络适配器-->双击 Realtek ... --> 高级标签页--> Wake-On-Lan After Shutdown --> 启用。
注意: 新的 Realtek Windows 驱动程序中(已测试了 2009/01/22 GIGABYTE 上的 Realtek 8111/8169 LAN Driver v5.708.1030.2008)可能与这里的选项稍微有点不同,像 Shutdown Wake-On-LAN --> Enable。似乎把它切换成 Disable 没有效果(你仍然可以在Windows关闭时看到连接指示灯熄灭)。一个比较不好的解决方法是引导 Windows,然后立即重启系统(执行非正常重启/关机),不给予 Windows 驱动程序关闭 LAN 的机会。连接指示灯将会保持亮着,网卡也会在 POST 之后保持可用 - 直到你再次进入 Windows 并正常关机。

方法三 更新Realtek Linux驱动

可以在realtek的官方网页上找到新的Linux驱动。(没有测试过,不过相信也能解决问题)。

方法四 在 BIOS/CMOS 中启用 LAN Boot ROM

尽管 Windows 驱动程序在系统关闭时禁用了它,但在 BIOS/CMOS 中设置 Integrated Peripherals --> Onboard LAN Boot ROM --> Enabled,系统启动时会重新激活 Realtek LAN 芯片。
这个方法多次在 GIGABYTE GA-G31M-ES2L 主板,2009/02/05 发布的 BIOS 版本 F8 上测试成功。YMMV。

DLink G604T/DLink G502T DNS 问题

使用 DLink G604T/DLink G502T 路由器和DHCP,并且固件是 v2.00+(通常是使用 AUS 固件)的用户可能会碰到的某些程序不同解析 DNS 的问题。不幸的是,pacman 就是这些程序其中之一。故障基本上是因为路由器在某些情况下不正确地发送 DNS 给 DHCP,导致程序尝试连接 IP 地址是 1.0.0.0 的服务器,然后因超时错误而失败。

如何诊断问题

最好的诊断问题方法是使用 Firefox/Konqueror/links/seamonkey,并启用 wget for pacman。如果问题发生在全新安装的 Arch Linux上,那么你可能要通过 live CD 来安装 links

首先,启用 wget for pacman(因为它给我们关于pacman下载软件包时的信息) 使用你喜欢的编辑器打开 /etc/pacman.conf 并取消下面这行的注释(如果前面有#的话,就移除它)

XferCommand=/usr/bin/wget --passive-ftp -c -O %o %u

当你编辑 /etc/pacman.conf 时,检查 pacman 用来下载软件包的默认镜像。

现在用网络浏览器打开默认镜像,检查镜像确实在工作。如果它很正常,那么运行 pacman -Syy (否则就选取另一个正常运行的镜像,并把它设置为 pacman 的默认镜像)。如果你看到类似于下面这样的信息(注意 1.0.0.0),

ftp://mirror.pacific.net.au/linux/archlinux/extra/os/i686/extra.db.tar.gz                                                            
            => '/var/lib/pacman/community.db.tar.gz.part'
Resolving mirror.pacific.net.au... 1.0.0.0

那么你很有可能有这个问题。 1.0.0.0 表示不能解析 DNS,因此我们必须把它添加到 /etc/resolv.conf中。

如何修复

基本上我们需要做的就是手动地在 /etc/resolv.conf 文件中添加 DNS 服务器。问题是 DHCP 会在启动时自动地删除和替换这个文件,所以我们需要编辑 /etc/conf.d/dhcpcd 并修改标志,阻止 DHCP 这么做。

当你打开 /etc/conf.d/dhcpcd,你应该看见类似下面的内容:

DHCPCD_ARGS="-t 30 -h $HOSTNAME"

在参数中添加 -R 参数,即,

DHCPCD_ARGS="-R -t 30 -h $HOSTNAME"
注意: 如果你使用的 dhcpcd >= 4.0.2,标志 -R 已被弃用。请参考 Dhcpcd 中关于怎样使用自定义的 /etc/resolv.conf 文件的信息。

保存并关闭文件;现在打开 /etc/resolv.conf。你应该看到一行 nameserver(最有可能是 10.1.1.1)。这是你的路由器的网关,我们需要连接它来获取你的 ISP 的 DNS 服务器。在你的浏览器地址栏中粘贴这个IP地址,并登录你的路由器。转到 DNS 部分,然后你将在 Primary DNS Server 一栏中看到一个 IP 地址;复制并粘贴它,作为一行 nameserver 放在现有网关那行的 上面

例如,/etc/resolv.conf 应该看上去是像这样的

nameserver 10.1.1.1

如果我的主 DNS 服务器是 211.29.132.12,那么修改 /etc/resolv.conf

nameserver 211.29.132.12
nameserver 10.1.1.1

现在执行systemctl restart dhcpcd@<interface>重启 network 守护进程并执行 pacman -Syy。如果它与服务器正常地同步了,那么问题就解决了。

更多

这是 whirlpool 论坛(Australian ISP community)中对这个问题的讨论并给出了相同的解决办法。

http://forums.whirlpool.net.au/forum-replies-archive.cfm/461625.html

检查 DHCP 问题先释放 IP 地址

当 DHCP 获得了错误的 IP 分配就可能产生这个问题。举例来说,当两个路由器通过VPN相连,通过VPN与我相连的路由器可能分配IP地址。要修复这个问题,在终端中以 root 权限释放 IP 地址:

# dhcpcd -k

然后请求一个新的地址:

# dhcpcd

可能你必须运行这两个命令好几次。

Atheros AR8161 没有 eth0

对于 Atheros AR8161 Gigabit Ethernet card,以太网连接不能立即使用(Jan 2013 的安装介质)。它需要加载模块 "alx",但其并不存在。

你需要安装 compat-wireless (Linux 3.7 中应该变成了 compat-drives)中的驱动。你需要文件名中有 pc 的固件版本中的以太网驱动程序。

 $ wget http://www.orbit-lab.org/kernel/compat-wireless-3-stable/v3.6/compat-wireless-3.6.8-1-snpc.tar.bz2
 $ tar xjf compat-wireless-3.6.8-1-snpc.tar.bz2
 $ cd compat-wireless-3.6.8-1-snpc
 $ ./scripts/driver-select alx
 $ make
 $ sudo make install
 $ sudo modprobe alx

现在这个软件包不能从源文件成功编译,需要修正一处。