使用KVM创建OEL虚拟机

在Linux工作站上使用KVM创建虚拟机。

首先说下我的需求:

  • 1.其他LAN内的笔记本也可以连接到这些KVM的虚拟机,因此需要配置使用桥接网络
  • 2.创建一个虚拟机,采用最小化安装系统,作为基础模版,供后续快速克隆

Part1 :

首先,配置桥接网络:

  1. 已有的网卡配置文件中,添加一行:
    BRIDGE=br0

示例:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp9s0
UUID=b5f36019-009a-40ae-b082-10f03380bf52
DEVICE=enp9s0
ONBOOT=yes
IPADDR=192.168.1.3
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
BRIDGE=br0
  1. 创建/etc/sysconfig/network-scripts/ifcfg-br0 配置文件并添加内容:
DEVICE="br0"
BOOTPROTO="static"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
ONBOOT="yes"
TYPE="Bridge"
DELAY="0"
IPADDR=192.168.1.4
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
  1. 启用网络转发,在/etc/sysctl.conf中添加一行:
    net.ipv4.ip_forward = 1
    然后 sysctl -p 生效。

  2. 重启NetworkManager服务

# systemctl restart NetworkManager

确认br0正常:

[root@bogon network-scripts]# ifconfig br0
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.4  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::2e0:81ff:fee6:dff2  prefixlen 64  scopeid 0x20<link>
        inet6 2408:8207:607a:9b20:2e0:81ff:fee6:dff2  prefixlen 64  scopeid 0x0<global>
        ether 00:e0:81:e6:df:f2  txqueuelen 1000  (Ethernet)
        RX packets 669559  bytes 4925999496 (4.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 608637  bytes 247072650 (235.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Part2:

使用virt-install创建vm1,安装OEL7.9系统:

virt-install \
--network bridge:br0 \
--name vm1 \
--ram=2048 \
--vcpus=2 \
--disk path=/flash/vm-images/vm1.img,size=10 \
--graphics vnc \
--cdrom /flash/ISO/OracleLinux-R7-U9-Server-x86_64-dvd.iso

这里遇到问题:

[root@bogon vm-images]# virsh console vm1
连接到域 vm1
换码符为 ^]

卡住不动,这个问题解决容易,网上搜索就有解决方案,需要对vm1的系统做些配置,可是目前最大的问题是根本进不去vm1额。。
只能另辟蹊径,找到其他进入vm1的方法:
既然命令行不行,那就尝试图形方式。
所以我在Mac的XQuartz的终端跳转到工作站,然后使用virt-manager图形进入vm1进行安装配置,顺便把IP地址配置好,比如就设置为192.168.1.5吧。
注意:如果之前没有安装virt-manager,可以在宿主机上yum安装这些GUI Tools:

# yum install virt-manager virt-viewer

此时,在Mac上测试,使用ssh连接到vm1的IP地址已经OK,所有操作都可以做了。

Reference:

  • KVM Virtualization in RHEL 7 Made Easy
AlfredZhao©版权所有「从Oracle起航,领略精彩的IT技术。」
本文转载于网络 如有侵权请联系删除

相关文章

  • full connection layer(inconnected)

    定义全连接层(fullyconnectedlayers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1×1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。全连接的核心操作就是矩阵向量乘积y=Wx本质就是由一个特征空间线性变换到另一个特征空间。目标空间的任一维——也就是隐层的一个cell——都认为会受到源空间的每一维的影响。不考虑严谨,可以说,目标向量是源向量的加权和。在CNN中,全连接常出现在最后几层,用于对前面设计的特征做加权和。比如mnist,前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。(卷积相当于全连接的有意弱化,按照局部视野的启发,把局部之外的弱影响直接抹为零影响;还做了一点强制,不同的局部所使用的参数居然一致。弱化使参数变少,节省计算量,又专攻局部不贪多求全;强制进一步减少参数。少

  • Django使用django-apscheduler的问题

    Django定时任务由于业务需要,后台要有一个定时任务的功能,起初考虑单独出来使用Linux系统的corn来实现。但是考虑到这样会很不方便。于是便寻找定时任务的模块,就找到了APScheduler,考虑到要在Django中使用,后来就采用了django-apscheduler来作为定时任务的模块,但是这个模块本身有bug。当你使用uwsgi部署并开启多进程的时候,该模块的内置使用get方法来获取任务列表,然后就会报错。因为同一时间有了多个任务,get方法获取到多个任务的时候就会抛出异常。 Django定时任务不要使用django-apscheduler模块,直接使用APScheduler模块即可。APScheduler官方使用指南,在这份指南中明确指出django-apscheduler并不是官方支持的。使用APScheduler现在,我们避免了django-apscheduler模块抛出异常问题,但是我们还有一个问题等待解决,那就是uWsgi使用多进程模式启动Django项目,因此我们会有多个进程去执行这个定时任务,导致定时任务被重复执行。解决这个问题的方法,我们直接就会想到采用加锁

  • BP网络函数逼近 C++实现

    BP网络函数逼近题目选择2)流程图如下 源代码// //题目函数逼近(2)z=sin(x)sin(y) // ///头文件 #include<iostream.h> #include<math.h> #include<fstream.h> #include<time.h> #include<stdlib.h> #include<cstring> //本BP网络采用三层神经网络,并且隐含层的结点数为3.样本数量为225 /定义全局变量// doublestep=0.5,f,ne;//定义学习步长、平均误差 intpass=0,i,j,k; doublesigmoid(doublex);//作用函数为S型函数 doubleDER_sigmoid(doublez);//作用函数的导数 doublex[225][2]={0.0};//样本输入 doubleX[225][3]={0}; doubleO2[225][3]={0.0};//第二层的输出 doubleX2[225][4复制

  • 详解在Ubuntu上的Apache配置SSL(https证书)的正确姿势

    首先看一下阿里云官方的教程:文件说明:1.证书文件xxxxxx.pem,包含两段内容,请不要删除任何一段内容。2.如果是证书系统创建的CSR,还包含:证书私钥文件xxxxxxxx.key、证书公钥文件public.pem、证书链文件chain.pem。(1)在Apache的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为xxxxxxxx.key;(2)打开apache安装目录下conf目录中的httpd.conf文件,找到以下内容并去掉“#”:#LoadModulessl_modulemodules/mod_ssl.so(如果找不到请确认是否编译过openssl插件) #Includeconf/extra/httpd-ssl.conf复制(3)打开apache安装目录下conf/extra/httpd-ssl.conf文件(也可能是conf.d/ssl.conf,与操作系统及安装方式有关),在配置文件中查找以下配置语句:#添加SSL协议支持协议,去掉不安全的协议 SSLProtoc

  • ECS误删文件后恢复数据

    本文档主要以CentOS7操作系统为例,介绍如何使用开源工具Extundelete快速恢复被误删除掉的数据。背景信息在Linux下,基于开源的数据恢复工具有很多,常见的有debugfs、R-Linux、ext3grep、extundelete等,比较常用的有ext3grep和extundelete,这两个工具的恢复原理基本一样,只是extundelete功能更加强大。使用阿里云的云服务器时,如果您不小心误删除数据,并且Linux系统也没有与Windows系统下回收站类似的功能,您可以方便快速安装extundelete工具。 extundelete工具能够利用inode信息结合日志去查询该inode所在的block位置,以此查找和恢复所需的数据。该工具最给力的一点就是支持ext3/ext4双格式分区恢复,基于整个磁盘的恢复功能较为强大。在数据被误删除后,首先要做的是卸载被删除数据所在的磁盘或磁盘分区。因为将文件删除后,仅仅是将文件的inode节点中的扇区指针清零,实际文件还存储在磁盘上,如果磁盘以读写模式挂载,这些已删除的文件的数据块就可能被系统重新分配出去,在这些数据块被新的数据覆盖后

  • [源码解析]Oozie来龙去脉之内部执行

    [源码解析]Oozie来龙去脉之内部执行0x00摘要Oozie由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是用于Hadoop平台的开源的工作流调度引擎,用来管理Hadoop作业,进行。本文是系列的第二篇,介绍Oozie的内部执行阶段。前文[源码解析]Oozie的来龙去脉---(1)提交任务阶段已经为大家展示了用户提交一个OozieJob之后做了什么,本文将沿着一个Workflow的执行流程为大家继续剖析Oozie接下来做什么。大致如下:在Oozie中准备YarnApplicationMaster介绍新旧两版本的YarnApplicationMaster区别介绍HiveonYarnTez是如何乱入到这个流程中的JavaonYarn会是如何执行YarnJob结束之后如何返回Oozie0x01Oozie阶段1.1ActionStartXCommand我们假设Workflow在start之后,就进入到了一个Hive命令。ActionStartXCommand的主要作用就是和Yarn交互,最后提交一个YarnApplicationMaster。ActionStartXCo

  • Kubernetes-控制器之Deployment

    简述Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括:定义Deployment来创建Pod和ReplicaSet滚动升级和回滚应用扩容和缩容暂停和继续Deployment比如一个简单的nginx应用可以定义为apiVersion:extensions/v1beta1 kind:Deployment metadata: name:nginx-deployment spec: replicas:3 template: metadata: labels: app:nginx spec: containers: -name:nginx image:nginx:1.7.9 ports: -containerPort:80复制扩容:kubectlscaledeploymentnginx-deployment--replicas10复制如果集群支持horizontalpodautoscaling的话,还可以为Deployment设置自动扩展:kubectl

  • 深度学习-最新论文解释

    2019一月-3D姿势估计姿势估计器将视频作为输入,并输出与视频中存在的人类个体的姿势相对应的图形。创建可靠且实时的3D姿势估计器的当前困难包括这样的事实:几乎没有训练数据,以及必须考虑遮挡的事实。例如,如果特定身体部位被阻挡而不能看到,则姿势估计器仍必须能够从身体其余部分的位置推断出其位置。该模型优于所有现有模型,因为它创建姿势的2D和3D表示。它使用初始2D姿态估计,然后利用将该2D估计转换为3D形式的神经网络。然后,它使用3D到2D神经网络网络将姿势转换回2D形式,这有助于通过自我监督校正机制改进中间3D姿势预测,该机制可以检测第一个2D到3D的准确度神经网络。网络允许在大约50毫秒内获得姿势估计,其接近每秒20帧。这接近实时,适用于姿势估计的许多应用二月-SC-FEGAN:面部编辑GAN该AI能够从一组可控模式生成逼真的图像。它建立在该领域以前的几篇论文的基础上-第一篇是从稀疏描述中生成图像的论文(比如一个判决书),第二篇是允许定制图像上的面部特征的论文(例如合并两个不同的面孔)。这种技术允许我们编辑更具体的因素-例如,在某人的脸上微笑或删除个人的太阳镜。颜色也可以改变-例如,

  • Hierarchical softmax(分层softmax)简单描述.

    最近在做分布式模型实现时,使用到了这个函数.可以说非常体验非常的好.速度非常快,效果和softmax差不多. 我们知道softmax在求解的时候,它的时间复杂度和我们的词表总量V一样O(V),是性线性的,从它的函数方程式中,我们也可以很容易得出: softmax: f(x)=e^x/sum(e^x_i); 它的需要对所有的词e^x求和;所以当V非常大的时候,哪怕时间复杂度是O(V),这个求解的过程耗时也比较“严重”; 设想一下,当我们在训练模型时,我们知道目标词x,但是我们却需要去求解所有的词,并求和。 当然,有很多去研究如何优化这一过程,提出过各种各样的设想,其中Hierarchicalsoftmax就是其中璀璨的一种。那么说道这,什么是Hierarchicalsoftmax?形如: 我们去构造一棵这样的树,这不是一般的二叉树,是依据训练样本数据中的单词出现的频率,构建起来的一棵Huffmantree,频率越高, 节点越短. 当我们构造了这样之后,如下: 我们发现对于每一个节点,都是一个二分类[0,1],也就是我们可以使用sigmod来处理节点信息; sigmod函数如下: , 此

  • hyperloglog的java版使用

    序对于海量数据来说,数据内存占用会变得很高.Probabilistic数据结构牺牲了一下准确率去换取更低内存占用。比如一个HyperLogLog的数据结构只需要花费12KB内存,就可以计算接近2^64个不同元素的基数,而错误率在1.625%.场景HyperLogLog一个常用的场景就是统计网站的UV。基数简单来说,基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素)中不同元素的个数。例如看下面的集合: {1,2,3,4,5,2,3,9,7} 这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素为1,2,3,4,5,9,7,所以这个集合的基数是7。maven<dependency> <groupId>net.agkn</groupId> <artifactId>hll</artifactId> <version>1.6.0</version> </dependency>复制使用@Test publicvoidtestSimpleUse(){ finali

  • D-News | 联合国AI峰会论坛召开;苹果iOS 11系统融合AI与AR技术

    摘要:新能源汽车国家大数据联盟筹备会在京召开;联合国AI峰会论坛召开中国代表获邀出席演讲;天宫二号VR互动影院亮相2017北京科博会。行业新闻新能源汽车国家大数据联盟筹备会在京召开2017年6月6日,新能源汽车国家大数据联盟筹备会在北京召开,汽车行业组织、汽车企业和科研院所等50余名代表参加了会议。会议发布了联盟发起倡议书,研究讨论了联盟章程,推选了理事长、副理事长及秘书长人选。新能源汽车国家大数据联盟是由新能源汽车国家监测与管理中心、汽车行业组织、新能源汽车企业、科研院所等共同发起成立的全国性、联合性、非盈利性社会组织。联盟将充分发挥新能源汽车国家监测与管理平台作用,通过大数据挖掘与分析,为政府部门对新能源汽车的宏观管理和政策制定提供依据,促进新能源汽车产业健康平稳发展。联合国AI峰会论坛召开中国代表获邀出席演讲 北京时间6月8日,来自全球人工智能行业、政府、联合国机构、民间团体和学界的首席级别代表,在瑞士日内瓦出席联合国“AIforGoodSummit”(人工智能造福人类峰会),商议人工智能的多方面社会影响,希望建立全球AI发展方向的共识。中国企业界和学界各一名代表获邀出席演讲。此

  • 六问 Kafka 为啥那么牛!

    1Kafka简介1.1Kafka概述Kafka架构(下方该是Consumer) Kafka是一个分布式的基于发布/订阅模式的消息队列,依靠其强悍的吞吐量,Kafka主要应用于大数据实时处理领域。在数据采集、传输、存储的过程中发挥着举足轻重的作用。ApacheKafka由Scala写成,是由Apache软件基金会开发的一个开源消息系统项目。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。Kafka是一个分布式消息队列,Kafka对消息保存时根据Topic进行归类,Kafka集群有多个Kafka实例组成,每个实例Server称为broker。无论是Kafka集群还是Consumer都依赖于ZooKeeper集群保存一些meta信息,来保证系统可用性1.2Kafka优点支持多个生产者和消费者。支持broker的横向拓展。副本集机制,实现数据冗余,保证数据不丢失。通过topic将数据进行分类。通过分批发送压缩数据的方式,减少数据传输开销,提高吞高量。支持多种模式的消息,消息是基于磁盘实现数据的持久化。高性能的处理信息,在大数据的情况下,可以保证亚秒级的消息延迟。一个消费者可以支

  • 腾讯云弹性MapReduceAPI概览

    集群生命周期相关接口 接口名称 接口功能 CreateInstance 创建EMR实例 TerminateInstance 销毁EMR实例 信息查询相关接口 接口名称 接口功能 DescribeClusterNodes 查询硬件节点信息 DescribeCvmQuota 获取账户的CVM配额 DescribeEmrApplicationStatics 【监控】查询Application统计信息 DescribeInstanceRenewNodes 预付费集群隔离后续费资源查询 DescribeInstances 查询EMR实例 DescribeInstancesList EMR集群实例列表查询 DescribeJobFlow 查询流程任务 InquirePriceRenewEmr 集群续费询价 InquiryPriceCreateInstance 创建实例询价 InquiryPriceRenewInstance 续费询价 InquiryPriceScaleOutInstance 扩容询价 InquiryPriceU

  • 微软出品自动化神器【Playwright+Java】系列(四)之 浏览器操作

    写在前面 今天是国庆节的最后一天,明天又要上班了,真的是感觉好像才开始放假一样,还是因为失恋没缓过来吗? 我的国庆七天 第1天,当了近半天的司机,陪家人去各大超市去购物,下午在家躺····· 第2-5天,重感冒,鼻涕不止,浑身酸痛乏力,两卷卫生纸下去,鼻子已经废了,真的是躺平了······ 第6天,打嗝不止,干咳、嗓子发炎肿了、鼻子烧了、嗓子基本说不出话了······ 综上,真的这个假期过的好累,算是大病一场吗? 该做点什么 早上6点20醒了,刷了一集《请君》,觉得状态还不错,还是写点东西吧,也算找找状态吧。 不管经历过什么,孰对孰错,生活还是要继续的,和自己和解,要学习的还有很多,充实过好每一天即可。 Playwright之浏览器操作 基础参数 这系列的文章还要继续下去的,那么接下来要进行浏览器部分的操作了。 1、创建浏览器对象 示例代码如下: //默认为无头浏览器方式启动 browser=playwright.chromium().launch(); //参数设定方式启动 browser=playwright.chromium().launch(newBrowserType.La

  • 找工作之面试血泪史

    (提示,本文很长很长,也只是我的一家之言,我写到的东西也未必会对你有用,而且我想大部分人应该是没有那么多的耐心看完的,所以为了不浪费各位看官的宝贵时间,如果决定要看,那么请在看完之后在下面留一段宝贵的评论或者意见建议,或者请直接关闭浏览器窗口) 他们说,毕业等于失业,曾经一度天真地认为这只是对于那些混了四年大学的人而言的,只是有些事情不亲自经历永远不知道到底是怎么样一个情况。 扪心自问,我也不算是那种混了四年大学的人,虽然不说拿了多少多少奖,至少还算是对得起自己的良心,也不说学了多少东西,至少是学了自己觉得重要的东西,当然知识这东西再多都不算多,总有不知道的领域。所以我曾一度天真的认为找工作应该不是太大的问题,当然这就是自信心过度膨胀的结果,这也给后面被动的局面埋下的悲剧的种子。 大四之后一直找各种借口呆在学校里面没出去找工作,当然这件事情要分开看待,虽然这也是造成日后找工作被动局面的一部分因素,不过却是收获了另外一部分的东西,当然这个就不说了。实习什么的都没有,只是去昆山杰普转了一个月被学校拉去培训机构短训一个月,其实什么也没学到,不过倒是因此去上海玩了一圈。所以整个

  • 熬之滴水成石:最想深入了解的内容--windows内核机制(6)

    58进程和线程(3) 说完进程再说说线程,线程相比于进程其实有更多可说的内容。首先实现线程调用的数据结构是个栈,该栈记录了调用方法的信息这里面也包括了函数调用及返回的地址。线程肯定是属于某个进程,其控制流可以访问这个进程的资源,对于线程而言内存等数据都是共享的。一个进程可以有多个线程的,所以线程之间的通信还是比较方便,因为线程是共享资源的,所以多线程通讯的机制比起IPC机制更为方便。在OS的环境中,我们可以把线程分成用户线程和内核线程。用户线程的理解当放在OS的整体环境中还是比较好理解,你认为它就是OS提供的某个进程机制下的线程就可以了,因为用户线程往往是受到了OS进程下的控制的为用户开放的线程功能。用户级线程的优势就是因为它是为用户级开放的,所以它的切换效率高。相比于用户级的线程,内核级线程就显得更为条条框框和规规矩矩了。由于OS对指令有完全的控制能力,所以内核线程是应用各种算法来处理分配处理器的时间。前一章,我们说到线程有优先级的概念,优先级高的肯定可以先执行,内核线程的好处就是在于它根本就不需要考虑在什么时候把控制权交给其他线程,从不担心自己的处理时间片是否长了导致其它线程无法执

  • .NET 中什么样的类是可使用 await 异步等待的?

      我们已经知道Task是可等待的,但是去看看Task类的实现,几乎找不到哪个基类、接口或者方法属性能够告诉我们与await相关。 而本文将探索什么样的类是可使用await异步等待的? Dixin’sBlog-UnderstandingC#async/await(2)TheAwaitable-AwaiterPattern一文解决了我们的疑惑。async/await是给编译器用的,只要我们的类包含一个GetAwaiter方法,并返回合适的对象,我们就能让这个类的实例被await使用了。 既然需要一个GetAwaiter方法,那我们先随便写个方法探索一下: TestDoAsync() { returnnewTest(); } classTest { voidGetAwaiter() { } } 复制 尝试调用: awaitDoAsync(); 复制 编译器告诉我们: Test.GetAwaiter()不可访问,因为它具有一定的保护级别。 原来GetAwaiter方法需要是可以被调用方访问到的才行。 于是我们将GetAwaiter前面的访问修饰符改成public。现在提示变

  • 爬有道翻译

        importurllib.requestimporturllib.parseimportjsoncontent=input('请输入你要翻译文本\n')data={}data['i']=contentdata['from']='AUTO'data['to']='AUTO'data['smartresult']='dict'data['client']='fanyideskweb'data['salt']='f'data['sign']='sign'data['doctype']='json'data['version']='2.1'data['keyfrom']='fanyi.web'data['action']='FY_BY_CL1CKBUTTON'data['typoResult']='true'url='http://fanyi.youdao.com/translate'data=urllib.parse.urlencode(data).encode('utf-8')request=urllib.request.Request(url=url,data

  • pip 命令汇总

        d:\program_software\professional\python\python38-32\python.exe-mpipinstall--upgradepip复制  

  • vue2-vm.$set,vm.$delete实现(三)

    vm.$set实现 语法:vm.$set(target,key,value) 参数: {Object|Array}target {String|Number}key {any}value 返回值:{Function}unwatch 用法:在object上设置一个属性,如果object是响应式的,那么添加的属性也会变为响应式。这个方法可以用来避开Vue.js不能侦测属性被添加的限制; 下面开始实现 首页给Vue挂载set方法 import{set}from'./Observer' Vue.prototype.$set=set 复制 在Observer.js中添加set方法 先处理数组方法 //添加set方法 exportfunctionset(target,key,val){ //如果是数组,并且key是有效的索引值 if(Array.isArray(target)&&isValidArrayIndex(key)){ //获取数组的最长的长度,有可能是修改list某一项,有可能是新增某一项 target.length=Math.max(target.length,key

  • html从入门到卖电脑(二)

      在学习html的初期,小伙伴们肯定对各种标签有点混淆,尤其在每个元素是行内元素还是块级元素的概念上更容易出错,这个看似无关紧要的问题实则关系到我们写出更规范、更简洁、更具“语义化”的页面,下面我们就仔细分辨一下html5中的常用标签。   <!--行内元素--> <!--1.span标签--><span>行内元素</span><!--2.q标签--><q>行内元素</q><!--3.a标签--><ahref="">行内元素</a><!--4.img标签--><imgsrc=""alt="行内元素"><!--5.strong,b标签--><strong>行内元素</strong><b>行内元素</b><!--6.em,i标签--><em>行内元素</em><i>行内元素</i><!--7.abbr标签--><

相关推荐

推荐阅读