导航:首页 > 源码编译 > networkmanager源码

networkmanager源码

发布时间:2024-09-17 23:47:41

❶ 如何编写 Systemd 服务文件

一种以 .service 结尾的单元(unit)配置文件,用于控制由 systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。
编写 Systemd service
基本结构
Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。
和 SysV init 脚本的差异
过去,*nix 服务(守护精灵)都是用 SysV 启动脚本启动的。SysV 启动脚本就是 Bash 脚本,通常在 /etc/init.d 目录下,可以被一些标准参数如 start,stop,restart 等调用。启动该脚本通常意味着启动一个后台守护精灵(daemon)。shell 脚本常见的缺点就是,慢、可读性不强、太详细又很傲娇。虽然它们很灵活(毕竟那就是代码呀),但是有些事只用脚本做还是显得太困难了,比如安排并列执行、正确监视进程,或者配置详细执行环境。
SysV 启动脚本还有一个硬伤就是,臃肿,重复代码太多。因为上述的“标准参数”必须要靠各个脚本来实现,而且各个脚本之间的实现都差不多(根本就是从一个 skeleton 骨架来的)。而 Systemd 则进行了统一实现,也就是说在 Systemd service 中完全就不需要、也看不到这部分内容。这使得 Systemd 服务非常简明易读,例如 NetworkManager 这一重量级程序的服务,算上注释一共才有 19 行。而它相应的 SysV 启动脚本头 100 行连标准参数都没实现完。
Systemd 兼容 Sysv 启动脚本,这也是为什么这么久我们仍然需要一个 systemd-sysvinit 软件包的原因。但是根据以上理由,最好针对所有您安装的守护精灵都使用原生 Systemd 服务来启动。另外,Systemd 服务可无缝用于所有使用 Systemd 的发行版,意思是 Arch 下编写的脚本拿过来依然能够使用。
通常来说,上游应该在发布源代码的同时发布 Systemd 服务,但如果没发布,你可以对照本教学来为它们写一个并贡献给它们。
Systemd 语法
Systemd 语法和 .desktop 文件的语法比较像,也比较类似 Windows 下的 .ini 文件,因此无论对于打包者还是最终用户都是非常容易上手的。
主要格式请见下面的小例子,这里需要说明三点:
Systemd 单元文件中的以 “#” 开头的行后面的内容会被认为是注释
Systemd 下的布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭。注:
仅限于 Systemd 文件,比如:
RemainOnExit=yes
并不适用于该文件中嵌入的 shell 语句,比如:
ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
这里的 yes 就不能替换。因为等号后面是一条嵌入的 shell 语句。
Systemd 下的时间单位默认是秒,所以要用毫秒(ms)分钟(m)等请显式说明。
一个小例子
NetworkManager 的 Systemd service:
[Unit]
Description=Network Manager
After=syslog.target
Wants=remote-fs.target network.target
[Service]
Type=dbus
BusName=org.freedesktop.NetworkManager
ExecStart=/usr/sbin/NetworkManager --no-daemon
EnvironmentFile=/etc/sysconfig/network/config
ExecStartPre=/usr/bin/test "x${NETWORKMANAGER}" = xyes
# Suppress stderr to eliminate plicated messages in syslog. NM calls openlog()
# with LOG_PERROR when run in foreground. But systemd redirects stderr to
# syslog by default, which results in logging each message twice.
StandardError=null
[Install]
WantedBy=multi-user.target
Also=NetworkManager-wait-online.service
以下我们以编写 He.net IPv6 单元文件为例。
定义控制单元 [Unit]
在 Systemd 中,所有引导过程中 Systemd 要控制的东西都是一个单元。Systemd 单元类型有:
系统服务
套接字(socket)
设备
挂载点
自动挂载点
SWAP 文件
分区
启动对象(startup target)
文件系统路径
定时器
简单说,Systemd 把 *nix 里那些分散开发因此宏观看变成一团杂碎的东西重新统一命名了。单元名就是你写的这个 .service 文件的名称。但不只有 .service 后缀的文件才可以是一个单元,单元还可以有 .target, .path 等后缀,具体可以去 /usr/lib/systemd/system 下了解。但那种后缀要么由 Systemd 上游开发者写好随 systemd 软件包分发,要么由我们的 Base:system 团队添加,一般用户是不太需要写其它后缀的控制单元的。
我们先要声明我们在定义控制单元:
[Unit]
单元名称就不用写了,我们要写一条单元描述:
[Unit]
Description=Daemon to start He.net IPv6
下面我们要讲解一下 Systemd 是如何控制各个单元之间的关系的。它和 RPM 的 specfile 的依赖关系控制的语法非常相似(毕竟都是红帽一家的):
Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制某单元与它“需要”的单元的启动顺序(启动顺序是另外控制的),即 Systemd 不是先启动 Requires 再启动本单元,而是在本单元被激活时,并行启动两者。于是会产生争分夺秒的问题,如果 Requires 先启动成功,那么皆大欢喜; 如果 Requires 启动得慢,那本单元就会失败(Systemd 没有自动重试)。所以为了系统的健壮性,不建议使用这个标记,而建议使用 Wants 标记。可以使用多个 Requires。
RequiresOverridable:跟 Requires 很像。但是如果这条服务是由用户手动启动的,那么 RequiresOverridable 后面的服务即使启动不成功也不报错。跟 Requires 比增加了一定容错性,但是你要确定你的服务是有等待功能的。另外,如果不由用户手动启动而是随系统开机启动,那么依然会有 Requires 面临的问题。
Requisite:强势版本的 Requires。要是这里需要的服务启动不成功,那本单元文件不管能不能检测等不能等待都立刻就会失败。
Wants:推荐使用。本单元启动了,它“想要”的单元也会被启动。但是启动不成功,对本单元没有影响。
Conflicts:一个单元的启动会停止与它“冲突”的单元,反之亦然。注意这里和后面的启动顺序是“正交”的:
两个相互冲突的单元被同时启动,要么两个都启动不了(两者都是第三个单元的 Requires),要么启动一个(有一个是第三个单元的 Requires,另一个不是),不是 Requires 的那个会被停止。要是两者都不是任何一个单元的 Requires,那么 Conflicts 别的那个单元优先启动,被 Conflicts 的后启动,要是互相写了,那么两个都启动不了。
OnFailure:很明显,如果本单元失败了,那么启动什么单元作为折衷。
好了,现在我们来想象一下,我们的单元(Ipv6 隧道)应该想要什么呢?很显然是一个连通着的网络。有一个 Systemd 默认提供的对象叫做 network-online.target(默认的 target 列表可见 systemd.special,必看,因为你大多数时候 Wants 的都是一个固定的系统状态而不是其它 systemd 服务),正正好好能够提供我们需要的环境。于是:
[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target
下面我们需要定义一下服务启动顺序,不然连 / 目录所在的硬盘都没挂载就开始干活,上哪儿找程序去呀。Systemd 服务启动顺序主要使用以下两个标记定义的:
Before/After:要是一个服务 Before 另一个服务,那么在并行启动时(Systemd 总是用进程 0 并行启动所有东西,然后通过这两个标记来二次等待排序),那另一个服务这时就会等这个服务先启动并返回状态,注意是先启动而不是启动成功,因为失败也是一种状态,一定要成功才启动另一个服务是通过依赖关系定义的。反之 After 亦然。
下面说下“关机”(可以是挂起,这时候有些服务是依然在跑的,比如网络唤醒)时候的顺序:如果两个服务都是要关掉的,Before 是先关自己,After 是先关别人,这很好理解; 但如果一个服务是要关,而另一个是要开的,那么不管 Before/After 写了什么,总是优先关闭而不是开始。也就是比如服务 A Before 服务 B,但是服务 B 是在关,而服务 A 是在 restart,那么服务 B 的顺序在服务 A 的前面。
好啦,我们的单元应该在什么的前后启动呢?它不需要一定在什么服务前面跑起来,这不像 ifup 和 dhcp,网络起不来获取 ip 肯定没用。我们只需要有网就可以了。“有网”在 Systemd 中也是由一个默认 target:network.target 提供的,于是我们的控制单元就定义好了:
[Unit]
Description=Daemon to start He.net IPv6
Wants=network-online.target
After=network.target
定义服务本体 [service]
在定义完了 Systemd 用来识别服务的单元后,我们来定义服务本体,依然是声明:
[Service]
然后是声明服务类型:
[Service]
Type=
Systemd 支持的服务类型有以下几类:
simple 默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。这在图形界面里非常好理解,我打开 Amarok,退出它就没有了。但是命令行的大部分程序都不会那么设计,因为命令行的一个最基本原则就是一个好的程序不能独占命令行窗口。所以输入命令,回车,接着马上返回给你提示符,但程序已经执行了。所以只有少数程序比如 python xxx.py 还使用这种方式。在这种类型下面,如果你的主程序是要响应其它程序的,那么你的通信频道应该在启动本服务前就设好(套接字等),因此这种类型的服务,Systemd 运行它后会立刻就运行下面的服务(需要它的服务),这时没有套接字后面的服务会失败,写 After 也没用,因为 simple 类型不存在主进程退出的情况也就不存在有返回状态的情况,所以它一旦启动就认为是成功的,除非没起来。
forking 标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。你要是使用的这种方式,最好也指定下 PIDFILE=,不要让 Systemd 去猜,非要猜也可以,把 GuessMainPID 设为 yes。
判断是 forking 还是 simple 类型非常简单,命令行里运行下你的程序,持续占用命令行要按 Ctrl + C 才可以的,就不会是 forking 类型。
创建 PIDFILE 是你为它写服务的程序的任务而不是 Systemd 的功能,甚至也不是 Sysvinit 脚本的功能。参考 startproc创建pid file的问题了解进一步的知识。因此如果你的程序确实是 forking 类型,但就是没实现创建 PIDFILE 的功能,那么建议使用 ExecStartPost= 结合 shell 命令来手动抓取进程编号并写到 /var/run/xxx.pid。
oneshot 顾名思义,打一枪换一个地方。所以这种服务类型就是启动,完成,没进程了。常见比如你设置网络,ifup eth0 up,就是一次性的,不存在 ifup 的子进程(forking 那样),也不存在主进程(simple 那样),它运行完成后便了无痕迹。因为这类服务运行完就没进程了,我们经常会需要 RemainAfterExit=yes。后面配置的意思是说,即使没进程了,我们也要 Systemd 认为该服务是存在并成功了的。所以如果你有一个这样的服务,服务启动后,你再去 ifup eth0 up,这时你再看服务,依然显示是 running 的。因为只要在执行那条一次性命令的时候没出错,那么它就永远认为它是成功并一直存在的,直到你关闭服务。
dbus 这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
一般人也就能用到上面四个,还有两种少见的类型:
notify 这个程序在启动完成后会通过 sd_notify 发送一个通知消息。所以还需要配合 NotifyAccess 来让 Systemd 接收消息,后者有三个级别:none,所有消息都忽略掉; main,只接受我们程序的主进程发过去的消息; all,我们程序的所有进程发过去的消息都算。NotifyAccess 要是不写的话默认是 main。
idle 这个程序要等它里面调度的全部其它东西都跑完才会跑它自己。比如你 ExecStart 的是个 shell 脚本,里面可能跑了一些别的东西,如果不这样的话,那很可能别的东西的控制台输出里会多一个“启动成功”这样的 Systemd 消息。
由于 He.net 的 IPv6 是用 iproute2 的 ip 命令来弄的,所以是一个 oneshot 一次性服务。
[Service]
Type=oneshot
RemainAfterExit=yes
接下来要设置 ExecStart, ExecStop。如果程序支持的话,你还可以去设置 ExecReload,Restart 等。注意,这里设置的是它们 Reload/Restart 的方式,但并不代表没有它们 Systemd 就不能完成比如 systemctl restart xxx.service 这样的任务,程序有支持自然最好,程序不支持那就先 stop 再 start 咯。同样有特殊要求的时候你也可以去设置比如 ExecStartPre/ExecStartPost,RestartSec,TimeoutSec 等其它东西,参考链接里都有使用方法。
这里要特殊讲一下 ExecStart:
如果你服务的类型不是 oneshot,那么它只可以接受一个命令,参数不限,比如你先 ip tunnel create 再 ip tunnel0 up,那是两个 ip 命令,如果你不是 oneshot 类型这样是不行的。
如果有多条命令(oneshot 类型),命令之间以分号 ; 分隔,跨行可用反斜杠 \。
除非你的服务类型是 forking,否则你在这里输入的命令都会被认为是主进程,不管它是不是。
于是我们的 [Service] 就写好了:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/ip tunnel add he-ipv6 mode sit remote 66.220.18.42 local 108.170.7.158 ttl 255 ; \
/usr/sbin/ip link set he-ipv6 up ; \
/usr/sbin/ip addr add 2001:470:c:1184::2/64 dev he-ipv6 ; \
/usr/sbin/ip route add ::/0 dev he-ipv6 ; \
/usr/sbin/ip -6 addr
ExecStop=/usr/sbin/ip route delete ::/0 dev he-ipv6 ; \
/usr/sbin/ip -6 addr del 2001:470:c:1184::2/64 dev he-ipv6 ; \
/usr/sbin/ip link set he-ipv6 down ; \
/usr/sbin/ip tunnel del he-ipv6
安装服务 [install]
这可能有点绕,我服务文件都弄好了,放到 /etc/systemd/system(供系统管理员和用户使用),/usr/lib/systemd/system(供发行版打包者使用)了,不就是安装好了嘛。
这里说的是一种内部状态,默认你放对位置它显示的是 disabled,unloaded,所以我们要在 Systemd 内部对它进行一下 load,没人要的东西是不需要安装的(我们不收渣渣),所以我们要告诉 Systemd 它是有人要的,被谁要。一般都是被
[Install]
WantedBy=multi-user.target
要(multi-user.target 表示多用户系统好了,简单理解就是你可以登入了)。这样在 multi-user.target 启用时,我们的服务也就会被启用了。
[Install] 部分下除了 WantedBy 还有两种属性,分别是:
Alias= 给你自己的别名,这样 systemctl command xxx.service 的时候就可以不输入完整的单元名称。比如你给 NetworkManager 一个别名叫 Alias=nm,那你就可以 systemctl status nm.service 查看实际是 NetworkManager.service 的服务了。
Also= 安装本服务的时候还要安装别的什么服务。比如我们的 He.net 脚本按理应该需要一个 iproute2.service 作为 also,但是 iproute2 实际上不需要 systemd 控制,所以就没写。它和 [Unit] 定义里面的依赖关系相比,它管理的不是运行时依赖,而是安装时。安装好了之后启动谁先谁后,谁依赖谁,和 Also= 都没有关系。

❷ 如何解决源码包安装时的依赖性问题

不管是初步跨入linux殿堂的新手,还是具有多年经验的专家,在安装或编译软件包的过程中或多或少的都会遇到包的依赖问题,从而导致安装过程无法继续,比如管理员在安装LAMP时,包需要libgd.so文件,而这个文件属于GD软件包。但是在安装GD软件包时,可能这个软件包跟其他软件包又具有依赖关系,又需要安装其他软件包才行。这时有的管理员便失去耐心。在遇到这种Linux软件包依赖关系问题时,该如何解决呢?在谈这个具体的措施之前,先跟大家聊聊Linux系统里的软件依赖性问题。
一、什么是依赖性耐唤明
程序依赖于程序代码的共享库,以便它们可以发出系统调用将输出发送到设备或打开文件等(共享库存在于许多方面,而不只局限于系统调用)。没有共享库,每次程序员开发一个新的程序,每个程序员都需要从头开始重写这些基本的系统操作。当编译程序时,程序员将他的代码链接到这些库。如果链接是静态的,编译后的共享库对象代码就添加到程序执行文件中;如果是动态的,编译后的共享库对象代码只在运行时需要它时由程序员加载。动态可执行文件依赖于正确的共享库或共享对象来进行操作。rpm依赖性尝试在安装时强制实施动态可执行文件的共享对象需求,以便在以后当程序运行时不会有与动态链接过程有关的任何问题。
注意:还有一种类型的依赖性,它基于显式的条目,rpm通过程序员将该依赖性强加到rpm配置文件中,但目前我们不关心这种类型的依赖性,这种依赖性比较容易解决。这里将重点放在rpm强制实施的更加复杂的共享对象依赖性。
二、动态可执行文件和共享对象
动态可执行文件使用最初编译和链接程序时使用的库文件的共享对象名称来查找共享对象。它们在少数的几个标准位置查找,比如在/lib和/usr/lib目录及在LD_LIBRARY_PATH环境变量(主要用于指定查找共享库,比如我们在安装Oracle时指定路径,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目录中。顺便提一下,在这些库目录中找到的共享对象可能不是真正的文件;它们可能是指向位于其他位置的真实库文件的符号链接(但通常仍旧在标准库目录的一个目录中)。至少从系统管理员的观点是在用于创建共享库文件的共享库软件包的名称和共享库文件的名称之间通常没有什么关系。例如,GLIBC2.3软件包用于创建libc.so.6共享库文件。也从本示例中注意到,添加到共享库文件名结束的版本号(.6)跟用于创建它的版本号(2.3)没有关系。这是由共享库软件包开发人员有意完成的,以便GLIBC的新版本可以重用相同的共享库文件名libc.so.6。这允许您在系统上加载新版本的GLIBC,而不用中断动态链接到lib.so.6共享库文件的所有昌告程序,当然假定新版本的GLIBC向后与动态可执行文件最初所链接的老版本GLIBC兼容。因此,即使库文件或共享对象文件有与它们相关的版本号,这些版本号也不能帮助你确定他们来自哪个版本的共享软件包。
注意:当将whatprovides选项用于rpm查询命令时,可以获得有关使用rpm软件包加载到系统的现有共享对象的信息。这种混乱是由下面的事实造成的:单个共享库文件可能支持某个范围的共享库软件包版本。例如,要检查soname库文件/lib/libc.so.6支持的GLIBC共享库软件包,运行下面的链丛命令:
#objmp--all-headers/lib/libc.so.6|less
向下滚动此报告,直到到达Versiondefinitions:部分,以便查看libc.so.6共享库文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享库文件支持原先为GLIBC版本2.0到2.5而开发的所有动态执行文件。注意:也可以使用objmp命令来从共享库文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下来,将讨论rpm软件包是如何生成的,以便在新系统上安装rpm软件包时,这些共库依赖性是己知的。
三、Rpm软件包和共享库依赖性
当程序员生成rpm软件包时,ldd命令用于报告动态可执行文件软件包中所有动态可执行文件使用的所有共享库。另一个混乱是由下面的事实带来的:相同软件包中的不同动态可执行文件可能与相同的共享库软件包的不同版本进行链接。例如,Heartbeat软件包中的不同程序可能已经进行了开发,并动态链接到libc.so.6sonmae共享库文件的不同GLIBC版本。对rpm命令使用-q和--requires参数,可以看到rpm软件包需要的共享库的完整清单。例如,要看到Heartbeatrpm软件包所有的所需依赖性,请使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
这产生了下面的报告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此报告中,libc.so.6soname是所需要的,此共享库必须支持使用GLIBC共享软件包版本号2.0、2.1、2.1.3、2.2和2.3进行链接的动态可执行文件。这是由下面的事实决定的:Heartbeat软件包中的不同动态可执行文件是针对不同版本的libc.so.6库的每个版本进行链接的。在了解了动态可执行文件、共享对象、soname和共享库软件包彼此是如何相关的后,下面准备来看这样的一个例子:当尝试安装rpm软件包,并且它由于依赖性错误而失败时,会发生什么。yum能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。
四、手工解决依赖性问题
通常,当尝试安装发行版中没有包括的软件包(及不能由像up2date、apt-get或Yum一样的更新工具自动解决其依赖性的软件包)时,将碰到rpm依赖性错误。例如,如果尝试在老的Linux发行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那么在安装过程中就可能碰到下面的错误:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令没有干扰报告所需的每个GLIBC共享库软件包版本号——它只报告所需的最高编号的版本号(GLIBC_2.3)。(假定原来的软件包开发人员不会将相同软件包中的可执行文件链接到不兼容版本的共享库软件包)所有的这些故障都报告所需的共享库名称或soname(而不是文件名称,soname始终以“lib”开始)。但可以删除添加到rpm报告的soname结束的版本号,并快速检查以查看是否在系统中使用locate命令安装这些共享库(假设您的locate数据库是最新的,有关更多信息,请参阅locate或slocate的手册页)。例如,要查找libcrypto享库文件,要输入:
#locatelibcrypto
[root@localhost~]#locatelibcrypto
/lib/libcrypto.so.0.9.8b
/lib/libcrypto.so.6
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8
/root/.Trash/vmware-tools-distrib/lib/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/libcrypto.a
/usr/lib/libcrypto.so
/usr/lib/pkgconfig/libcrypto.pc
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
如果此命令没有在系统上找到一个libcrypto共享库文件,将需要转到Internet并找出哪个共享库软件包包含此共享库文件。完成此项工具的一个快速和简便方式是只要在http://rpmfind.net上将共享库的名称输入到搜索栏中。如果将文本libcrypto.so输入到此搜索贞中,将很快知道此共享库是由openssl软件包提供的。

如果老版本的共享库数据包已经安装在系统上,可以用如下的命令确认此软件包含您需要的共享库文件:
#rpm-q--providesopenssl
[root@localhost~]#rpm-q--providesopenssl
config(openssl)=0.9.8b-10.el5
lib4758cca.so
libaep.so
libatalla.so
libchil.so
libcrypto.so.6
libcswift.so
libgmp.so
libnuron.so
libssl.so.6
libsureware.so
libubsec.so
openssl=0.9.8b-10.el5
此命令报告此rpm软件包中提供的所有内容(这包括软件包提供的共享库文件的soname)。注意:如前面指出的,共享库软件包版本号没有并且应该没有与共享库文件(soname)版本号的任何对应关系。这里不进行这方面的讨论,因为soname符号链接可能指向不同版本的共享库文件,这也是在尽量避免在安装新版本的共享软件包时中断现有动态可执行文件的情况下完成的。
五、自动解决依赖性故障
当您使用rpm软件包来生成、升级或添加新的特性到系统时,依赖性故障可能很快变成一场恶梦。只要通过使用您的发行版供应商的升级服务或工具,就可以避免这场恶梦。例如,当选择要安装的rpm软件包时,RedHat工具up2date自动从RedHat下载并安装所有rpm依赖性。下面就点上列出了几个完成相同事情的支持社区的免费方法:http://www.rpm.org/。下面将只进一步看到这些自动更新工具中的一种:Yum。
1.使用Yum来安装rpm软件包
Yum(YellowdogUpdater,Modified)程序可从下面网址下载:http://yum.baseurl.org/download/3.4/yum-3.4.3.tar.gz
在下载了此软件包后,可以使用下面的命令像任何其他rpm软件包那样安装它:
#rpm-ivhyum*
您可能需要更新想用于下载您的rpm软件包的存储库。有关Fedora的可用Yum存储库的清单在http://www.fedoratracker.org要切换到不同的存储库,下载这些文件中的一个文件,并将该文件作为/etc/yum.conf文件安装。现在可以用下面的命令告诉Yum报告存储在Yum存储库中、可用于安装所有软件包:
#yumlist
[root@localhost~]#yumlist|more
.
RHNsupportwillbedisabled.
Loading"security"plugin
Loading"rhnplugin"plugin
InstalledPackages
Deployment_Guide-en-US.noarch5.2-9installed
Deployment_Guide-zh-CN.noarch5.2-9installed
Deployment_Guide-zh-TW.noarch5.2-9installed
GConf2.i3862.14.0-9.el5installed
GConf2-devel.i3862.14.0-9.el5installed
ImageMagick.i3866.2.8.0-4.el5_1.1installed
MAKEDEV.i3863.23-1.2installed
MySQL-python.i3861.2.1-1installed
NetworkManager.i3861:0.6.4-8.el5installed
NetworkManager-glib.i3861:0.6.4-8.el5installed
2.用Yum安装新的rpm软件包
在本示例中,将安装新的GLIBC软件包。用简单的命令安装最新的GLIBC及其所有依赖性:
#yumupdateglibc
如果一切正常,Yum程序将自动检测、下载并安装最新GLIBC软件包所需要的所有rpm软件包(这里的GLIBC软件包是为您的发行版而构建的,不一定是可用的最新版GLIBC软件包(使用发行版所批准的GLIBC共享库软件包版本号或冒险安装没有使用正常系统操作所需要的动态可执行文件的GLIBC软件包版本)。也可以将list参数用于Yum和grep命令来查找要安装的软件包。例如,要查找名称中有SNMP的软件包,请输入:
#yumlist|grepsnmp
此命令返回如下报告:
.
RHNsupportwillbedisabled.
net-snmp.i3861:5.3.1-24.el5installed
net-snmp-libs.i3861:5.3.1-24.el5installed
net-snmp-perl.i3861:5.3.1-24.el5installed
net-snmp-utils.i3861:5.3.1-24.el5installed
现在可以容易地使用YUM下载并安装所有这些rpm软件包。
六、关于升级Gilbc的建议
Glibc库是Linux底层的运行库,其性能对于整个系统的运行有重要的意义。Glibc库包含了大量函数,其中的函数可大致分成两类,一类是与操作系统核心沟通的系统调用接口,它们作为功能型函数被调用,提供对Linux操作系统调用的包装与预处理。另外一类为一般的函数对象,它们提供了经常使用的功能的实现,作为工具型函数使用。在实践中,有不少软件就是依赖与Glibc版本才能安装并运行,说白了对于Glibc版本要求是版本高了不行,低了还不成。这些编译环境中的应用程序也和其它程序一样必须有运行的环境,我常遇到管理员在生产中给服务器装了最新的Linux发行版,结果应用软件装不上去,原因是Glibc的版本不对,有的是写在原发行版glibc上升级有的是降级,结果倒是整个系统的崩溃,实践经验告诉我,你只有选择相应Linux发行版里对应的glibc,例如我们单位的一个应用软件时在rhel3.0下开发的,那么就得要对应的发行版,换了别的就难说了,任何自己升级或降级Glibc来适应应用软件的做法都是不可取的,问题最后的解决方法是找到了RHEL3装上就解决了。在表一中,我把几个linux发行版原配的Glibc版本列出,供大家参考。
点击图片查看大图

Glibc库与核心功能组件
上图一说明:
GCC依赖于glibc
binutils依赖于glibc(binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编)
make依赖于glibc
头文件是在编译时候gcc所需要的,但本身都是一些文本文件,因此没有需要的运行环境。
常用工具依赖于glibc和各种需要用到的动态库。
下表一列出了多个重要Linux发行版的Glibc的情况
Linux发行版Glibc版本
Redhat9glibc-2.3.2-5
Fedora1glibc-2.3.2
RedhatEnterpriseLinuxAs3glibc-2.3.2-95
RedhatEnterpriseLinuxAs4glibc-2.3.4
RedhatEnterpriselinux5glibc-2.5-24
RedhatEnterpriselinux6glibc-2.9
Centos5.xglibc-2.5
-2.3.2-92
-2.4.31.54
-2.9

点击图片查看大图

Linux发行版glibc(32)位
下面介绍几个查询glibc版本号的方法:
#ls–al/lib/libc*
或者是用下面的命令也可以实现
#rpm–qp|grepglibc
基于debian的系统通过dpkg–l|greplibc6也可以查到,总之一般都在/usr/share/doc目录下都能看到glibc的相关信息。
七、小结
大部分情况下,在遇到软件包依赖关系问题的时候,操作系统提供的文件名字与软件包名字都会有直接的联系。有可能文件的名字就是软件包的名字。但是有些时候文件的名字与软件包的名字会相差甚远。此时大部分系统管理员可能光凭文件名字无法找到对应的软件包。此时可以先在系统安装光盘里找,如果找到那时最佳选项,然后就需要借助笔者上面谈到的一些专业网站,去查询软件包的名字了。当系统管理员安装了某个软件之后,如果存在软件包之间的依赖关系,则最好能够拿本子或者通过其他手段记录下来。以便下次方便实用,注意工作中的积累,相信绝大部分的软件包依赖关系问题都会迎刃而解。

❸ linux婵娲荤绣鍗linux婵娲

linux绯荤粺镐庝箞绠楁縺娲伙纻

Linux镎崭綔绯荤粺姝e父瀹夎呬箣钖庡氨绠楁槸婵娲讳简銆侺inux镎崭綔绯荤粺鏄涓娆惧紑婧愬厤璐圭殑镎崭綔绯荤粺銆傛墍璋揿紑婧愬厤璐癸纴灏辨槸璇翠綘鍙浠ユ煡鐪嫔畠镄勬簮浠g爜锛屽苟涓斾綘銮峰缑杩欎釜镎崭綔绯荤粺涓嶉渶瑕佹敮浠树换浣曡垂鐢ㄣ

浣犺佸畨瑁匧inux镎崭綔绯荤粺锛屽彧闇瑕佹牴鎹浣犵殑纭浠舵儏鍐典互鍙娄綘镄勫枩濂芥潵阃夋嫨鐩稿簲镄勭増链杩涜屽畨瑁咃纴涓嶉渶瑕佷笓闂ㄦ縺娲荤殑銆

linux镐庝箞婵娲伙纴甯愬彿璁㈤槄杩欎釜闂棰樻庝箞瑙e喅锛

鍏蜂綋鏂规硶濡备笅锛

1銆侀栧厛鍒扮孩甯界殑瀹樼绣娉ㄥ唽鐢ㄦ埛銆

2銆佺橱褰旷孩甯藉畼缃戯纴鍦ㄨ㈤槄绠$悊椤圭洰涓嬶纴阃塖ubscriberInventor锛屾敞鍐岀郴缁燂纴杩欐椂浼氲佹眰杈揿叆闅忓寘瑁呴梼甯︾殑绾㈠附镄勫簭鍙凤纴鏄16浣嶅瓧姣嶅姞鏁板瓧镄勯偅涓銆

3銆佸湪链哄櫒涓婇夋嫨绯荤粺-绠$悊-绾㈠附璁㈤槄绠$悊锛屽嵆鍙灏呜㈤槄涓庢満鍣ㄩ摼鎺ヤ简銆

4銆佽繖镞跺氨涓嶈佸啀浣跨敤绯荤粺涓镄勨淩HN娉ㄥ唽钬濊繘琛屾敞鍐屼简銆

5銆侀吨鏂版敞鍐岀殑鏂规硶銆傚傛灉閲嶆柊瀹夎呬简绯荤粺锛屽氨闇瑕侀吨鏂伴摼鎺ヨ㈤槄锛屽彧闇鍦ㄧ孩甯藉畼缃戝垹闄ゅ凡娉ㄥ唽镄勭郴缁燂纴鍐嶉吨鏂版敞鍐岀郴缁熷嵆鍙銆

linux链嶅姟鍣ㄦ庝箞閲嶅惎姝ラわ纻

浣犳槸钖︽e湪浣跨敤锘轰簬Ubuntu镄勭郴缁燂纴铹跺悗鍙戠幇镞犳硶杩炴帴缃戠粶锛熶綘涓瀹氢细寰堟侪璁讹纴寰埚氱殑闂棰橀兘鍙浠ョ亩鍗曞湴阃氲繃閲嶅惎链嶅姟瑙e喅銆傚湪杩欑瘒鏂囩珷涓锛屾垜浼氢粙缁嶅湪Ubuntu鎴栬呭叾浠朙inux鍙戣岀増涓閲嶅惎缃戠粶镄勫嚑绉嶆柟娉曪纴浣犲彲浠ユ牴鎹镊韬闇瑕侀夋嫨瀵瑰簲镄勬柟娉曘傝繖浜涙柟娉曞熀链鍒嗕负涓ょ被锛氶氲繃锻戒护琛屾柟寮忛吨钖缃戠粶濡傛灉浣犱娇鐢ㄧ殑Ubuntu链嶅姟鍣ㄧ増锛岄偅涔堜綘宸茬粡鍦ㄤ娇鐢ㄥ懡浠よ岀粓绔浜嗐傚傛灉浣犱娇鐢ㄧ殑鏄妗岄溃鐗堬纴闾d箞浣犲彲浠ラ氲繃蹇鎹烽敭Ctrl+Alt+TUbuntu阌鐩桦揩鎹烽敭镓揿紑锻戒护琛岀粓绔銆傚湪Ubuntu涓锛屾湁澶氢釜锻戒护鍙浠ラ吨钖缃戠粶銆傝繖浜涘懡浠わ纴涓閮ㄥ垎鎴栬呰村ぇ閮ㄥ垎锛屼篃阃傜敤浜庡湪Debian鎴栬呭叾浠栫殑Linux鍙戣岀増涓閲嶅惎缃戠粶銆

1銆乶etworkmanager链嶅姟杩欐槸阃氲繃锻戒护琛屾柟寮忛吨钖缃戠粶链绠鍗旷殑鏂规硶銆傚畠鐩稿綋浜庢槸阃氲繃锲惧舰鍖栫晫闱㈤吨钖缃戠粶锛堥吨钖疦etwork-Manager链嶅姟锛夈俿udoservicenetwork-managerrestart姝ゆ椂锛岀绣缁滃浘镙囦细娑埚け涓浼氩効铹跺悗閲嶆柊鏄剧ず銆

2銆乻ystemdservice锻戒护浠呬粎鏄杩欎釜鏂瑰纺镄勪竴涓灏佽咃纸钖屾牱镄勪篃鏄痠nit.d绯诲垪鑴氭湰鍜孶pstart鐩稿叧锻戒护镄勫皝瑁咃级銆俿ystemctl锻戒护镄勫姛鑳借繙澶氢簬service锻戒护銆傞氩父鎴戞洿锽沧浣跨敤杩欎釜锻戒护銆俿.service杩欐椂锛岀绣缁滃浘镙囧张浼氭秷澶变竴浼氩効銆傚傛灉浣犳兂浜呜Вsystemctl镄勫叾浠栭夐”,鍙浠ュ弬钥僲an甯锷╂枃妗c

3銆乶mcli杩欐槸Linux涓婂彲浠ョ$悊缃戠粶镄勫彟涓涓宸ュ叿銆傝繖鏄涓涓锷熻兘寮哄ぇ钥屼笖瀹炵敤镄勫伐鍏枫傚緢澶氱郴缁熺$悊锻橀兘锽沧浣跨敤璇ュ伐鍏凤纴锲犱负瀹冮潪甯稿规槗浣跨敤銆傝繖绉嶆柟娉曟湁涓や釜镎崭綔姝ラわ细鍏抽棴缃戠粶锛屽啀寮钖缃戠粶銆俿udonmclinetworkingoff杩欐牱灏变细鍏抽棴缃戠粶锛岀绣缁滃浘镙囦细娑埚け銆傛帴涓嬫潵锛屽啀寮钖缃戠粶锛歴udonmclinetworkingon浣犲彲浠ラ氲繃man甯锷╂枃妗d简瑙nmcli镄勬洿澶氱敤娉曘

4銆乮fupifdown杩欎袱涓锻戒护鐩存帴镎崭綔缃戝彛锛屽垏鎹㈢绣鍙f槸钖﹀彲浠ユ敹鍙戝寘镄勭姸镐併傝繖鏄疞inux涓链搴旇ヤ简瑙g殑缃戠粶锻戒护涔嬩竴銆备娇鐢╥fdown鍏抽棴镓链夌绣鍙o纴鍐崭娇鐢╥fup閲嶆柊钖鐢ㄧ绣鍙c傞氩父鎺ㄨ崘镄勫仛娉曟槸灏呜繖涓や釜锻戒护涓璧蜂娇鐢ㄣ俿udoifdown-asudoifup-a娉ㄦ剰锛氲繖绉嶆柟娉曚笉浼氲╃绣缁滃浘镙囦粠绯荤粺镓樼洏涓娑埚け锛屽彟澶栵纴钖勭岖绣缁滆繛鎺ヤ篃浼氭柇銆傝ˉ鍏呭伐鍏凤细nmtui杩欐槸绯荤粺绠$悊锻树滑甯哥敤镄勫彟澶栦竴绉嶆柟娉曘傚畠鏄鍦ㄥ懡浠よ岀粓绔涓绠$悊缃戠粶镄勬枃链凿滃崟宸ュ叿銆俷mtui镓揿紑濡备笅凿滃崟锛歯mtuiMenu娉ㄦ剰锛氩湪nmtui涓锛屽彲浠ラ氲繃up鍜宒own鏂瑰悜阌阃夋嫨阃夐”銆傞夋嫨钬淎ctivateaconnection钬濓细鎸変笅锲炶溅阌锛屾墦寮钬渃onnections钬濊彍鍗曘俷mtuiConnectionsMenu鎺ヤ笅𨱒ワ纴阃夋嫨鍓嶉溃甯︽槦鍙凤纸*锛夌殑缃戠粶銆傚湪杩欎釜渚嫔瓙涓锛屽氨鏄疢GEO72銆係.鎸変笅锲炶溅阌銆傝繖灏卞皢钬滃仠鐢ㄢ濅綘镄勭绣缁滆繛鎺ャ俷阃夋嫨浣犺佽繛鎺ョ殑缃戠粶锛歋.鎸変笅锲炶溅阌銆傝繖镙峰氨閲嶆柊婵娲讳简镓阃夋嫨镄勭绣缁滆繛鎺ャ俷mtuiConnectionsMenu鎸変笅Tab阌涓ゆ★纴阃夋嫨钬淏ack钬濓细.鎸変笅锲炶溅阌锛屽洖鍒皀mtui镄勪富凿滃崟銆俷mtuiMainMenu阃夋嫨钬淨uit钬濓细nmtuiQuitMainMenu阃鍑鸿ョ晫闱锛岃繑锲炲埌锻戒护琛岀粓绔銆傚氨杩欐牱锛屼綘宸茬粡鎴愬姛閲嶅惎缃戠粶浜嗐傞氲繃锲惧舰鍖栫晫闱㈤吨钖缃戠粶鏄剧劧锛岃繖鏄疷buntu妗岄溃鐗堢敤鎴烽吨钖缃戠粶链绠鍗旷殑鏂规硶銆傚傛灉杩欎釜鏂规硶涓岖敓鏁堬纴浣犲彲浠ュ皾璇曚娇鐢ㄥ墠鏂囨彁鍒扮殑锻戒护琛屾柟寮忛吨钖缃戠粶銆侼M灏忕▼搴忔槸NetworkManager镄勭郴缁熸墭鐩樼▼搴忔爣蹇椼傛垜浠灏嗕娇鐢ㄥ畠𨱒ラ吨钖缃戠粶銆傞栧厛锛屾煡鐪嬮《閮ㄧ姸镐佹爮銆备綘浼氩湪绯荤粺镓樼洏镓惧埌涓涓缃戠粶锲炬爣锛埚洜涓烘垜浣跨敤Wi-Fi锛屾墍浠ヨ繖閲屾槸涓涓猈i-Fi锲炬爣锛夈傛帴涓嬫潵锛岀偣鍑昏ュ浘镙囷纸涔熷彲浠ョ偣鍑婚煶閲忓浘镙囨垨鐢垫睁锲炬爣锛夈傛墦寮凿滃崟銆傞夋嫨钬淭urnOff钬濆叧闂缃戠粶銆俣estartnetworkinUbuntu缃戠粶锲炬爣浼氩湪鐘舵佹爮涓娑埚け锛岃繖琛ㄧず浣犲凡缁忔垚锷熷叧闂缃戠粶浜嗐傚啀娆$偣鍑荤郴缁熸墭鐩橀吨鏂版墦寮凿滃崟锛岄夋嫨钬淭urnOn钬濓纴閲嶆柊寮钖缃戠粶銆俣estartingnetworkinUbuntu鎭锽滐紒浣犵幇鍦ㄥ凡缁忛吨钖浣犵殑缃戠粶浜嗐傚叾浠栨彁绀猴细鍒锋柊鍙鐢ㄧ绣缁滃垪琛ㄥ傛灉浣犲凡缁忚繛鎺ヤ笂涓涓缃戠粶锛屼絾鏄浣犳兂杩炴帴鍒板彟澶栦竴涓缃戠粶锛屼綘濡备綍鍒锋柊WiFi鍒楄〃锛屾煡镓惧叾浠栧彲鐢ㄧ殑缃戠粶锻锛熸垜𨱒ュ悜浣犲𪾢绀轰竴涓嬨俇buntu娌℃湁鍙浠ョ洿鎺モ滃埛鏂痒iFi缃戠粶钬濈殑阃夐”锛屽畠链夌偣闅愯斀銆备綘闇瑕佸啀娆℃墦寮閰岖疆凿滃崟锛岀劧钖庣偣鍑烩沦electNetwork钬濄俣efreshwifinetworklistinUbuntu阃夋嫨瀵瑰簲镄勭绣缁滀慨鏀逛綘镄刉iFi杩炴帴銆备綘镞犳硶椹涓婄湅鍒板彲鐢ㄧ殑镞犵嚎缃戠粶鍒楄〃銆傛墦寮缃戠粶鍒楄〃涔嫔悗锛屽ぇ姒傞渶瑕5绉掓墠浼氭樉绀哄叾瀹冨彲鐢ㄧ殑镞犵嚎缃戠粶銆係绛夊緟澶ф5绉挜挓锛岀湅鍒板叾浠栧彲鐢ㄧ殑缃戠粶銆傜幇鍦锛屼綘灏卞彲浠ラ夋嫨浣犳兂瑕佽繛鎺ョ殑缃戠粶锛岀偣鍑昏繛鎺ャ傝繖镙峰氨瀹屾垚浜嗐傛荤粨閲嶅惎缃戠粶杩炴帴鏄姣忎釜Linux鐢ㄦ埛鍦ㄤ娇鐢ㄨ繃绋嬩腑蹇呴’缁忓巻镄勪簨𨱍呫傛垜浠甯屾湜杩欎簺鏂规硶鍙浠ュ府锷╀綘澶勭悊杩欐牱镄勯梾棰桡紒浣犳槸濡备綍閲嶅惎鎴栫$悊浣犵殑缃戠粶镄勶纻鎴戜滑鏄钖﹁缮链夐仐婕忕殑锛熻峰湪涓嬫柟鐣栾█銆倂ia:https://itsfoss.com/restart-network-ubuntu浣滆咃细Sergiu阃夐桡细lujun9972璇戣咃细bodhix镙″癸细wxy链鏂囩敱LCTT铡熷垱缂栬疟锛孡inux涓锲借崳瑾夋帹鍑

铏氭嫙链篖inux鐜澧冧笅锛岀绣鍗℃縺娲诲け璐ワ纴镞犳硶镊锷ㄥ垎閰岻P姹傛湁缁忛獙镄勶纻

铏氭嫙链虹幆澧冧笅銮峰彇DHCP鍒嗛厤镄処P锛岄渶瑕佸仠鐢ㄧ湡链猴纸瀹夸富链猴级镄勨淰MwareDHCPService钬濇湇锷★纴linux瀹㈡埛链虹绣缁沧帴鍙e瑰簲閰岖疆鏂囦欢/etc/sysconfig/network-scripts/ifcfg-eth0涓閰岖疆椤规敼涓筑OOTPROTO=dhcp锛岀劧钖庨吨钖链嶅姟锛歴ervicenetworkrestart鍗冲彲锛岀‘淇滵HCP链嶅姟鍣ㄩ厤缃姝g‘銆

链夋病链夎蒋浠跺畨瑁呯郴缁燂纴杩桦彲浠ヤ笉鐢ㄦ縺娲荤殑鍟婏纻

宸茬粡婵娲荤殑Ghost灏卞彲浠ヤ笉鐢ㄦ縺娲汇佽繖涓鍜岀郴缁熺増链鏄娌℃湁鍏崇郴镄勚佸彧瑕佹槸姝g増镄勭郴缁熻偗瀹氲佹縺娲汇佸綋铹躲佹兂浜嗕竴涓嬫垜璇寸殑涔熶笉瀵广佸紑婧愮殑绯荤粺涓嶉渶瑕佹縺娲汇佹瘆濡侺inux銆佸皬绾㈠附涔嬬被镄勭郴缁熶笉闇瑕佹縺娲汇佸洜涓轰粬浠鏄寮婧愮殑銆佷笉鐭ラ亾浣犳槸澶х炶缮鏄灏忕槠銆佽佹槸澶х炵殑璇濊繖浜涘簲璇ラ兘鐭ラ亾銆佸皬锏界殑璇濊磋繖浜涗綘涔熶笉澶镍伞佸綋灏忕槠澶勭悊钖с乄indows镄勬g増绯荤粺閮介渶瑕佹縺娲汇佺洍鐗埚彲浠ヤ笉闇瑕佹縺娲伙紒

❹ linux系统下安装usb网卡驱动图文

  1. 确认usb-wifi设备型号 , 根据确认结果选择驱动信息。

  2. 安装驱动 mt7601u , 如果已经自带跳过此步骤

  3. 配置驱动启动后自动加载。

  4. 重启验证是否成功的自动加载驱动模块。

  5. 确认usb-wifi设备型号 , 根据确认结果选择驱动信息。


## 初始USB接入时加载显示

lsusb| grep Ralink

Bus 001 Device 003: ID 148f:2878 Ralink Technology, Corp.

## lsusb执行后显示信息中有 usb-wifi设备时继续执行如下命令,进行模式切换(对于存在多模式设备可以正确显示出wifi设备的真实型号)

usb_modeswitch -KW -v 148f -p 2878

## 模式切换后加载显示

lsusb| grep Ralink

Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp.


可以看到型号为 7601 ,据此我们选择 mt7601u 驱动进行‘安装。


安装驱动 mt7601u , 如果已经自带跳过此步骤

方法1:有可能系统内核已经集成好了你需要的驱动模块,只需要手工加载以下验证是否有效,如果无效再选择方法2.

方法2:github 搜索型号的驱动源码,手动编译安装 。


安装完毕后,需要配置下 wlan0 的配置信息, 创建一个ifcfg-wlan0文件(如果使用的是 NetworkManager 服务可能不需要配置就可以使用了)


$ cat /etc/sysconfig/network/ifcfg-wlan0

BOOTPROTO='dhcp'

BROADCAST=''

DHCLIENT_SET_DEFAULT_ROUTE='yes'

ETHTOOL_OPTIONS=''

IPADDR=''

MTU=''

NAME=''

NETMASK=''

NETWORK=''

REMOTE_IPADDR=''

STARTMODE='auto'

WIRELESS_AP=''

WIRELESS_AP_SCANMODE='1'

WIRELESS_AUTH_MODE='psk'

WIRELESS_BITRATE='auto'

WIRELESS_CA_CERT=''

WIRELESS_CHANNEL=''

WIRELESS_CLIENT_CERT=''

WIRELESS_CLIENT_KEY=''

WIRELESS_CLIENT_KEY_PASSWORD=''

WIRELESS_DEFAULT_KEY='0'

WIRELESS_EAP_AUTH=''

WIRELESS_EAP_MODE=''

WIRELESS_ESSID='CPE_05010'

WIRELESS_FREQUENCY=''

WIRELESS_KEY=''

WIRELESS_KEY_0=''

WIRELESS_KEY_1=''

WIRELESS_KEY_2=''

WIRELESS_KEY_3=''

WIRELESS_KEY_LENGTH='128'

WIRELESS_MODE='Managed'

WIRELESS_NICK=''

WIRELESS_NWID=''

WIRELESS_PEAP_VERSION=''

WIRELESS_POWER='no'

WIRELESS_WPA_ANONID=''

WIRELESS_WPA_IDENTITY=''

WIRELESS_WPA_PASSWORD=''

WIRELESS_WPA_PSK='Abcd1234'

配置驱动启动后自动加载。

具体配置方法可以参考 man moles-load.d 信息可以详细理解。


创建一个 mt7601u.conf 文件, 内容如下


# echo "mt7601u" > /etc/moles-load.d/mt7601u.conf

# cat /etc/moles-load.d/mt7601u.conf

mt7601u

重启验证是否成功的自动加载驱动模块。

❺ Linux中Wi-Fi无线网络和AP无线热点的配置教程

0.Linux下的Wi-Fi配置

无线网络飞速发展的今天,许多设备都提供了连接无线网络的功能。

那么Linux下的wifi到底该怎么配置、连接呢??

开始配置之前,我们要说说iw家族。iw是linux下常用的wifi配置工具,网上有相应的库和源码。全名为wirelessTools。

配置wifi模块,并连接相应的无线网络过程:主要使用iwpriv命令

(1)扫描可用的无线网络:

代码如下:

iwlist wifi-name scanning  

其中wifi-name为无线网卡的名字,比如网卡eth0就是系统默认的网卡名字, wifi-name可以用ifconfig查看,一般为ra0。

(2)看扫描到的网络信息,按要连接的网络类型进行配置。以下为扫描到的网络:

代码如下:

iwlist ra0 scanning  

===rt_ioctl_giwscan. 11(11) BSS returned, data-length = 1427  

ra0       Scan completed :  

 Cell 01 - Address: C4:CA:D9:1D:9E:A0  

   Protocol:802.11b/g/n  

   ESSID:""  

   Mode:Managed  

   Frequency:2.412 GHz (Channel 1)  

   Quality=7/100  Signal level=-87 dBm  Noise level=-82 dBm  

   Encryption key:off  

   Bit Rates:54 Mb/s  

 Cell 02 - Address: FC:75:16:A1:A9:16  

   Protocol:802.11b/g/n  

   ESSID:"jxj_rd"  

   Mode:Managed  

   Frequency:2.452 GHz (Channel 9)  

   Quality=94/100  Signal level=-53 dBm  Noise level=-92 dBm  

   Encryption key:on  

   Bit Rates:54 Mb/s  

   IE: WPA Version 1  

Group Cipher : TKIP  

Pairwise Ciphers (2) : TKIP CCMP  

Authentication Suites (1) : PSK  

   IE: IEEE 802.11i/WPA2 Version 1  

Group Cipher : TKIP  

Pairwise Ciphers (2) : TKIP CCMP  

Authentication Suites (1) : PSK  

 Cell 03 - Address: C4:CA:D9:02:2A:70  

   Protocol:802.11b/g/n  

   ESSID:""  

   Mode:Managed  

   Frequency:2.462 GHz (Channel 11)  

   Quality=83/100  Signal level=-57 dBm  Noise level=-92 dBm  

   Encryption key:off  

   Bit Rates:54 Mb/s  

 Cell 04 - Address: 14:D6:4D:75:CA:9C  

   Protocol:802.11b/g/n  

   ESSID:"liangym"  

   Mode:Managed  

   Frequency:2.472 GHz (Channel 13)  

   Quality=100/100  Signal level=-27 dBm  Noise level=-92 dBm  

   Encryption key:on  

   Bit Rates:54 Mb/s  

   IE: WPA Version 1  

Group Cipher : CCMP  

Pairwise Ciphers (1) : CCMP  

Authentication Suites (1) : PSK  

   IE: IEEE 802.11i/WPA2 Version 1  

Group Cipher : CCMP  

Pairwise Ciphers (1) : CCMP  

Authentication Suites (1) : PSK  

如上:ESSID项的值即为无线网络的名字,如上的jxj_rd等。如果值为空,说明在无线路由勾选了隐藏ESSID的选项。

ESSID是很关键的,如果被隐藏了,也不是不能连接,而是需要破解,用到其他的工具,非常麻烦。至于如何破解,不是本文叙述的内容,有兴趣的朋友可以网上搜索。

得到了网络的信息,接下来就是配置连接选项了。以连接jxj_rd为例,我们看看具体的过程:

(1) 设置要连接的网络类型:

代码如下:

iwpriv ra0 set NetworkType=Infra  

(2) 设置要连接的无线网络的安全模式:

代码如下:

iwpriv ra0 set AuthMode=WPA2PSK  

(3) 设置网络加密方式:(CCMP即为AES)

代码如下:

iwpriv ra0 set EncrypType=TKIP  

(4) 设置连接时的密码: ********为加密网络的密码

代码如下:

iwpriv ra0 set WPAPSK=*******  

(5) 连接该网络:有两种方式:

A、用iwpriv命令

代码如下:

iwpriv ra0 set SSID=jxj_rd  

B、用iwconfig命令

代码如下:

iwconfig ra0 essid jxj_rd  

至此,如果密码正确,就可以连接上网络jxj_rd了。如果你不放心,可以用命令查看状态:

代码如下:

iwpriv ra0 connStatus

当然,你也可以用iwconfig命令查看状态,这里不再赘述。

执行 iwlist 如果 Supported interface modes 的下有 AP 的话表示该网卡支持AP模式,可以创建无线热点。

比如我的无线网卡是Qualcomm Atheros AR9485 Wireless Network Adapter,Linux内核自带了驱动ath9k,支持创建AP无线热点。

下面我们就着重来讲无线热点的创建步骤:

1. 安装hostapd和dhcpd


代码如下:

sudo apt-get install hostapd isc-dhcp-server

开机不需要启动这两个服务,建议把它们关掉:

代码如下:

sudo update-rc.d -f hostapd remove

注释掉下面两个文件start on那一行:

代码如下:

sudo nano /etc/init/isc-dhcp-server.conf

sudo nano /etc/init/isc-dhcp-server6.conf

2. 配置hostapd和dhcpd


代码如下:

sudo nano /etc/hostapd/hostapd.conf  

注意自己设置其中的无线热点名称ssid和认证密码wpa_passphrase.

代码如下:

interface=wlan0

driver=nl80211

ssid=YOUR_AP_NAME

hw_mode=g

channel=10

macaddr_acl=0

auth_algs=3

wpa=2

wpa_passphrase=YOUR_AP_PASSWORD

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP CCMP

rsn_pairwise=TKIP CCMP

sudo nano /etc/dhcp/dhcpd.conf

在末尾加入以下内容:

代码如下:

subnet 192.168.0.0 netmask 255.255.255.0

{

range 192.168.0.2 192.168.0.10;

option routers 192.168.0.1;

option domain-name-servers 192.168.0.1,180.76.76.76,8.8.8.8;

}

其中180.76.76.76是网络公共DNS服务器,8.8.8.8则是Google的DNS服务器.

在自己的家目录下创建一个hostapd目录,里面新建启动和关闭脚本,比如我这样写(注意把里面eechen换成你的用户名):

代码如下:

nano  /home/eechen/hostapd/ap-start.sh

代码如下:

#!/bin/bash

# 开启内核IP转发

bash -c "echo 1 /proc/sys/net/ipv4/ip_forward"

# 开启防火墙NAT转发(如果本机使用eth0上网,则把ppp0改为eth0)

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# 关闭NetworkManager对无线网卡的控制

nmcli nm wifi off

# 设置并启动无线网卡

ifconfig wlan0 192.168.0.1 netmask 255.255.255.0

# 解锁无线设备,可以用rfkill list查看解锁结果.

rfkill unblock wlan

# 睡眠6秒,待rfkill解锁生效

sleep 6s

# 启动dhcpd和hostapd,如果hostapd无法启动请查看日志hostapd.log,查看这两个进程ps -ef|egrep "dhcpd|hostapd"

nohup hostapd /etc/hostapd/hostapd.conf /home/eechen/hostapd/hostapd.log 21

dhcpd wlan0 -pf /var/run/dhcpd.pid

ps -ef|head -n1 ps -ef|egrep "dhcpd|hostapd"

nano  /home/eechen/hostapd/ap-stop.sh

代码如下:

#!/bin/bash

killall hostapd dhcpd

bash -c "echo 0 /proc/sys/net/ipv4/ip_forward"

ifconfig wlan0 down

3. 启动hostapd和dhcpd

在桌面新建两个启动器(快捷方式),里面分别填入:

代码如下:

gksu /home/eechen/hostapd/ap-start.sh

gksu /home/eechen/hostapd/ap-stop.sh

因为脚本需要root用户身份执行,所以需要用gksu运行。

注意:如果你开启了ufw防火墙,ufw默认是禁止转发的,这会导致防火墙NAT转发失效,这时应该设置允许转发:

代码如下:

sudo nano /etc/default/ufw 将 DEFAULT_FORWARD_POLICY 设为 ACCEPT

然后重启ufw即可:

代码如下:

sudo service ufw restart

之后运行启动器即可启动和关闭AP无线热点。

4. 用wireshark监控经过wlan0的通信

安装wireshark(其中 eechen改为你的用户名):

代码如下:

sudo apt-get install wireshark

sudo chgrp eechen /usr/bin/mpcap

sudo chmod 750 /usr/bin/mpcap

sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/mpcap

Alt+F2运行wireshark,选择网络接口wlan0,Filter里输入http.cookie contains mail.qq.com

然后手机端登录网页QQ邮箱,在WireShark即可查看和获取QQ邮箱登录的Cookie,如图所示:

右键点击Cookie项把Value复制出来,然后用Firefox访问站点https://w.mail.qq.com/,Alt+C激活 Original Cookie Injector( GreaseMonkey),弹出输入框Wireshark Cookie Dump,把Cookie项的Value粘贴到里面,然后点OK确定并刷新页面即可登录QQ邮箱。或者你使用Tamper Data这个Firefox扩展在提交时修改Cookie值也是可以的。

附:

查看连接wlan0网络的客户端:

代码如下:

sudo arp

返回IP地址和MAC硬件地址和无线接口名.

代码如下:

iw dev wlan0 station mp

能显示收发包和字节数等.

查看网络接口速度:

代码如下:

sar -n DEV 1

❻ centos7 怎么重启网络配置

1.首先找到网关:

打开虚拟机,“编辑”-“虚拟网络编辑器”,即可看到各个信息

(6)networkmanager源码扩展阅读:

阅读全文

与networkmanager源码相关的资料

热点内容
linuxsftp端口号 浏览:920
remosaic超清算法技术 浏览:270
程序员用mac多还是win多 浏览:580
2017泰牛php大牛班解压 浏览:247
怎样消除加密的微信 浏览:712
c编译器发布视频 浏览:801
python绝配 浏览:647
2017年安卓机皇是什么手机 浏览:830
程序员做手工制作 浏览:142
如何将服务器沉入水里 浏览:448
如何在屏幕上不显示常用app 浏览:508
python3课程 浏览:175
java8编程开发入门 浏览:952
如何找出文件夹中同一尺寸的图片 浏览:681
bg在服务器是什么意思 浏览:899
java资源下载 浏览:530
程序员学习的游戏软件 浏览:929
编程里的面向90度是哪个方向 浏览:84
pdf光标 浏览:581
java发布web项目 浏览:467