grub2配置关键(三个核心变量prefix、root、cmdpath)和几点疑问
前置知识:你必须知道grub的启动过程以及bios和uefi的相关基础知识,可以参考:《Unified Extensible Firmware Interface Wikipedia》、《linux启动过程简介》
先说说三个变量是干嘛的:
cmdpath
当前被加载的"core.img"(bios的core.img,uefi的BOOTX64.EFI或grubx64.efi等镜像)所在目录的绝对路径。例如:UEFI启动可能是'(hd0,gpt1)/EFI/GRUB或'(cd0)/EFI/BOOT',BIOS启动可能是'(hd0)'
prefix
这个变量是指GRUB2的安装目录,即绝对路径形式的'/boot/grub'目录位置,如例如'(hd0,gpt1)/grub'或'(hd0,msdos2)/boot/grub'。初始值由GRUB在启动时根据"grub-install"在安装时提供的信息自动设置,这些信息是由grub-install脚本直接写入到grub镜像(bios的core.img,uefi的BOOTX64.EFI或grubx64.efi等镜像)的,当然,也可以在grub的rescue模式下用grub的命令直接修改,如:set prefix=(hd1,gpt2)/grub。
GRUB2的安装目录中存在着这么几个文件夹和文件
文件夹:
fonts:存在着一些字体
locale:区域化相关
x86_64-efi:模块的二进制文件,以.mod为后缀。你insmod所操作的模块,都在这里面有,比如ext4.mod、fat.mod这些文件系统模块,gzio等解压支持的模块。
themes:一些主题,就是你grub界面的背景啥的。
文件:
grub.cfg:这是grub的启动shell脚本,对于用户来说,是最重要的文件,几乎是用户配置grub的唯一的配置文件。通过这个文件用户可以控制grub加载操作系统的行为,比如添加一个menuentry就是添加一个操作系统启动选项,每个选项中可以指定操作系统内核尽享和initramfs镜像等等。下面是一个grub.cfg的实例:
- #由于"$prefix"的值是在"grub-install"安装时确定的,并且嵌入'core.img'中的模块也是随硬件变化的,
- #所以不要只是简单的复制'grub'目录到处使用,而应该在每一个介质上都使用"grub-install"进行安装。
- ###############################################################################
- #()本配置文件要求"grub"目录所在分区的卷标必须是"GRUB2"。
- #()为了保持最大程度的BIOS兼容性,"GRUB2"分区必须位于磁盘的前 137GB 范围。
- ###############################################################################
- # 如果要在windows上安装GRUB2的话,必须首先以管理员身份打开命令提示符,然后运行
- # wmic diskdrive list brief
- # 命令查看安装目标,最后再使用例如下面这样的命令进行安装:
- # grub-install.exe --boot-directory=g: --recheck --target=x86_64-efi --efi-directory=g: --no-nvram --removable \\.\PHYSICALDRIVE5
- # grub-install.exe --boot-directory=g: --recheck --target=i386-pc \\.\PHYSICALDRIVE5
- ###############################################################################
- #################
- ## ()特殊变量 ##
- #################
- #禁止验证签名
- set check_signatures=no
- #默认启动第一个菜单项
- set default=
- #如果第一个菜单项启动失败,转而启动第二个菜单项
- set fallback=
- #优先使用最常规的1024x768分辨率,以保证在不同的屏幕上拥有一致的菜单效果,如果失败再自动匹配分辨率
- set gfxmode=1024x768,auto
- #使用自己制作的24px的大号字体以避免默认字体太小看不清
- set gfxterm_font=WenQuanYiMicroHeiMono24px
- #将GRUB2设置为简体中文界面
- set lang=zh_CN
- #指定翻译文件(*.mo)的目录,若未明确设置此目录,则无法显示中文界面。
- set locale_dir=$prefix/locale
- #每一满屏后暂停输出,以免信息太多一闪而过看不清
- set pager=
- #开启密码验证功能,并设置一个名为'root'的超级用户
- set superusers=root
- #设置菜单的超时时间为5秒
- set timeout=
- #################
- ## ()公共模块 ##
- #################
- #两种最流行的磁盘分区格式(partmap.lst)
- insmod part_gpt
- insmod part_msdos
- #常见文件系统驱动(fs.lst)
- insmod fat
- insmod exfat
- insmod ntfs
- insmod iso9660
- insmod ext2
- insmod xfs
- #一次性加载所有可用的视频驱动
- insmod all_video
- #图形模式终端
- insmod gfxterm
- #背景图片支持
- insmod png
- #########################################
- ## ()公共命令(必须放在模块和变量之后) ##
- #########################################
- #激活图形模式的输出终端,以允许使用中文和背景图
- terminal_output gfxterm
- #设置背景图片
- background_image $prefix/themes/1024x768.png
- #加载自己制作的24px的大号字体文件($prefix/fonts/WenQuanYiMicroHeiMono24px.pf2)
- loadfont WenQuanYiMicroHeiMono24px
- #设置'root'用户的哈希密码[通过"grub-mkpasswd-pbkdf2"工具生成]
- password_pbkdf2 root grub.pbkdf2.sha512..7DBCA469F80EA1C0A8A1E2FEBC4F8463.B073C1C89EC1E85309C3D6A1BAFF4356
- #################
- ## ()菜单项 ##
- #################
- menuentry '正常启动(Windows)' --unrestricted {
- if [ 'pc' == $grub_platform ] ; then
- if search --file --set /bootmgr ; then
- chainloader +
- elif search --file --set /ntldr ; then
- chainloader +
- fi
- elif [ 'efi' == $grub_platform ] ; then
- if search --file --set /EFI/Microsoft/Boot/bootmgfw.efi ; then
- chainloader /EFI/Microsoft/Boot/bootmgfw.efi
- fi
- fi
- }
- #http://www.wepe.com.cn/download.html
- menuentry '系统救援(WinPE)' --users=root {
- if [ 'pc' == $grub_platform -a -f $prefix/winpe/memdisk ] ; then
- if [ -f $prefix/winpe/WinPE.iso ] ; then
- linux16 $prefix/winpe/memdisk iso raw
- initrd16 $prefix/winpe/WinPE.iso
- fi
- elif [ 'efi' == $grub_platform -a -f $prefix/winpe/bootmgfw.efi -a -f $prefix/winpe/BCD ] ; then
- if [ -f $prefix/winpe/WinPE.wim -a -f $prefix/winpe/boot.sdi ] ; then
- chainloader $prefix/winpe/bootmgfw.efi
- fi
- fi
- }
- #https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/
- if [ -f $prefix/linux/archlinux.iso ] ; then
- menuentry 'Arch Linux LiveCD [root/空]' --unrestricted {
- loopback loop0 $prefix/linux/archlinux.iso
- linux (loop0)/arch/boot/x86_64/vmlinuz img_label=GRUB2 img_loop=/grub/linux/archlinux.iso systemd.wants=sshd.service
- initrd (loop0)/arch/boot/x86_64/archiso.img
- }
- fi
- #https://mirrors.163.com/gentoo/releases/amd64/autobuilds/current-install-amd64-minimal/
- #因为Gentoo官方的最小安装CD不支持UEFI启动,所以不可用于在UEFI环境中安装Gentoo
- if [ -f $prefix/linux/install-amd64-minimal.iso ] ; then
- menuentry 'Mini Gentoo LiveCD [root/123]' --unrestricted {
- loopback loop0 $prefix/linux/install-amd64-minimal.iso
- linux (loop0)/isolinux/gentoo cdroot isoboot=/grub/linux/install-amd64-minimal.iso dosshd nokeymap passwd=
- initrd (loop0)/isolinux/gentoo.igz
- }
- fi
- #https://mirror.umd.edu/calculate/release/
- #https://www.calculate-linux.org/main/en/download
- # Calculate Linux Scratch 是基于Gentoo制作的 LiveCD ,
- #包含编译工具(GCC,Binutils,...)、支持UEFI、支持WiFi,
- #既可用作LFS(Linux From Scratch)的宿主系统、也可用于在UEFI环境中安装 Gentoo
- if [ -f $prefix/linux/cls.iso ] ; then
- menuentry 'Live GCC x64 [root/root]' --unrestricted {
- loopback loop0 $prefix/linux/cls.iso
- linux (loop0)/boot/vmlinuz root=live iso-scan/filename=/grub/linux/cls.iso vga=current nodevfs noresume nodmraid
- initrd (loop0)/boot/initrd
- }
- fi
- #https://mirrors.huaweicloud.com/centos/7/isos/x86_64/
- if [ -f $prefix/linux/CentOS-LiveGNOME.iso ] ; then
- menuentry 'CentOS 7.6 GNOME LiveCD [root/空](可退出liveuser后再用root登录)' --unrestricted {
- loopback loop0 $prefix/linux/CentOS-LiveGNOME.iso
- linux (loop0)/isolinux/vmlinuz0 rd.live.image root=live:CDLABEL=CentOS--x86_64-LiveGNOME- iso-scan/filename=/grub/linux/CentOS-LiveGNOME.iso systemd.wants=sshd.service inst.lang=zh_CN
- initrd (loop0)/isolinux/initrd0.img
- }
- fi
- #https://mirrors.ustc.edu.cn/debian-cd/current-live/amd64/iso-hybrid/
- #也适用于'Kali LiveCD [root/toor]' https://cdimage.kali.org/current/
- if [ -f $prefix/linux/debian-live-kde.iso ] ; then
- menuentry 'Debian 9.6 KDE LiveCD (NO SSH)' --unrestricted {
- loopback loop0 $prefix/linux/debian-live-kde.iso
- linux (loop0)/live/vmlinuz-4.9.--amd64 boot=live findiso=/grub/linux/debian-live-kde.iso components username=root locales=zh_CN.UTF-
- initrd (loop0)/live/initrd.img-4.9.--amd64
- }
- fi
- #https://mirrors.aliyun.com/fedora/releases/29/Spins/x86_64/iso/
- #只有 Xfce LiveCD 可以设置中文界面
- if [ -f $prefix/linux/Fedora-Xfce-Live.iso ] ; then
- menuentry 'Fedora 29 Xfce LiveCD [root/空](可退出liveuser后再用root登录)' --unrestricted {
- loopback loop0 $prefix/linux/Fedora-Xfce-Live.iso
- linux (loop0)/isolinux/vmlinuz rd.live.image root=live:CDLABEL=Fedora-Xfce-Live--- iso-scan/filename=/grub/linux/Fedora-Xfce-Live.iso systemd.wants=sshd.service locale.LANG=zh_CN.utf8 inst.lang=zh_CN
- initrd (loop0)/isolinux/initrd.img
- }
- fi
- #https://ftp.sjtu.edu.cn/opensuse/distribution/openSUSE-stable/live/
- if [ -f $prefix/linux/openSUSE-Leap-KDE-Live.iso ] ; then
- menuentry 'openSUSE Leap 15.0 KDE LiveCD [root/空]' --unrestricted {
- loopback loop0 $prefix/linux/openSUSE-Leap-KDE-Live.iso
- linux (loop0)/boot/x86_64/loader/linux root=live:CDLABEL=openSUSE_Leap_15.0_KDE_Live iso-scan/filename=/grub/linux/openSUSE-Leap-KDE-Live.iso systemd.wants=sshd.service lang=zh_CN
- initrd (loop0)/boot/x86_64/loader/initrd
- }
- fi
- #https://mirrors.shu.edu.cn/ubuntu-cdimage/lubuntu/releases/
- #也适用于 KDE neon LiveCD https://files.kde.org/neon/images/neon-userltsedition/current/neon-userltsedition-current.iso
- if [ -f $prefix/linux/lubuntu.iso ] ; then
- menuentry 'Ubuntu LXQt LiveCD (NO SSH)' --unrestricted {
- loopback loop0 $prefix/linux/lubuntu.iso
- linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=/grub/linux/lubuntu.iso username=root locale=zh_CN keyboard-configuration/layoutcode=us
- initrd (loop0)/casper/initrd
- }
- fi
- menuentry '关机' --unrestricted { halt ; }
- menuentry '重新启动' --unrestricted { reboot ; }
- #https://rhinstaller.github.io/anaconda/boot-options.html
- #硬盘安装通用于所有包含"Packages"目录的 CentOS/Fedora ISO映像(Minimal,DVD,Everything)
- #网络安装通用于所有包含"images"目录的 CentOS/Fedora ISO映像(Minimal,DVD,Everything,NetInstall)
- #https://mirrors.zju.edu.cn/centos/7/isos/x86_64/
- if [ -f $prefix/linux/CentOS-Minimal.iso ] ; then
- menuentry '硬盘安装 CentOS [最小安装]' --unrestricted {
- loopback loop0 $prefix/linux/CentOS-Minimal.iso
- linux (loop0)/isolinux/vmlinuz inst.repo=hd:LABEL=GRUB2:/grub/linux/CentOS-Minimal.iso inst.lang=zh_CN
- initrd (loop0)/isolinux/initrd.img
- }
- menuentry '网络安装 CentOS 7.x [不支持WiFi]' --unrestricted {
- loopback loop0 $prefix/linux/CentOS-Minimal.iso
- linux (loop0)/images/pxeboot/vmlinuz inst.repo=https://mirrors.aliyun.com/centos/7/os/x86_64/ inst.lang=zh_CN ip=dhcp nameserver=223.6.6.6
- initrd (loop0)/images/pxeboot/initrd.img
- }
- fi
- #https://www.debian.org/releases/stable/amd64/ch05s03.html.zh-cn
- #https://www.debian.org/releases/stable/amd64/ch06s03.html.zh-cn
- #最好将用于硬盘安装的ISO映像放在文件系统的根目录或第一层子目录中(可简化ISO映像的搜索)
- #https://mirrors.163.com/debian/dists/stable/main/installer-amd64/current/images/hd-media/
- #https://mirrors.163.com/ubuntu/dists/bionic/main/installer-amd64/current/images/hd-media/
- #硬盘安装也适用于 Alternative Ubuntu Server ISO [ http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.1-server-amd64.iso ]
- if [ -f $prefix/linux/debian/vmlinuz -a -f $prefix/linux/debian/initrd.gz ] ; then
- menuentry '硬盘安装 Debian [自动搜索ISO映像(最好放在根目录)]' --unrestricted {
- linux $prefix/linux/debian/vmlinuz priority=low vga= locale=zh_CN
- initrd $prefix/linux/debian/initrd.gz
- }
- fi
- #https://mirrors.163.com/debian/dists/stable/main/installer-amd64/current/images/netboot/
- #https://mirrors.163.com/ubuntu/dists/bionic/main/installer-amd64/current/images/netboot/
- #网络安装也适用于 Ubuntu 的 mini.iso 映像(支持WiFi网络)
- if [ -f $prefix/linux/debian/mini.iso ] ; then
- menuentry '网络安装 Debian [不支持WiFi]' --unrestricted {
- loopback loop0 $prefix/linux/debian/mini.iso
- linux (loop0)/linux priority=low vga= locale=zh_CN
- initrd (loop0)/initrd.gz
- }
- fi
- #https://doc.opensuse.org/documentation/leap/startup/html/book.opensuse.startup/cha.boot_parameters.html
- #https://ftp.sjtu.edu.cn/opensuse/distribution/openSUSE-stable/iso/
- if [ -f $prefix/linux/openSUSE-Leap-DVD.iso ] ; then
- menuentry '硬盘安装 openSUSE Leap' --unrestricted {
- loopback loop0 $prefix/linux/openSUSE-Leap-DVD.iso
- linux (loop0)/boot/x86_64/loader/linux install=hd:/grub/linux/openSUSE-Leap-DVD.iso lang=zh_CN
- initrd (loop0)/boot/x86_64/loader/initrd
- }
- fi
- #https://mirrors.nju.edu.cn/opensuse/distribution/openSUSE-stable/iso/
- if [ -f $prefix/linux/openSUSE-Leap-NET.iso ] ; then
- menuentry '网络安装 openSUSE Leap [支持WiFi]' --unrestricted {
- loopback loop0 $prefix/linux/openSUSE-Leap-NET.iso
- linux (loop0)/boot/x86_64/loader/linux install=https://mirrors.aliyun.com/opensuse/distribution/openSUSE-stable/repo/oss/ lang=zh_CN netsetup=dhcp nameserver=223.6.6.6
- initrd (loop0)/boot/x86_64/loader/initrd
- }
- fi
不过,grub.cfg一般都不会手动编辑的,而是用过grub-mkconfig -o /boot/grub/grub.cfg去生成。
grubenv:预设的一些环境变量可以放到这,是一个文本文件
root
root变量一般在grub.cfg执行的过程中设定的,指定了后续脚本中所有文件的其实位置,比如root=(hd0,gpt3),那么/boot/xxx.img 就是在第一块硬盘的第三个分区的boot目录下,如果boot是单独的分区,比如是第2块硬盘的第2个分区,那么就是 set root=(hd1,gpt2); linux vmlinuz-linux; 这两行代码来启动一个linux内核了。
几点疑问:
1.grub是如何确定镜像的安装位置的?
如果是bios/mbr启动,那么镜像的安装位置是固定的,boot.img在mbr上,core.img在post-MBR gap上。你只需要在安装时指定哪个盘就可以了,比如:
- grub-install /dev/sda,
它就会安装到第一块盘上。
如果是bios/gpt方式,那么必须要分一个bootable partition(或者叫bios boot,不同分区工具,叫法不一样),这个分区不要格式化任何文件格式,留着就好了,一般1-2M大就可以,镜像就安装在上面。
如果是uefi/gpt方式,那么必须要有一个efi system partition(叫做esp)的专门分区,分区格式是esp,文件系统是flat32。在安装的时候,先把这个分区挂载上,然后用--efi-directory指定一下他的位置,如果它是挂载到/boot/efi上,那么不用指定,grub-install会默认esp在那。uefi安装的示例如下:
- # grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB
- --target指定了系统架构,--bootloader-id指定了grub的efi启动点的名字,到时候你可以在主板设置上看到它。
至于uefi/mbr方式,那种太奇怪了,你不会碰到的。
2.grub-install是在安装grub时,是如何确定prefix的?
你在哪个操作系统上运行它,这个操作系统的/boot/grub所对应的路径就是prefix。比如你的操作系统的boot分区在第1块盘的第3个分区上,那么prefix就是(hd0,gpt3)/grub。这就是网上经常说的默默操作系统去引导啥,比如说Ubuntu系统引导windows,其实就是说启动点是grub,prefix是Ubuntu的/boot/grub。
说句题外话,一个操作系统是不可能引导另一个操作系统的,只有引导器(BootLoader)如grub才能引导操作系统启动,或者uefi可以直接引导操作系统启动。并且,grub还不能直接应道dos(windows)启动,而是先引导windows系统的引导器(如EasyBCD),再让这个引导器去引导windows,这种方式成为链式引导(chainload),比如:
- menuentry 'Windows'{
- insmod part_msdos
- insmod ntfs
- set root='(hd0,msdos1)'
- chainloader +
- }
3.是不是一定要挂载esp分区?
如果你确定不会在去动grub了,那么可以不挂载,efi分区只在你操作引导器的时候才有用,平常它是没有用的。所以看到有些教程说把它挂载到/efi上,有的则是/boot/efi上,甚至有的直接说挂到/boot上这样方便直接启动。其实都可以,挂载到不同位置,只影响你grub-install的操作结果,操作过后,他就没用了。
4.linux内核是如何确定文件挂载树的?我能不能把/etc也搞到一个单独的分区上?
有人会说有/etc/fstab,对,没错,但是,内核启动的时候,它首先得知道/etc在那个盘对吧?不然它怎么知道到fstab呀。看来这就是个先有鸡还是先有蛋的问题,怎么解决呢?
如果你仔细看上面的grub.cfg,你就会发现,在启动Linux内核的语句中有许多参数,比如这句: linux (loop0)/boot/x86_64/loader/linux root=live:CDLABEL=openSUSE_Leap_15.0_KDE_Live iso-scan/filename=/grub/linux/openSUSE-Leap-KDE-Live.iso systemd.wants=sshd.service lang=zh_CN ,有一个root=xxx,这就是指定了root参数,所以就能知道/在哪,也就知道了/etc在哪。所以,一般来说你的/etc是不能挂载到单独的盘的,除非你自己编译一下内核,加入一个etc=xxx之内的参数,在运行linux命令的适合指定这个etc的盘,这样你就可以把etc单独搞到别的盘了,但一般没有人有这么蛋疼的需求。如果你一定要这么做,可以参考一下这个老哥《Moving /etc to separate partition》。
grub2配置关键(三个核心变量prefix、root、cmdpath)和几点疑问的更多相关文章
- Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell
[环境配置的原因] 在windows系统下,很多软件的安装都需要设置环境变量,比如安装JAVA JDK.如果不安装环境变量,在非软件安装的目录下运行javac命令,将会报告"找不到文件&qu ...
- java基础(一):我对java的三个环境变量的简单理解和配置
首先说说java的三个环境变量:java_home,classpath,path java_home:jdk的安装路径[你一层一层点开安装路径,直到当前目录有一个bin目录,然后在地址栏里面右键单击复 ...
- hadoop的安装和配置(三)完全分布式模式
博主会用三篇文章为大家详细说明hadoop的三种模式: 本地模式 伪分布模式 完全分布模式 完全分布式模式: 前面已经说了本地模式和伪分布模式,这两种在hadoop的应用中并不用于实际,因为几乎没人会 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Laravel教程 三:视图变量传递和Blade
Laravel教程 三:视图变量传递和Blade 此文章为原创文章,未经同意,禁止转载. Blade 上一篇我们简单地说了Router,Views和Controllers的工作流程,这一次我就按照上一 ...
- android的消息处理有三个核心类:Looper,Handler和Message。
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- JAVA中常用需要设置的三个环境变量(JAVA_HOME、CLASSPATH、PATH)
JAVA中常用需要设置的三个环境变量: JAVA_HOME.CLASSPATH.PATH (一) 配置环境变量:(相对路径) 1. JAVA_HOME=x:/jdk1.6.0 2. 用%JAVA_HO ...
随机推荐
- Mybatis 模糊查询 like【笔记】Could not set parameters for mapping
当使用mybatis 做模糊查询时如果这样写 会报 Could not set parameters for mapping: ParameterMapping{property='keywords' ...
- 使用dockerfile文件创建镜像时docker build没有反应
问题: 先 docker pull centos:7 拉取了一个官方的基础镜像,为后续创建jdk8镜像做准备,在创建如下的dockerfile文件 执行docker build -t jdk_8u19 ...
- asp.net 错误页面自定义
在我们上网浏览信息的时候,总会有出现404页面的时候,在我们开发的时候也可以自定义这些页面.刚回这次项目中也使用到了,就在网上找到一些方法,今天就把这些方法重新写一遍加深记忆. 在项目的web.con ...
- 部署网络存储ISCSI
1.什么是ISCSIInternet Small Computer System Interface 互联网小型计算机接口技术,是一种将SCS存储与以太网技术相结合,可以用来在互联网中传输SCSI接口 ...
- kolla-ansible 重新部署 ceph 遇到的问题
问题 TASK [ceph : Fetching Ceph keyrings] ******************************************* fatal: [controll ...
- php—Smarty-2
一.注释 *注释内容* Html注释显示客户端源文件中 Smarty注释不会发给客户端 Smarty的注释主要给模板设计者来看的 二.模板中的变量 l 由php文件分配 1) 普通变量 2) 数 ...
- 常用类(日期时间格式转换,date,枚举)
1 常用类 1.1 日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms ...
- abstract方法必须在abstract类中 这句话是对的还是错的?
对 参考文章:https://zhidao.baidu.com/question/435526297.html interface中所有的方法都是抽象的,抽象类中部分方法是抽象的 实现interfac ...
- TPshop商城 Getshell后门文件分析与复现
本文作者:i春秋签约作家——Laimooc 官网地址:http://www.tp-shop.cn/ 影响版本:TPSHOP v2.0.0 后门文件:eval-stdin.php 内容: <?ph ...
- 【bug】—— IE8 ajax 报错:no transport
如题,我使用$.ajax()方法请求数据,在现代浏览器中工作正常,但在 IE 8 下,会有报错:no transport 从 stackoverflow 中获知,出现这个问题是因为** IE 8 不支 ...