导航:首页 > 操作系统 > linux添加接口

linux添加接口

发布时间:2022-12-29 19:50:02

linux远程桌面使用客户端硬盘接口

1、在ubuntu下搜索Remmina,点击Remmina远程桌面客户端。
2、运行Remmina之羡枣族后点击+号添加一台服务器,在远程桌面设定中。
3、设置名称:可以随便输入服务器IP地址。

❷ linux kernel 文件系统编程接口

进程读写文件之前需要 打开文件 ,得到 文件描述符 ,然后 通过文件描述符读写文件 .

内核提供了两个打开文件的系统调用 open openat .

打开文件的主要步骤如下:
(1)需要 在父目录的数据中查找文件对应的目录项 , 从目录项得到索引节点的编号,然后在内存中创建索引节点的副本 .因为各种文件系统类型的物理结构不同,所以需要提供索引节点操作集合的 lookup 方法和文件操作集合的 open 方法.
(2)需要分配文件的一个打开实例-- file 结构体,关联到文件的索引节点.
(3)在进程的打开文件表中 分配一个文件描述符 , 把文件描述符和打开实例的映射添加到进程的打开文件表 中.

进程可通过使用系统调用 close 关闭文件.
系统调用close的执行流程如下:
(1)解除打开文件表和file实例的关联.
(2)在close_on_exec位图中清楚文件描述符对应的位.
(3)释放文件描述符,在文件描述符位图中清除文件描述符对应的位.
(4)调用函数fput释放file实例:把引用计数减1,如果引用计数是0,那么把file实例添加到链表delayed_fput_list中,然后调用延迟工作项delayed_fput_work.
延迟工作项delayed_fput_work的处理函数是flush_delayed_fput,遍历链表delayed_fput_list,针对每个file实例,调用函数__fput来加以释放.

创建不同类型的文件,需要使用不同的命令.
(1) 普通文件 :touch FILE ,这条命令本来用来更新文件的访问时间和修改时间,如果文件不存在,创建文件.
(2) 目录 :mkdir DIRECTORY .
(3) 符号链接(软链接) :ln -s TARGET LINK_NAME 或ln --symbolic TARGET LINK_NAME .
(4) 字符或块设备文件 :mknod NAME TYPE [MAJOR MINOR] .
(5) 命名管道 :mkpipe NAME .
(6) 硬连接 :命令"ln TARGETLINK_NAME ".给已经存在的文件增加新的名称,文件的索引节点有一个硬链接计数,如果文件有n个名称,那么硬链接计数是n.

创建文件需要在文件系统中 分配一个索引节点 ,然后 在父目录的数据中增加一个目录项来保存文件的名称和索引节点编号 .

删除文件的命令如下:
(1)删除任何类型文件:unlink FILE .
(2)rm FILE ,默认不删除目录,如果使用"-r""-R"或"-recursive",可以删除目录和目录的内容.
(3)删除目录:rmdir DICTIONARY .
内核提供了unlink,unlinkat用来删除文件的名称,如果文件的硬链接计数变成0,并且没有进程打开这个文件,那么删除文件.提供了rmdir删除目录.

删除文件需要从父目录的数据中删除文件对应的目录项, 把文件的索引节点的硬链接计数减1(一个文件可以有多个名称,Linux把文件名称称为硬链接),如果索引节点的硬链接计数变成0,那么释放索引节点 .因为各种文件系统的物理结构不同,所以需要提供索引节点操作集合的 unlink 方法.

设置文件权限的命令如下:
(1)chmod [OPTION]... MODE[, MODE]... FILE...
mode : 权限设定字串,格式[ugoa...][[+-=][rwxX]...][,...]
其中:

(2)chmod [OPTION]... OCTAL-MODE FILE...
参数OCTAL-MODE是八进制数值.
系统调用chmod负责修改文件权限.

修改文件权限需要修改文件的索引节点的文件模式字段,文件模式字段包含文件类型和访问权限.因为各种文件系统类型的索引节点不同,所以需要提供索引节点操作集合的 setattr 方法.

访问外部存储设备的速度很慢,为了避免每次读写文件时访问外部存储设备, 文件系统模块为每个文件在内存中创建一个缓存 ,因为 缓存的单位是页 ,所以称为 页缓存 .
(1) 索引节点的成员i_mapping 指向地址空间结构体(address_space).进程在打开文件的时候, 文件打开实例(file结构体)的成员f_mapping 也会指向文件的地址空间.
(2)每个文件有一个地址空间结构体 address_space ,成员 page_tree 的类型是结构体radix_tree_root:成员 gfp_mask是分配内存页的掩码,成员rnode指向基数树的根节点 .
(3)使用基数树管理页缓存,把文件的页索引映射到内存页的页描述符.

每个文件都有一个地址空间结构体address_space,用来建立数据缓存(在内存中为某种数据创建的缓存)和数据来源(即存储设备)之间的关联.结构体address_space如下:

地址空间操作结合address_space_operations的主要成员如下:

页缓存的常用操作函数如下:
(1)函数find_get_page根据文件的页索引在页缓存中查找内存页.

(2)函数find_or_create_page根据文件的页索引在页缓存中查找内存页,如果没有找到内存页,那么分配一个内存页,然后添加到页缓存中.

(3)函数add_to_page_cache_lru把一个内存页添加到页缓存和LRU链表中.

(4)函数delete_from_page_cache从页缓存中删除一个内存页.

进程读文件的方式有3种:
(1)调用内核提供的 读文件的系统调用 .
(2)调用glibc库封装的读文件的 标准I/O流函数 .
(3)创建基于文件的内存映射,把 文件的一个区间映射到进程的虚拟地址空间,然后直接读内存 .
第2种方式在用户空间创建了缓冲区,能减少系统调用的次数,提高性能.第3种方式可以避免系统调用,性能最高.

读文件的主要步骤如下:
(1)调用具体文件系统类型提供的文件操作集合的read和read_iter方法来读文件.
(2) read或read_iter方法根据页索引在文件的页缓存中查找页,如果没有找到,那么调用具体文件系统类型提供的地址空间集合的readpage方法来从存储设备读取文件页到内存中 .
为了提高读文件的速度,从存储设备读取文件页到内存中的时候,除了读取请求的文件页,还会预读后面的文件页.如果进程按顺序读文件,预读文件页可以提高读文件的速度;如果进程随机读文件,预读文件页对提高读文件的速度帮助不大.

进程写文件的方式有3种:
(1)调用内核提供的 写文件的系统调用 .
(2)调用glibc库封装的写文件的 标准I/O流函数 .
(3)创建基于文件的内存映射,把 文件的一个区间映射到进程的虚拟空间,然后直接写内存 .
第2种方式在用户空间创建了缓冲区,能够减少系统调用的次数,提高性能.第3种方式可以避免系统调用,性能最高.

写文件的主要步骤如下:
(1)调用具体文件系统类型提供的文件操作集合的write或write_iter方法来写文件.
(2)write或write_iter方法调用文件的地址空间操作集合的 write_begin 方法, 在页缓存查找页,如果页不存在就分配页;然后把数据从用户缓冲区复制到页缓存的页中 ;最后调用文件的地址空间操作集合的 write_end 方法.

进程写文件时,内核的文件系统模块把数据写到文件的页缓存,没有立即写回到存储设备.文件系统模块会定期把脏页写回到存储设备,进程也可以调用系统调用把脏页强制写回到存储设备.

管理员可以执行命令"sync",把内存中所有修改过的文件元数据和文件数据写回到存储设备.
内核提供了 sync , syncfs , fsync , fdatasync , sync_file_range 等系统调用用于文件写回.

把文件写回到存储设备的时机如下:
(1)周期回写.
(2)当脏页的数量达到限制的时候,强制回写.
(3)进程调用sync和syncfs等系统调用.

对于类似内存的块设备,例如NVDIMM设备,不需要把文件从存储设备复制到页缓存.DAX绕过页缓存,直接访问存储设备,对于基于文件的内存映射,直接把存储设备映射到进程的虚拟地址空间.
调用系统调用mmap创建基于文件的内存映射,把文件的一个区间映射到进程的虚拟地址空间,这会调用具体文件系统类型提供的文件操作集合的mmap方法.mmap方法针对设置了标志位S_DAX的索引节点,处理方法如下:
(1)给虚拟内存区域设置标志位VM_MIXEDMAP和VM_HUGEPAGE.
(2)设置虚拟内存操作集合,提供fault,huge_fault,page_mkwrite和pfn_mkwrite方法.

❸ Linux 内核驱动接口详解

写作本文档的目的,是为了解释为什么Linux既没有二进制内核接口,也没有稳定 的内核接口。这里所说的内核接口,是指内核里的接口,而不是内核和用户空间 的接口。内核到用户空间的接口,是提供给应用程序使用的系统调用,系统调用 在 历史 上几乎没有过变化,将来也不会有变化。我有一些老应用程序是在0.9版本 或者更早版本的内核上编译的,在使用2.6版本内核的Linux发布上依然用得很好 。用户和应用程序作者可以将这个接口看成是稳定的。

你也许以为自己想要稳定的内核接口,但是你不清楚你要的实际上不是它。你需 要的其实是稳定的驱动程序,而你只有将驱动程序放到公版内核的源代码树里, 才有可能达到这个目的。而且这样做还有很多其它好处,正是因为这些好处使得 Linux能成为强壮,稳定,成熟的操作系统,这也是你最开始选择Linux的原因。

只有那些写驱动程序的“怪人”才会担心内核接口的改变,对广大用户来说,既 看不到内核接口,也不需要去关心它。

既然只谈技术问题,我们就有了下面两个主题:二进制内核接口和稳定的内核源 代码接口。这两个问题是互相关联的,让我们先解决掉二进制接口的问题。

假如我们有一个稳定的内核源代码接口,那么自然而然的,我们就拥有了稳定的 二进制接口,是这样的吗?错。让我们看看关于Linux内核的几点事实:

对于一个特定的内核,满足这些条件并不难,使用同一个C编译器和同样的内核配 置选项来编译驱动程序模块就可以了。这对于给一个特定Linux发布的特定版本提 供驱动程序,是完全可以满足需求的。但是如果你要给不同发布的不同版本都发 布一个驱动程序,就需要在每个发布上用不同的内核设置参数都编译一次内核, 这简直跟噩梦一样。而且还要注意到,每个Linux发布还提供不同的Linux内核, 这些内核都针对不同的硬件类型进行了优化(有很多种不同的处理器,还有不同 的内核设置选项)。所以每发布一次驱动程序,都需要提供很多不同版本的内核 模块。

相信我,如果你真的要采取这种发布方式,一定会慢慢疯掉,我很久以前就有过 深刻的教训…

如果有人不将他的内核驱动程序,放入公版内核的源代码树,而又想让驱动程序 一直保持在最新的内核中可用,那么这个话题将会变得没完没了。 内核开发是持续而且快节奏的,从来都不会慢下来。内核开发人员在当前接口中 找到bug,或者找到更好的实现方式。一旦发现这些,他们就很快会去修改当前的 接口。修改接口意味着,函数名可能会改变,结构体可能被扩充或者删减,函数 的参数也可能发生改变。一旦接口被修改,内核中使用这些接口的地方需要同时 修正,这样才能保证所有的东西继续工作。

举一个例子,内核的USB驱动程序接口在USB子系统的整个生命周期中,至少经历 了三次重写。这些重写解决以下问题:

这和一些封闭源代码的操作系统形成鲜明的对比,在那些操作系统上,不得不额 外的维护旧的USB接口。这导致了一个可能性,新的开发者依然会不小心使用旧的 接口,以不恰当的方式编写代码,进而影响到操作系统的稳定性。 在上面的例子中,所有的开发者都同意这些重要的改动,在这样的情况下修改代 价很低。如果Linux保持一个稳定的内核源代码接口,那么就得创建一个新的接口 ;旧的,有问题的接口必须一直维护,给Linux USB开发者带来额外的工作。既然 所有的Linux USB驱动的作者都是利用自己的时间工作,那么要求他们去做毫无意 义的免费额外工作,是不可能的。 安全问题对Linux来说十分重要。一个安全问题被发现,就会在短时间内得到修 正。在很多情况下,这将导致Linux内核中的一些接口被重写,以从根本上避免安 全问题。一旦接口被重写,所有使用这些接口的驱动程序,必须同时得到修正, 以确定安全问题已经得到修复并且不可能在未来还有同样的安全问题。如果内核 内部接口不允许改变,那么就不可能修复这样的安全问题,也不可能确认这样的 安全问题以后不会发生。 开发者一直在清理内核接口。如果一个接口没有人在使用了,它就会被删除。这 样可以确保内核尽可能的小,而且所有潜在的接口都会得到尽可能完整的测试 (没有人使用的接口是不可能得到良好的测试的)。

如果你写了一个Linux内核驱动,但是它还不在Linux源代码树里,作为一个开发 者,你应该怎么做?为每个发布的每个版本提供一个二进制驱动,那简直是一个 噩梦,要跟上永远处于变化之中的内核接口,也是一件辛苦活。 很简单,让你的驱动进入内核源代码树(要记得我们在谈论的是以GPL许可发行 的驱动,如果你的代码不符合GPL,那么祝你好运,你只能自己解决这个问题了, 你这个吸血鬼把Andrew和Linus对吸血鬼的定义链接到这里>)。当你的代码加入 公版内核源代码树之后,如果一个内核接口改变,你的驱动会直接被修改接口的 那个人修改。保证你的驱动永远都可以编译通过,并且一直工作,你几乎不需要 做什么事情。

把驱动放到内核源代码树里会有很多的好处:

❹ 为linux网络接口配置多个ip地址

假设需要配置的接口是eth0

ifconfig eth0:1 192.168.2.2 netmask 255.255.255.0  up

使用ip addr add命令添加多ip

ip addr add 192.168.2.2 dev eth0

❺ Linux用shell创建子接口

#!/bin/sh

N=1
number=$1
if [ $number -lt $N ] ; then
exit 0
fi
while true
do
if [ $N -gt $number ] ; then
break;
fi
### 假设准备挂在的网卡为eth0 网络为C类 #####
ifconfig -s eth0:${N} 192.168.1.${N}/24
done
#################
## 这样就可以实现多少个接口都没有关系了
#################

❻ Linux常用网络配置命令

一、查看网络配置

确保网络配置的正确性及网络连接的畅通是Linux系统作为服务器应用的基础,查看及测试网络配置是管理Linux网络服务的第一步。

1.ifconfig——查看网络配置

1) 查看所有活动网络接口的信息

执行 ifconfig 或ip addr或ip a命令,都可以显示当前主机中已启用(活动)的网络接口信息。、

2) 查看指定网络接口信息

格式:ifconfig 网络接口名

可以通过TX、RX等信息了解到通过该网络接口发送和接收的数据包个数,流量等跟多属性。

2.hostname命令

在Linux系统中,相当一部分网络服务都会通过主机名来识别本机,如果主机名配置不当,可能会导致程序功能出现故障。

1) 查看主机名

使用hostname命令就可以查看当前主机的主机名,不添加任何选项参数。

2) 临时更改主机名

hostname NewName

注:这种方法只是临时的更改主机名,重启后将失效。

3) 永久更改主机名

a. 修改配置文件

RHEL6和7的配置文件存放路径不相同,修改配置文件中的主机名,重启就可永久更改主机名。

RHEL6主机名配置文件路径为:/etc/sysconfig/network

RHEL7主机名配置文件路径为:/etc/hostname

示例

b. 使用命令修改(这种方法只适用于RHEL7或者CentOS7之后)

命令格式:

使用该命令更改后,更改后的主机名就自动写入了配置文件中,所以可以永久更改主机名,其实就是修改了配置文件。

3.route命令

直接执行route命令可以查看当前主机中的路由表信息,若结合“-n”选项使用,可以将路由记录中的地址显示为数字形式,这可以跳过解析主机名的过程,在路由表条目较多的情况下能够加快执行速度。

Destination列对应的是目标网段的地址,Gateway列对应的是吓一跳路由器的地址,Iface列对应的是发送数据的网络接口。当目标网段为“default”是,表示此行是默认网关记录,当吓一跳为“*”是,表示目标网段是与本机直接相连的。

4.netstat命令——查看系统的网络连接状态等

netstat命令是了解网络状态及排除网络服务故障的有效工具。

常用选项:

-a:显示所有活动连接(包括监听、非监听状态的服务端口)

-n:以数字形式显示

-p:显示相关的进程信息

-t:查看 TCP 协议相关信息

-u:查看UDP协议相关信息

-r:显示路由表信息

-l:显示处于监听(listening)状态的网络连接及端口信息

通常使用“-anput”组合选项,结合管道使用“grep”命令,来查看一些服务的端口是否开启。

示例:

Tcp21为ftp服务的端口

二、测试网络连接

1.ping命令——测试网络连通性

常用选项:

-c<完成次数>:设置完成要求回应的次数

-i<间隔秒数>:指定收发信息的间隔时间

-q:不显示指令执行过程,开头和结尾的相关信息除外

-s<数据包大小>:设置数据包的大小

-t<存活数值>:设置存活数值TTL的大小

-v:详细显示指令的执行过程

若返回“Destination Host Unreachable”的反馈信息,则表示目标主机不可达,可能目标地址不存在或主机已关闭;返回“Network is unreachable”的反馈信息,则表示没有可用的路由记录(如默认网关),无法到达目标主机所在的网络;返回“Request timeout”的反馈信息,表示与目标主机间的连接超时(数据包缓慢或丢失),若有严格的防火墙限制,也可能返回此信息。

2.traceroute命令——跟踪数据包的路由途径

使用traceroute命令可以测试从当前主机到目的主机之间经过的网络节点,并显示各中间结点的连接状态(响应时间)。对于无法响应的节点,连接状态将显示为“*”。

示例:traceroute IP_ADDR

在网络测试与排错的过程中,通常会先使用ping命令测试与主机的网络连接,如果发现网络有故障,再使用traceroute命令跟踪查看是在哪个中间结点存在故障。

3.nslookup命令——测试DNS域名解析

nslookup是用来测试(DNS)域名解析的专用工具。(DNS服务后面再详细讲解,通俗的说就是将域名解析为ip地址的一个服务)

示例:nslookup www..com

若成功反馈要查询域名的IP地址,则表示域名解析没有问题;若出现“...... no servers could be reached”的信息,表示不能连接到指定的DNS服务器;若出现“...... cant’t find xxx.yyy.zzz:NXDOMAIN”的信息,表示要查询的域名不存在。

三、设置网络地址参数

设置网络参数的方法:

• 临时配置 —— 使用命令调整网络参数简单、快速,可直接修改运行中的网络参数

一般只适合在调试网络的过程中使用

系统重启以后,所做的修改将会失效

• 永久配置 —— 通过配置文件修改网络参数修改各项网络参数的配置文件

适合对服务器设置固定参数时使用

需要重载网络服务或者重启以后才会生效

1.临时配置——使用网络配置命令(注:RHEL6中网络接口的名称为eth,RHEL7中为ens)

1)使用ifconfig命令修改网卡的地址、状态

ifconfig命令不仅可以用于查看网卡配置,还可以修改网卡的ip地址,子网掩码,也可以绑定网络接口、激活或停用网络接口

a. 修改网卡的ip地址(临时修改)

命令格式:

示例:

b. 禁用或者重新激活网卡

命令格式:

示例:

c. 设置虚拟网络接口(相当于一块网卡配置多个IP地址)

命令格式:

示例:

可以根据需要添加更多的虚拟接口,如“eth0:1”“eth0:2”等

2)使用route命令添加、删除静态路由记录

• 删除路由表中的默认网关记录命令格式:route del default gw IP地址

• 向路由表中添加默认网关记录命令格式:route add default gw IP地址

• 添加到指定网段的路由记录命令格式:route add -net 网段地址 gw IP地址

• 删除到指定网段的路由记录命令格式:router del -net 网段地址

2.永久配置——修改网络配置文件

1)网络接口配置文件

网络接口的配置文件默认位于目录“/etc/sysconfig/network-scripts/”中,文件名格式为:“ifcfg-XXX”,其中“XXX”是网络接口的名称。例如:RHEL6中网卡eth0的配置文件是“ifcfg-eth0”,而RHEL7中网卡ens33的配置文件是“ifcfg-ens33”。

在网卡的配置文件中,可以看到静态IP地址的部分内容如下图所示:

上述个配置项的含义及作用:(图示为RHEL6中的配置文件,7中也差不多,换汤不换药,修改的都差不多)

• DEVICE:设置网络接口的名称ONBOOT:设置网络接口是否在Linux系统启动时激活BOOTPROTO:设置网络接口的配置方式,值为static时表示使用静态ip地址,为dhcp时表示通过dhcp的方式动态获取ip地址IPADDR:设置网络接口的ip地址NETMASK:设置网络接口的子网掩码GATEWAY:设置网络接口的默认网关地址2)重启 network 网络服务

当修改了网络接口的配置文件以后,若要使新的配置生效,可以重启network服务或者重启主机或者禁用、启用网络接口。

示例:

• RHEL6中重启network服务:service network restartRHEL7中重启network服务:systemctl restart network注:这是我在做实验时候的一个经验:RHEL6修改完网卡配置重启后,ip地址仍然没有改过来,这时候我们经常会删除“/etc/udev/rules.d/70-persistent-net.rules”这个文件。RHEL7不用管,RHEL7特别好改,RHEL6改的时候特别难受。(个人提示,不求认同)

3)域名解析配置文件

a.指定为本机提供DNS解析的服务器地址

/etc/resolv.conf文件中记录了本机默认使用的DNS服务器的地址信息,对该文件所做的修改将会立刻生效。Linux系统中最多可以指定3个(第3个以后将被忽略)不同的DNS服务器地址,优先使用第1个DNS服务器。

示例:

其中“search localdomain”用来设置默认的搜索域(域名后缀)。例如,当访问主机“localhost”时,就相当于访问“localhost.localdomain”。

b.本地主机映射文件

/etc/hosts文件中记录着一份主机名与ip地址的映射关系表,一般用来保存经常访问的主机信息。当访问一个未知的域名时,先查找该文件中是否有相应的映射记录,如果找不到在去向DNS服务器查询。

hosts 文件和 DNS 服务器的比较

• 默认情况下,系统首先从 hosts 文件查找解析记录hosts 文件只对当前的主机有效hosts 文件可减少 DNS 查询过程,从而加快访问速度

❼ Linux网络子接口配置

方式一:临时方式(重启则失效):

添加网络子接口:

ifconfig eth0:1 10.1.77.87 netmask 255.255.255.0

除子接口:

ifconfig eth0:1 10.1.77.87 netmask 255.255.255.0 down

注:在/etc/rc.local中配置该命令可以每次重启PC时均执行次命令配置子网络

方式二:

修改配置文件,永久生效

❽ Linux网络相关配置

这里说的网络配置主要是centos环境

centOS系统,在/etc/sysconfig/network-scripts目录下找到当前机器的端口文件,文件名通常是ifcfg-网络连接名。
vim 打开编辑,添加修改分配模式,IP地址,掩码,DNS等内容,完整的示例如下:

修改完成后,执行systemctl restart network重启网卡生效。

Ubuntu20配置值静态ip,需要修改/etc/netplan下面找到一个yaml文件,文件名带network的,1-network-manager-all.yaml,这里给出一个配置示例:
(这里用ifconfig或者ip addr命令先看一下自己的网卡编号,我的编号是enpls0)

修改完成后,输入命令:sudo netplan apply使得配置生效
配置完成后ping一下其他机器或者外网网址看一下网络是否通了,配置还是没生效可以尝试重启机器(重启不影响的情况下)。

查看端口信息
netstat -tunlp |grep 端口号 查看指定的端口号的进程情况,如查看8000端口的情况,netstat -tunlp |grep 8000
nmap 127.0.0.1 查看本机开放的端口,会扫描所有端口。
lsof -i:端口号查看端口所在进程-9

启动防火墙
systemctl start firewalld
禁用防火墙
systemctl stop firewalld
设置/禁止开机启动
systemctl enable/disable firewalld
重启防火墙
firewall-cmd --reload
查看状态
systemctl status firewalld / firewalld-cmd --state
查看版本
firewall-cmd --version
查看帮助
firewall-cmd --help
查看区域信息
firewall-cmd --get-active-zones
查看指定接口所属区域信息
firewall-cmd --get-zone-of-interface=eth0
拒绝所有包
firewall-cmd --panic-on
取消拒绝状态
firewall-cmd --panic-off
查看是否拒绝
firewall-cmd --query-panicpor
将接口添加到区域(默认接口都在public)
firewall-cmd --zone=public --add-interface=eth0(永久生效再加上 --permanent 然后reload防火墙)
设置默认接口区域
firewall-cmd --set-default-zone=public(立即生效,无需重启)
更新防火墙规则
firewall-cmd --reload或firewall-cmd --complete-reload(两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务)
查看指定区域所有打开的端口
firewall-cmd --list-port
firewall-cmd --zone=public --list-ports
在指定区域打开端口(打开后需要重启防火墙生效)
firewall-cmd --zone=public --add-port=80/tcp(永久生效再加上 --permanent)

参考网址: https://jingyan..com/article/20b68a88943059796cec622e.html

❾ linux为什么添加子接口后不能下载软件

linux为什么添加子接口后不能下载软件?
答案如下:linux为什么添加子接口后不能下载软件是因为没有借口所以不能下载

❿ 如何在Linux内核里增加一个系统调用

一、Linux0.11下添加系统调用:x0dx0ax0dx0a我在bochs2.2.1中对linux0.11内核添加了一个新的系统调用,步骤如下: x0dx0a1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87 x0dx0a然后在下面声明函数原型:int mytest(); x0dx0a2./usr/src/linux/include/linux/sys.h中添加:extern int sys_mytest(); x0dx0a然后在sys_call_table中最后加上sys_mytest; x0dx0a3.在/usr/src/linux/kernel/sys.c中添加函数实现如下: x0dx0aint sys_mytest(){ x0dx0aprintk("This is a test!"); x0dx0areturn 123; x0dx0a} x0dx0a4.在/usr/src/linux/kernel/system_call.s中对系统调用号加1(原来是86改成了87) x0dx0a5.然后到/usr/src/linux目录下编译内核make clean; make Image x0dx0a6. cp /usr/src/linux/include/unistd.h /usr/include/unistd.h x0dx0a7. reset bochs x0dx0a8. 在/usr/root中生成test.c文件如下: x0dx0a#define __LIBRARY__ x0dx0a#include x0dx0a_syscall0(int,mytest) x0dx0aint main(){ x0dx0aint a; x0dx0aa = mytest(); x0dx0aprintf("%d", a); x0dx0areturn 0; x0dx0a} x0dx0a9.然后gcc test.c编译之后运行a.out,前面所有步骤都通过,但是每次调用都是返回-1,然后我查过errno为1(表示操作不允许),就不知道为什么了? x0dx0a系统知道的高手们能够告知一下,不胜感激!这个问题困扰我很久了! x0dx0ax0dx0a二、新Linux内核添加系统调用x0dx0ax0dx0a如何在Linux系统中添加新的系统调用x0dx0a系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。x0dx0ax0dx0aLinux操作系统作为自由软件的代表,它优良的性能使得它的应用日益广泛,不仅得到专业人士的肯定,而且商业化的应用也是如火如荼。在Linux中,大部分的系统调用包含在Linux的libc库中,通过标准的C函数调用方法可以调用这些系统调用。那么,对Linux的发烧友来说,如何在Linux中增加新的系统调用呢? x0dx0a1 Linux系统调用机制x0dx0ax0dx0a在Linux系统中,系统调用是作为一种异常类型实现的。它将执行相应的机器代码指令来产生异常信号。产生中断或异常的重要效果是系统自动将用户态切换为核心态来对它进行处理。这就是说,执行系统调用异常指令时,自动地将系统切换为核心态,并安排异常处理程序的执行。Linux用来实现系统调用异常的实际指令是:x0dx0ax0dx0aInt $0x80x0dx0ax0dx0a这一指令使用中断/异常向量号128(即16进制的80)将控制权转移给内核。为达到在使用系统调用时不必用机器指令编程,在标准的C语言库中为每一系统调用提供了一段短的子程序,完成机器代码的编程工作。事实上,机器代码段非常简短。它所要做的工作只是将送给系统调用的参数加载到CPU寄存器中,接着执行int $0x80指令。然后运行系统调用,系统调用的返回值将送入CPU的一个寄存器中,标准的库子程序取得这一返回值,并将它送回用户程序。x0dx0ax0dx0a为使系统调用的执行成为一项简单的任务,Linux提供了一组预处理宏指令。它们可以用在程序中。这些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数。x0dx0ax0dx0a这些宏指令具有类似下面的名称格式:x0dx0ax0dx0a_syscallN(parameters)x0dx0ax0dx0a其中N是系统调用所需的参数数目,而parameters则用一组参数代替。这些参数使宏指令完成适合于特定的系统调用的扩展。例如,为了建立调用setuid()系统调用的函数,应该使用:x0dx0ax0dx0a_syscall1( int, setuid, uid_t, uid )x0dx0ax0dx0asyscallN( )宏指令的第1个参数int说明产生的函数的返回值的类型是整型,第2个参数setuid说明产生的函数的名称。后面是系统调用所需要的每个参数。这一宏指令后面还有两个参数uid_t和uid分别用来指定参数的类型和名称。x0dx0ax0dx0a另外,用作系统调用的参数的数据类型有一个限制,它们的容量不能超过四个字节。这是因为执行int $0x80指令进行系统调用时,所有的参数值都存在32位的CPU寄存器中。使用CPU寄存器传递参数带来的另一个限制是可以传送给系统调用的参数的数目。这个限制是最多可以传递5个参数。所以Linux一共定义了6个不同的_syscallN()宏指令,从_syscall0()、_syscall1()直到_syscall5()。x0dx0ax0dx0a一旦_syscallN()宏指令用特定系统调用的相应参数进行了扩展,得到的结果是一个与系统调用同名的函数,它可以在用户程序中执行这一系统调用。x0dx0a2 添加新的系统调用 x0dx0a如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。x0dx0ax0dx0a(1) 添加源代码x0dx0ax0dx0a第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_标志。假设新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:x0dx0aasmlinkage int sys_mycall(int number) x0dx0a{ x0dx0areturn number; x0dx0a}x0dx0a作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值。x0dx0ax0dx0a(2) 连接新的系统调用x0dx0ax0dx0a添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在。为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。x0dx0ax0dx0a在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要修改的文件是:x0dx0ax0dx0a/usr/src/linux/include/asm-i386/unistd.hx0dx0ax0dx0a该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。文件中每一行的格式如下:x0dx0ax0dx0a#define __NR_name NNNx0dx0ax0dx0a其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。我们的系统调用如下:x0dx0ax0dx0a#define __NR_mycall 191x0dx0ax0dx0a系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190。x0dx0ax0dx0a第二个要修改的文件是:x0dx0ax0dx0a/usr/src/linux/arch/i386/kernel/entry.Sx0dx0ax0dx0a该文件中有类似如下的清单:x0dx0a.long SYMBOL_NAME()x0dx0ax0dx0a该清单用来对sys_call_table[]数组进行初始化。该数组包含指向内核中每个系统调用的指针。这样就在数组中增加了新的内核函数的指针。我们在清单最后添加一行:x0dx0a.long SYMBOL_NAME(sys_mycall)x0dx0ax0dx0a(3) 重建新的Linux内核x0dx0ax0dx0a为使新的系统调用生效,需要重建Linux的内核。这需要以超级用户身份登录。x0dx0a#pwd x0dx0a/usr/src/linux x0dx0a#x0dx0ax0dx0a超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。x0dx0ax0dx0a#make config x0dx0a#make dep x0dx0a#make clearn x0dx0a#make bzImagex0dx0ax0dx0a编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:x0dx0ax0dx0a/usr/src/linux/arch/i386/boot/bzImage x0dx0a(4) 用新的内核启动系统 x0dx0a要使用新的系统调用,需要用重建的新内核重新引导系统。为此,需要修改/etc/lilo.conf文件,在我们的系统中,该文件内容如下:x0dx0ax0dx0aboot=/dev/hda x0dx0amap=/boot/map x0dx0ainstall=/boot/boot.b x0dx0aprompt x0dx0atimeout=50 x0dx0ax0dx0aimage=/boot/vmlinuz-2.2.5-15 x0dx0alabel=linux x0dx0aroot=/dev/hdb1 x0dx0a read-only x0dx0ax0dx0aother=/dev/hda1 x0dx0alabel=dos x0dx0atable=/dev/hadx0dx0ax0dx0a首先编辑该文件,添加新的引导内核:x0dx0aimage=/boot/bzImage-new x0dx0alabel=linux-new x0dx0aroot=/dev/hdb1 x0dx0aread-onlyx0dx0ax0dx0a添加完毕,该文件内容如下所示:x0dx0aboot=/dev/hda x0dx0amap=/boot/map x0dx0ainstall=/boot/boot.b x0dx0aprompt x0dx0atimeout=50 x0dx0ax0dx0aimage=/boot/bzImage-new x0dx0alabel=linux-new x0dx0aroot=/dev/hdb1 x0dx0aread-only x0dx0ax0dx0aimage=/boot/vmlinuz-2.2.5-15 x0dx0alabel=linux x0dx0aroot=/dev/hdb1 x0dx0aread-only x0dx0ax0dx0aother=/dev/hda1 x0dx0alabel=dos x0dx0atable=/dev/hdax0dx0ax0dx0a这样,新的内核映象bzImage-new成为缺省的引导内核。为了使用新的lilo.conf配置文件,还应执行下面的命令:x0dx0a#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-newx0dx0ax0dx0a其次配置lilo:x0dx0ax0dx0a# /sbin/lilox0dx0ax0dx0a现在,当重新引导系统时,在boot:提示符后面有三种选择:linux-new 、linux、dos,新内核成为缺省的引导内核。x0dx0a至此,新的Linux内核已经建立,新添加的系统调用已成为操作系统的一部分,重新启动Linux,用户就可以在应用程序中使用该系统调用了。x0dx0ax0dx0a(5)使用新的系统调用x0dx0ax0dx0a在应用程序中使用新添加的系统调用mycall。同样为实验目的,我们写了一个简单的例子xtdy.c。x0dx0ax0dx0a/* xtdy.c */ x0dx0a#include x0dx0a_syscall1(int,mycall,int,ret) x0dx0amain() x0dx0a{ x0dx0aprintf("%d \n",mycall(100)); x0dx0a}x0dx0a编译该程序:x0dx0a# cc -o xtdy xtdy.cx0dx0a执行:x0dx0a# xtdyx0dx0a结果:x0dx0a# 100x0dx0a注意,由于使用了系统调用,编译和执行程序时,用户都应该是超级用户身份。

阅读全文

与linux添加接口相关的资料

热点内容
phpfaq系统 浏览:635
编译原理统计终结符与非终结符 浏览:796
为什么会显示获取服务器失败 浏览:889
ic验证用什么编译工具 浏览:723
php获取微信code 浏览:573
pdf切割页 浏览:257
小学音乐教案app哪个软件好 浏览:46
aix创建vg命令 浏览:936
程序员五年多少行代码 浏览:862
unix环境高级编程第三版pdf中文 浏览:644
找项目部包杂工用什么app 浏览:381
数控洗床圆弧编程举例 浏览:412
途观压缩机继电器 浏览:164
linuxnslookup安装 浏览:845
java回文数编程 浏览:638
无刷电机控制算法 浏览:744
查看gcc是否编译成功 浏览:898
单片机软件测试 浏览:959
linuxgconf 浏览:864
成都做app需要注意什么 浏览:3