什么是PXE及PXE启动

什么是PXE及PXE启动PXE(Pre-bootExecutionEnvironment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXEclient在网卡的ROM中,当计算机引导时,BIOS把PXEclient调入内存执行,并显示出命令菜单,经用户选择后,PXEclient将放置在远端的操作系统通过网络下载到本地运行。  PXE协议的成功运行需要解决

大家好,又见面了,我是你们的朋友全栈君。

PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。  
PXE协议的成功运行需要解决以下两个问题:  
既然是通过网络传输,那么计算机在启动时,它的IP地址由谁来配置;  
通过什么协议下载Linux内核和根文件系统  
对于第一个问题,可以通过DHCP Server解决,由DHCP server来给PXE client分配一个IP地址,DHCP Server是用来给DHCP Client动态分配IP地址的协议,不过由于这里是给PXE Client分配IP地址,所以在配置DHCP Server时,需要增加相应的PXE特有配置。  
至于第二个问题,在PXE client所在的ROM中,已经存在了TFTP Client。PXE Client使用TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。  
这样,PXE协议运行的条件就具备了,下面我们就来看看PXE协议的工作过程。  
工作过程  
在上图中,PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。  
PXE client在工作过程中,需要三个二进制文件:bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。  
步骤 
有了前面的背景知识,接下来就可以正式操作了,下面按照顺序给出了操作步骤:  
配置DHCP Server  
选用ISC dhcp-3.0,DHCP Server的配置文件是/etc/dhcpd.conf,配置文件的内容如下:  

option space PXE; 
option PXE.mtftp-ip             code 1 = ip-address; 
option PXE.mtftp-cport          code 2 = unsigned integer 16; 
option PXE.mtftp-sport          code 3 = unsigned integer 16; 
option PXE.mtftp-tmout          code 4 = unsigned integer 8; 
option PXE.mtftp-delay          code 5 = unsigned integer 8; 
option PXE.discovery-control    code 6 = unsigned integer 8; 
option PXE.discovery-mcast-addr code 7 = ip-address; 
class “pxeclients” { 
match if substring (option vendor-class-identifier, 0, 9) = “PXEClient”; 
option vendor-class-identifier “PXEClient”; 
vendor-option-space PXE; 
# At least one of the vendor-specific PXE options must be set in 
# order for the client boot ROMs to realize that we are a PXE-compliant 
# server.   We set the MCAST IP address to 0.0.0.0 to tell the boot ROM 
# that we can’t provide multicast TFTP (address 0.0.0.0 means no 
# address). 
option PXE.mtftp-ip 0.0.0.0; 
# This is the name of the file the boot ROMs should download. 
filename “pxelinux.0”; 
# This is the name of the server they should get it from. 
next-server 192.168.0.1; 

ddns-update-style interim; 
ignore client-updates; 
default-lease-time 1200; 
max-lease-time 9200; 
option subnet-mask 255.255.255.0; 
option broadcast-address 192.168.0.255; 
option routers 192.168.0.254; 
option domain-name-servers 192.168.0.1,192.168.0.2; 
option domain-name “mydomain.org”; 
subnet 192.168.0.0 netmask 255.255.255.0 { 
range 192.168.0.10 192.168.0.100; 
}  
host q10 { 
hardware ethernet 00:00:F0:6B:38:5B; 
fixed-address 192.168.0.22; 

  

dhcpd.conf配置文件中几个关键部分说明如下:host q10{…}定义了笔记本Q10网卡的MAC地址与IP地址的对应关系,表明DHCP Server为Q10分配一个固定的IP:192.168.0.22;filename “”指定bootstrap的文件名;netx-server指定TFTP Server的地址。其它的配置请读者参考DHCP Server的手册。  

配置TFTP server  

选用tftp-hpa,TFTP Server的配置文件是/etc/xinetd.d/tftp,配置文件的内容如下:  

service tftp 

       socket_type          = dgram 
       protocol             = udp 
       wait                    = yes 
       user                    = root 
       server                = /usr/sbin/in.tftpd 
       server_args          = -u nobody -s /tftpboot 
       disable                 = no 
       per_source              = 11 
       cps                   = 100 2 

  

这里制定了/tftpboot为TFTP Server的根目录位置。  

配置bootstrap  

bootstrap文件在dhcpd.conf中被指定为pxelinux.0文件,放置在/tftpboot。Linux内核以及Linux根文件系统也放置在/tftpboot。pxelinux.0在执行过程中,要读配置文件,所有的配置文件都放在/tftpboot/pxelinux.cfg/目录下。由于PXElinux具有为不同的PXE Client提供不同的Linux内核以及根文件系统的功能,所以要通过不同的配置文件名来区分出不同的PXE Client的需求。比如一个PXE Client由DHCP Server分配的IP地址为192.168.0.22,那么相对应的配置文件名为/tftpboot/pxelinux.cfg/C0A80016(注:C0A80016为IP地址192.168.0.22的十六进制表示)。如果找不到,就按照顺序C0A80016->; C0A8001->; C0A800->; C0A80->; C0A8->; C0A->; C0->; C->;default查找配置文件。  

/tftpboot/pxelinux.cft/C0A80001配置文件的具体内容如下:  

DEFAULT install 
PROMPT 1 
LABEL install 
KERNEL vmlinuz 
APPEND initrd=initrd.img devfs=nomount ramdisk_size=16384 
  

此配置文件指定了Linux内核以及根文件系统的名称,并给内核传递了一些参数,其中ramdisk_size参数要非常注意,它指定Linux内核启动后建立ramdisk的大小,如果设置太小,Linux的安装过程就可能无法进行。  

制作Linux内核/根文件系统  

因为需要通过网络安装,所有选择Redhat Linux 8.0安装盘(disk #1)中E:\images\bootnet.img(光驱的盘符为E:)。bootnet.img包括Linux内核、Linux根文件系统(有安装程序在内)。用bootnet.img制作一张引导软盘,方法在DOS命令行运行E:\dosutils\rawrite E:\images\bootnet.img,根据提示制作。制作完毕后,将引导软盘中的vmlinuz(Linux内核)和initrd.img(Linux根文件系统)拷贝到Linux Server的/tftpboot下。  

启动DHCP Server/TFTP Server  

在Linux Server上,运行service dhcpd start和service xinetd restart。  

启动Q10  

Q10加电后,在出现Samsung公司徽标时,在左下角会提示用户按F12进入网络引导。按F12后,Q10进入网络引导过程。首先通过DHCP Server获得了IP地址,然后下载并执行bootstrap文件pxelinux.0;在执行中,读入配置文件/tftpboot/pxelinux.cfg/C0A80016。此时屏幕上出现boot:,敲入install,就进入了Redhat Linux 8.0的网络安装界面,一切OK!  

计算机的网卡中必须要有BootROM–PXE Client。同时,PXE协议也可作为无盘Linux技术,用于引导放置在远程的Linux。实际上,只要根据需要,在Pxelinux的配置文件的APPEND选项中,为Linux内核传进需要mount的文件系统的位置参数即可。
PXE无盘站的启动原理简介: 

  当客户机启动后,通过网卡bootrom程序广播一个引导请求帧,包含客户机的网卡号如:00E04C500234。 服务器接到请求帧便调用BOOTP(boot protocol/启动协议)或者DHCP( Dynamic Host Configuration Protocol/动态主机配置协议),分配给工作站端的机器名字、IP地址、服务器端的IP地址、以及启动时的映像文件等。工作站分配到IP地址后,利用服务器提供的TFTP ( Trivial File Transfer Protocol/小文件传输协议),接收到完整的启动文件后,就开始执行文件中的启动程序,将执行点转向启动块的入口,启动工作站。接着是不同的OS有不同的引导方式了,要启动无盘win98,需要往服务器上上传win98文件,并制作启动影像文件,工作站才能读取win98的启动影像文件,进一步读取win98安装目录,启动win98。 

二、安装PXE无盘站所需的软件: 

  根据以上的原理解释,我们知道启动无盘win98需要网卡PXE bootrom程序(写入主板bios,如果网卡已有PXE bootrom则不需要),DHCP服务器软件,PXE服务软件,TFTP服务软件,工作站上传工具,当然,还要有WIN98操作系统软件。 
  我筛选的软件:8139网卡写入主板的bootrom程序8139pxe.lom,cbrom606.exe,awdflash.exe,Vicomsoft DHCP Server,3COM Dabs101(包含TFTP服务与PXE服务等),litenet115上传工具,Win98se操作系统,litenet所需英文win98软件包(如果有英文win98则忽略)。 

三、安装PXE无盘站所需的硬件: 

  如果只是做实验,硬件只需要两台普通的能装WIN98的PC电脑(含网卡并联网)。 
  我的试验环境: 
服务器:k6-2-350, 128m,硬盘46G Ibm 7200转,8139网卡 
工作站(一台):C333, 主板via691(Award Bios),64m,tnt2 m64/16m显卡, 4235声卡,8139网卡 
联网方式:双绞线直连 

四、服务器端软件安装及配置 

1、普通方式安装WIN98操作系统(如果已经是,忽略这一步),安装好网卡驱动程序、协议及服务(协议可以安装IPX/SPX兼容协议,NETBEUI,TCP/IP,Microsoft 网络上的文件与打印机共享)。 

2、在“TCP/IP属性”中,指定IP地址,例如: 

IP地址:192.168.0.1 
子网掩码:255.255.255.0 
默认网关:192.168.0.1 

3、假定计算机名称为:pxeserver,工作组名为pxedomain。 

4、安装3Com Dabs,序列码为:0111151111111111,安装类型:SERVER ,可使用缺省路径即C:\Program Files\3Com\DynamicAccess boot services。 
  运行开始菜单中“程序”——3Com Boot Services中的PXE Server,如果在打开3COM PXE对话框时出现警告框,请点击“是”跳过。在3COM PXE Server对话框的Options标签中去掉“Proxy DHCP”前面的勾,在“File”菜单中的“Open Boot File”选中C:\Program Files\3Com\DynamicAccess boot services中的Bootptab,然后点击“打开(O)”按钮退出。 

5、安装Vicomsoft DHCP Server并运行,在菜单中的“Network”下的“DHCP Setup”中的“Boot Server IP”设定为192.168.0.1,“Boot File”设定为C:\Program Files\3Com\DynamicAccess boot services\win98.pxe (3Com Dabs中的启动文件路径,win98.pxe的制作方法见下文),在菜单中的“Ports”下的“New Port”中把“Ip Address”由缺省的192.168.181.254改为192.168.0.1,在“Router Address”中填入“192.168.0.1”(此为工作站网关),点OK确定退出。如果需要用sygate之类的软件共享上网,还需要在菜单中的“Edit”下的“Preferences”中的“Network”选项中设定“DNS Addresses”为192.168.0.1,“Default Domain Name”设定为pxedomain。 

6、在服务器上建立一个文件夹“pxeboot”并设为完全共享,在PXEBOOT文件夹下,为各用户建立个人目录并完全共享,例如:user01、user02、user03…… 

五、工作站软件安装上传及设置 

1、 在有盘工作站上正常安装Win98并安装好需要的应用软件,假定为缺省安装路径c:\windows,安装好网卡驱动程序、协议及服务,协议可以安装IPX/SPX兼容协议,NETBEUI,TCP/IP,并且可以安装Microsoft 网络上的文件与打印机共享(注意这里与NT下的PXE-PDK无盘不同),将网络登录设置为“Microsoft友好登录”,设定计算机工作组为pxedomain。 

2、 复制实模式下驱动程序 
将keyb.com、ndishlp.sys、net.exe、net.msg、protman.dos、protman.exe、protocol.ini、RTL8139.sys、rtsnd.dos、snapshot.exe复制到c:\Windows目录下,全部替代;将第一版的ndis.vxd复制到c:\Windows\System 目录下,这里可用提供的e98files.exe解压到Windows文件夹中。 

如果不知道还需要复制什么文件,可以运行litenet中的instnic.exe看提示一一复制。 

3、 运行litenet115安装程序setup.exe,出现“Step 0”界面,单击“Next”。 

4、 关闭“license.txt”文本,单击“Yes”按钮,出现“Step 1”界面,在“NetBIOS Server Name”文本框中输入服务器名,如pxeserver。在“NetBIOS Share Name”文本框中输入共享目录名,如pxeboot,单击“Next”。 
出现“Comfirm”对话框,要求驱动网卡实模式,单击“Yes”,出现“Real Mode Net”对话框,在“Nic Type”选择框中选取“RTL8139”,单击“Install”,而后单击“Finish”。 

5、 出现“Step 2”界面,单击“Next”, 出现“Step 3”界面,提示Windows目录、System目录、TEMP目录位置,若无误则单击“Next”。 

6、 出现“Step 4”界面,在“Location of MS Windows files”文本框中,输入英文版的Win98安装文件所在路径(其实只需要输snapshot.exe所在目录就行,可能还需要base4.cab,如果已经拷贝了e98files到c:\windows,则只需输入c:\windows即可),单击“Next”。 

7、 出现“Step 5”界面,按默认值设置,单击“Next”。 出现“Comfirm”对话框,单击“OK”,出现另一对话框,选择“No”,使工作站自动登录,再次出现对话框,提示计算机是否重启,选择“Yes”。 

8、 重启出现“Step 6”界面,放入一张质量较好的软盘,用于制作启动映象盘,单击“Next”,出现格式化对话框,将其全面格式化,并可选中“复制系统文件”。 

9、 出现“Step 7”界面,制作引导软盘,单击“Next”,复制相关文件。 

10、 出现“Step 8”界面,系统提示安装Litenet实用工具,按默认值设置,单击“Next”,再三次单击“Yes”。 

11、 出现“Step 9”界面,单击“Next”,再单击“OK”,出现“Synchroniaer”界面,选择“From Local Driver”,如果是第一次上传,单击“Complete Copy”(完全上传),开始上传文件。 
上传完成后,系统自动检测WIN98SE,若为SE则提示你替换NDIS.VXD或运行FTuner进行PATCH,此处有个选项说是否建立虚拟盘,可以去掉前面的勾以节省工作站内存。 

12、 出现“Step 10”,单击“Finish”完成。 

13、 上传文件后,在服务器端作以下改动: 
1) 拷贝服务器或工作站中c:\windows\system\sysdm.cpl到共享文件夹中的windows\system中如D:\pxeboot\windows\system中(解决工作站打不开控制面板的系统属性问题); 

2) 进入PXEBOOT\WINDOWS文件夹,将3COM DABS安装目录中的FREEMEE.COM拷贝到此目录下, 
找到并打开USERCMD.BAT做如下修改: 
将QRESTALL命令前的rem去掉(可不改),并在其下添加以下一行: 
c:\windows\freemem.com (解决作站运行到最后一步时,光标在左上角闪动几秒种后重启或起动到win98的蓝色界面, 出现鼠标后定住或重启的问题) 
在WIN.COM命令之前插入以下面这条语句: 
QVMEM S: %SERVER% %USERNAME% (设定虚拟盘符) 

3) 找到并打开SYSTEM.INI,在[386Enh]小节添加以下三条语句: 
PagingDrive=S (S为前面用QVMEM映射的虚拟盘符) 
MinPagingFileSize=65535 
MaxPagingFileSize=65535 
这样无盘WIN98就可以使用虚拟内存了。如果工作站运行游戏或其它软件出现内存不足提示,可以适当把值设大! 

4)为了屏蔽启动信息: 
在Pxeboot\windows\Usercmd.bat第一行加入ctty con(生成软盘中的autoexec.bat也要做相应修改,见下文) 

14、修改生成软盘中的文件: 

1) 如果不能同时启动多台工作站,有的工作站启动的时候死机,将RANDELAY.EXE文件复制到A:\WINBOOT 目录下,在A:\WINBOOT\STARTNET.BAT中的QUALCNX命令前加入RANDELAY 5 60。 

2)为了屏蔽启动信息: 
修改autoexec.bat,加入: 
@echo off 
cls 
ctty nul 
… 
… 

15、 在服务器端“PXEBOOT\Windows”目录下,找到Netnames.db文件并打开它,删除其所有信息,输入机号及网卡地址,例如: 
user01 00E04C500234 
user02 00E04C500235 
…… …… 
若不知道网卡地址,Litenet可自动添加网卡记录到Netnames.db文件中。其方法为:在工作站启动出现: 
Enter the name for this computer (Hardware Address 00E04C500234): 
时,输入机号,例如:user01。系统提示: 
Confirm that Hardware address 00E04C500234 is assicpned the name user01(Y/N) Y 
系统提示重启计算机,注意此时只能修改一台,不然会出现文件共享出错。 

16、给工作站加入PXE bootrom启动代码,如果网卡有PXE启动芯片则跳过这一步,如果没有,重新启动计算机并切换到MS-DOS方式: 
1)读出BIOS文件 
AWDFLASH /sy a b.bin 
保存为b.bin,有找不到源文件的提示属于正常现象。 
把b.bin复制一份以便可以恢复原来的状态 
2)写8139pxe.lom到b.bin里面 
CBROM606 b.bin /pci 8139pxe.lom 
8139pxe.lom大小为52k,是专用写入主板Bios的,不要错把写入网卡的写入bios! 
3)把b.bin写入主板BIOS 
AWDFLASH b.bin /py /sn /r 
4)OK! 
不成功的原因可能有以下几个: 
1)BIOS容量不够用 
CBROM b.bin /d 
找REMAIN COMPRESS CODE SPACE一行,看是否够64KB不够的话可以用CBROM删除一些LOGO之类的东西. 
2)bios类型是AMI的或不是标准AWDARD的,比如华硕和皇朝的一些主板就都不行,但是可以用其它工具,这里不一一介绍了。 

六、建立并配置WIN98无盘启动影像文件 

1、运行服务器上开始菜单的“程序”——“3Com Boot Services”——“Boot Image Editor”,按提示执行“下一步”直到“完成”,并出现3Com Boot Image Edito对话框。 

2、将安装工作站litenet115生成的软盘插入服务器软驱,选择3Com Boot Image Editor窗口中Create a TCP/IP or PXE image file选项,在“image file name”栏中使用缺省路径并加入文件名win98.img:“C:\Program Files\3Com\DynamicAccess boot services\win98.img”,选中options中的Writeable和Pre-OS两个选项,点击”ok”按钮建立启动影像文件。 

3、选择3Com Boot Image Editor窗口中的Create a PXE menu boot file选项,点击”add”图标进入Edit Entry对话框,在image file文本框中输入win98.img,然后点击”ok”按钮返回Create menu file对话框,在此对话框中点击”save”按钮进入Save menu file对话框,在文件名文本框中输入win98.pxe,点击“OK”,然后点击“Save”保存返回,退出3Com Boot Image Edito对话框。 

4、运行开始菜单中“程序”——“3Com Boot Services”——“Bootptab Editor”,在出现的对话框中选择“PXE”、“Open an existing”单选按钮,并在下面的文本框中输入C:\Program Files\3Com\DynamicAccess boot services\Bootptab,确定后进入BOOTPTAB Editor窗口。在窗口中选择”Edit”菜单下的”Add Host”菜单项,进入Edit Host窗口。在“Name”中输入 “user01”,在“Node”中输入网卡的MAC地址如:00E04C500234,在“Image”文本框中输入win98.pxe。点击“确定”按钮返回BOOTPTAB Editor窗口。选择“File”菜单下的“Save”保存设置,然后关闭BOOTPTAB Editor窗口。 

七、在服务器上运行Vicomsoft DHCP Server,并在Status View窗口中点击按钮使其启动服务(按钮状态为On),运行3Com TFTP Server并使其启动服务(状态为 Server started)。可以不运行3Com PXE Server。 

八、关闭工作站,取掉工作站的硬盘、软驱、光驱。 
  重启进行工作站主板Bios设置,在STANDARD CMOS SETUP中,将硬盘设置为无,将软驱设置为1.44M(软驱设置为无会重启),在BIOS FEATURES SETUP中把Boot Up Floppy Seek(开机软驱寻道)设为Disable,有些主板还需要设置Boot First Lan(或者相似选项):Enable。 
  重新启动,按Shift+F10键出现PXE启动设置框,选择 
Network Boot Protocol:PXE 
Boot Order:      Int 19h 
Show Config Message: Disable (不出现提示信息,Enable为有提示信息) 
按F4保存退出。 

九、安装完成,工作站启动进入无盘Win98。 

十、优缺点 
 优点: 
1、不用安装winnt server4.0+service park 6或win2000 server,减少安装时间,如果使用正版,不用买昂贵的软件及服务协议; 
2、没有cannot find or load required file krnl386.exe问题; 
3、没有tnt系列显卡16色问题; 
4、没有添加了文件和打印共享就出错的问题; 
5、没有修改工作站时间死机问题; 
6、没有无法正常关机与重启的问题; 

 缺点: 
1、win98做服务器资源分配效率低,比如: 
工作站启动时,服务器偶尔停顿; 
工作站运行大型游戏如红警2、diablo2容易死机(不过还好,星际、帝国没问题); 
工作站数量不能太多。 
此缺点无法弥补,可能使用高配置的电脑做服务器会好一点点(期望值别太高哟)。 
2、工作站用户权限设置功能弱,容易造成系统被破坏。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148404.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ipad越狱有什么坏处吗?_平板越狱有什么好处

    ipad越狱有什么坏处吗?_平板越狱有什么好处1. iPad越狱是什么?iPad越狱有什么好处和坏处?不越狱又有啥缺点?越狱就是解除一些原版固件的限制。最大的好处是可以安装激活成功教程的软件和游戏,这些软件和游戏本来都是收费的。而且,有些功能很强大的软件,并不是花钱能在官方的App Store里能买到的(某些有米之人或许会说“我就不越狱,我都花钱买正版”,我只能客气地说他只知其一不知其二),比如SBSettings, OpenSSH, Lockd

  • fflush与fsync

    fflush与fsync区别:1、头文件不同fflush包含在头文件中;fsync包含在头文件中;2、参数不同fflush函数原型是:intfflush(FILE*fp);   即,fflush的参数时文件指针。fsync函数原型是:intfsync(intfd);   即,fsync的参数时文件描述符。2、应用层次不同fflush函数应用于用户层,将C语言函数库中的函数提

  • Timer时间控件

    Timer时间控件第一步、创建一个Windows窗体,第二步、创建样式,在工具箱中找到TextBox和Labell、Button、timer。第三步、改变属性的Name和Text(就是改写名称)第四步、排版按钮1:使用的控制器是Label;name改为lblTime2:使用的控制器是TextBox;Name改为txtTime3:使用的控制器是Button;Name改为btnGet4…

  • 成功解决IDEA2022 Plugins 连不上、打不开「建议收藏」

    成功解决IDEA2022 Plugins 连不上、打不开「建议收藏」解决IntelliJIDEA2020.1插件中心一直打不开

    2022年10月21日
  • AWS 物联网架构 以及 AWS Greengrass 的介绍[通俗易懂]

    AWS 物联网架构 以及 AWS Greengrass 的介绍[通俗易懂]1、AWS的物联网架构AmazonWebServices(AWS)是一个安全的云服务平台,提供计算能力、数据库存储、内容交付以及其他功能来帮助实现业务扩展和增长。了解数以百万计的客户目前如何利用AWS云产品和解决方案来构建灵活性、可扩展性和可靠性更高的复杂应用程序。AWSIOT主要是解决物联网相关问题的,AWSIOT的基本架构如下:AWSIOT的架构主要由三大部分组成,分别在边缘端和云端。Edge:things数据产生的来源,也是经过数…

  • html空格代码_html中空格怎么表示

    html空格代码_html中空格怎么表示html中空格代码的写法一:&nbsp(不换行空格)html中空格代码的写法二:&ensp(半角空格)html中空格代码的写法三:&emsp(全角空格)html中空格代码的写法四:&thinsp(窄空格)html中空格代码的写法五:&zwnj(零宽不连字)说明:&zwnj是一个不打印字符,放在电子文本的两个字符之间,抑制本来会发生的连字,而是以这两个字符原本的字形来绘制。html中空格代码的写法六:&zwj(零宽连字)说明:&amp

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号