BIOS(Basic input/output System)基本输入输出系统
大致流程分为:打开电源 ——> POST自检 ——> bios逐一排查设备启动顺序 ——> 如果是硬盘启动,读取硬盘的MBR的BootLoader。
按下电源以后,CPU第一条指令指向bios芯片(ROM只读存储器;一般情况为只读)中的bios程序载入到内存运行。程序运行识别检测各个硬件
如果检测到硬件有问题时:
BIOS程序自检完成后会加载CMOS芯片中(RAM随机存储器)的BIOS设置信息(时间、密码、启动项等)
Boot Sequence(BIOS)为用户设定启动顺序由哪个设备启动计算机,如果硬盘、光驱、USB、U盘等,按照设定的顺序,遍历设备的第0柱面的第0磁道第1个扇区(MBR)。如果发现这个扇区以0XAA55结束,则认为它是一个可引导扇区,进行下一阶段,否则继续遍历,如果都没有BIOS提示没有找到系统。
注:磁盘默认一个扇区512字节。
GRUB是一个启动管理器,和Linux没有强制的关系,当然也可以用GRUB启动Windows。可以通过rpm -qi grub命令查看grub的版本。
这一阶段其实执行的就是系统安装时预先写入到MBR的Bootloader程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,2扇区的内容(/boot/grub/stage1)并执行。
其实Linux的loader为stage1那个文件刚好512字节,我们在安装Linux的时候,系统会把stage1文件安装到所在分区的boot sector中,同时默认Linux启动的话,也需要把stage1中的引导代码安装到MBR中的boot loader中。该文件太小,能完成的功能有限
[root@wzp ~]$ ll /boot/grub/stage1
-rw-r--r--. 1 root root 512 7月 23 08:21 /boot/grub/stage1
这一阶段,使硬件初始化,为Stage2准备RAM空间(内存空间),
读取Stage2到RAM空间(应该涉及到了Stage1.5阶段)。
就是Stage1.5阶段或Stage2阶段的入口,引导进入Stage1.5阶段或Stage2阶段。
另外,这一阶段并没有识别文件系统的能力。
一阶段是Stage1阶段和Stage2阶段的桥梁,具有识别分区文件系统的能力,此后grub程序便有能力去访问/boot/grub/stage2,并将其读取到内存执行。
GRUB在不依赖Linux内核的情况下具有读取配置文件与内核映像的能力”。GRUB的内置文件系统其实是依靠stage1_5那些文件定义的,而且有不同文件系统的stage1_5。我们在安装Linux的时候会把stage1_5相关文件放到0磁道1-62扇区中(一个磁道63个扇区,划分分区是从1磁道开始的,除了MBR外,所以会有62个扇区作为保留扇区),用于定义grub的文件系统。
ll /boot/grub/*stage1_5
-rw-r--r--. 1 root root 13380 7月 /boot/grub/e2fs_stage1_5
-rw-r--r--. 1 root root 12620 7月 /boot/grub/fat_stage1_5
-rw-r--r--. 1 root root 11748 7月 /boot/grub/ffs_stage1_5
-rw-r--r--. 1 root root 11756 7月 /boot/grub/iso9660_stage1_5
-rw-r--r--. 1 root root 13268 7月 /boot/grub/jfs_stage1_5
-rw-r--r--. 1 root root 11956 7月 /boot/grub/minix_stage1_5
-rw-r--r--. 1 root root 14412 7月 /boot/grub/reiserfs_stage1_5
-rw-r--r--. 1 root root 12024 7月 /boot/grub/ufs2_stage1_5
-rw-r--r--. 1 root root 11364 7月 /boot/grub/vstafs_stage1_5
-rw-r--r--. 1 root root 13964 7月 /boot/grub/xfs_stage1_5
这一阶段会(初始化本阶段需要用到的硬件,检测系统的内存映像,)解析grub的配置文件/boot/grub/grub.cnf、menu.list等,根据配置文件加载内核镜像到内存中,通过initrd程序建立虚拟根文件系统,最后调用(转交)内核
[root@wzp ~] cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/vg_wzp-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 //设置默认启动项为第一个内核,1表示第二个
timeout=5 //菜单项等待选项时间为5秒
splashimage=(hd0,0)/grub/splash.xpm.gz //菜单背景图片,这里的hd0,0是第一个硬盘的第一个分区,没有/dev/sd*的概念
hiddenmenu //是否显示选单画面
#这里有时候会有passwrod参数,意思是进入急救模式(单用户模式)的密码是多少,可以是明文密码,可以是加密密码
#例如password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/,这代表进入急救模式的password经过MD5加密,加密密码为$1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/
title CentOS (2.6.32-431.el6.x86_64) //菜单项名称,可以自定义
root (hd0,0) //grub查找stage2文件及kernel文件所在设备分区,grub的根。第一块硬盘的第一个分区
//启动的内核
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_wzp-lv_root rd_NO_LUKS rd_LVM_LV=vg_wzp/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_wzp/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
# 内核文件;读取内核文件之后要挂载/目录,只读,root后跟真正的/目录挂载的分区
# rhgb 表示默认图形显示,把启动过程覆盖掉
# quit表示系统启动时将模块启动的详细信息屏蔽,只显示模块启动时候成功(ok or failed)
initrd /initramfs-2.6.32-431.el6.x86_64.img //内核匹配的ramfs文件,img是镜像文件
boot loader怎么能够做到引导的就是我们想要的操作系统呢?这么多不同的功能单靠一个446字节的boot loader是远远不够的。因此必须弄一个相对应的程序来处理各自对应的操作系统核心文件,这个程序就是操作系统的loader(注意不是MBR中的boot loader),这样一来boot loader只需要将控制权交给对应操作系统的loader,让它负责去启动操作系统就行了。
我们知道一个硬盘的每个分区的第一个扇区叫做boot sector,这个扇区存放的就是操作系统的loader,所以我们常说一个分区只能安装一个操作系统,如上图,第一个分区的boot sector存放着windows的loader,第二个分区放着Linux的loader,第三个第四个由于没有安装操作系统所以空着。
Boot loader的功能:
提供选单就是给用户提供一张选项单,让用户选择进入哪个操作系统;
读取内核文件,我们知道系统会有一个默认启动的操作系统,这个操作系统的loader在所在分区的boot sector有一份,除此之外,也会将这个默认启动的操作系统的loader复制一份到MBR的boot loader中,这样一来MBR就会直接读取boot loader中的loader了,然后就是启动默认的操作系统;
安装windows操作系统的时候,windows会主动复制一份自己的loader到MBR中的boot loader中,这种操作在linux下不会。所以我们安装多重操作系统的时候要求先安装windows,然后再安装Linux;我们假设先安装Linux,再安装windows的时候就会自动把windows的loader复制到MBR中的boot loader,这样一来就会默认优先启动windows。然而先安装windows,自动复制windows的loader到boot loader,再安装Linux的时候,我们可以设置把Linux的loader复制到boot loader中,把原先windows的覆盖掉,这样才能设置Linux默认启动。**
该文件系统在内存中,本质是一个ramfs文件系统。/boot/initramfs-2.6.32-431.el6.x86_64.img
[root@wzp ~] file /boot/initramfs-2.6.32-431.el6.x86_64.img
/boot/initramfs-2.6.32-431.el6.x86_64.img: gzip compressed data, from Unix, last modified: Thu Jul 23 08:20:56 2020, max compression
#发现该文件是一个gzip的压缩文件,gzip解压文件必须以.gz为后缀
[root@wzp ~] cp /boot/initramfs-2.6.32-431.el6.x86_64.img /root/ramfs.gz
[root@wzp ~] gzip -d ramfs.gz
[root@wzp ~] file ramfs
ramfs: ASCII cpio archive (SVR4 with no CRC)
#使用cpio解压
[root@wzp ~] mkdir init
[root@wzp ~] cd init
[root@wzp init] cpio -id < /root/ramfs
91590 块
[root@wzp init] ls
bin dracut-004-335.el6 init initqueue-settled lib64 pre-trigger sbin tmp
cmdline emergency initqueue initqueue-timeout mount pre-udev sys usr
dev etc initqueue-finished lib pre-pivot proc sysroot var
#内容类似于真正/目录下内容,这是因为这是一个最小化的Linux根文件系统。
#内核就是先把这个文件展开,形成一个虚拟文件系统,内核借虚拟文件系统装载必要的模块,完成后释放该虚拟文件系统并挂载真正的根目录。
#!initd的制作
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
dracut /boot/initramfs-$(uname -r).img $(uname -r)
#/etc/inittab文件
[root@wzp ~] cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# System initialization is started by /etc/init/rcS.conf
# Individual runlevels are started by /etc/init/rc.conf
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:
#上述对应为id:runlevel:action:process,即id:运行级别:init的动作行为,initdefault表示默认启动的运行级别:执行动作的指令,一般为脚本
#/etc/rc.d/rc?.d/
[root@wzp ~] ll /etc/rc.d/
总用量 60
drwxr-xr-x. 2 root root 4096 7月 23 08:20 init.d
-rwxr-xr-x. 1 root root 2617 11月 23 2013 rc
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc0.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc1.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc2.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc3.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc4.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc5.d
drwxr-xr-x. 2 root root 4096 7月 23 08:20 rc6.d
-rwxr-xr-x. 1 root root 220 11月 23 2013 rc.local
-rwxr-xr-x. 1 root root 19688 11月 23 2013 rc.sysinit
[root@wzp ~] ll /etc/rc.d/rc3.d/
总用量 0
lrwxrwxrwx. 1 root root 19 7月 23 08:19 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 20 7月 23 08:19 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 21 7月 23 08:19 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 15 7月 23 08:19 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 22 7月 23 08:20 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 19 7月 23 08:19 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 7月 23 08:19 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 7月 23 08:19 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 7月 23 08:20 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 7月 23 08:19 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 20 7月 23 08:19 S22messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 26 7月 23 08:20 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 7月 23 08:19 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 7月 23 08:19 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 14 7月 23 08:20 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 7月 23 08:19 S80postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 15 7月 23 08:19 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 7月 23 08:19 S99local -> ../rc.local
K开头的文件:要停止的服务(脚本),从01开始关闭,数字越小越优先关闭
S开头的文件:要启动的服务(脚本),从01开始启动,数字越小越优先启动
这些文件其实都是软链接,指向的都是/etc/rc.d/init.d/目录下的文件
通过/sbin.mingetty指令启动终端,tty1~tty6
[root@wzp ~] ps aux |grep [t]ty
root 1149 576 tty1 Ss+ /sbin/mingetty /dev/tty1
root 1151 580 tty2 Ss+ /sbin/mingetty /dev/tty2
root 1153 576 tty3 Ss+ /sbin/mingetty /dev/tty3
root 1157 576 tty4 Ss+ /sbin/mingetty /dev/tty4
root 1159 576 tty5 Ss+ /sbin/mingetty /dev/tty5
root 1161 576 tty6 Ss+ /sbin/mingetty /dev/tty6
与centos6差不多
GRUB2没有grub的stage1、stage1.5、stage2的概念,被bootstrap image文件所代替。
大致流程:
/boot/grub2/i386-pc/目录下是GURB2 bootstrap image文件,大部门以.mod结尾,这些事grub2的模块文件
[root@wzp ~] ll /boot/grub2/i386-pc/*.img
-rw-r--r--. 1 root root 512 Jul 26 03:38 /boot/grub2/i386-pc/boot.img
-rw-r--r--. 1 root root 26703 Jul 26 03:38 /boot/grub2/i386-pc/core.img
[root@wzp ~] file /boot/grub2/i386-pc/boot.img
/boot/grub2/i386-pc/boot.img: x86 boot sector; partition 4: ID=0xd4, starthead 205, startsector 4277266767, 0 sectors, code offset 0x63
[root@wzp ~] file /boot/grub2/i386-pc/core.img
/boot/grub2/i386-pc/core.img: data
只有两个.img文件,这两个文件会被grub2-install命令安装到对应的位置上
在PC BIOS系统中,这个image是GRUB2第一个被运行的。它被写在MBR(Master BootRecord)或者在分区(partition)的boot sector中。
因为MBR或PC boot secto是固定512字节,这个文件的大小也固定为512byte,boot.img功能很简单,主要是读磁盘中core.img中的第一个扇区(sector)到内存中并跳到该部分运行(如果是硬盘启动,那么该扇区就是下面要介绍的diskboot.img). 因为只有512字节,boot.img不能够加载文件系统(比如CentOS7中XFS或其它Linux的EXT4等等),并且只能是从硬盘固定的位置加载。
当从硬盘启动的时候这是coreimg第一个扇区sector)的内容, 主要功能是读剩下的core. img到内存中并开始运行kermel img.同样dsbot img没有文件系统的功能XFS、ext4等,当他读取剩余的core. img时候,依然从硬盘固定位置读取,
根据启动的介质不同,类似dkot imng文件有很多,在安装GRUB时候选用其中一个:
这个文件包含了GRUB2基本的运行时支撑:对设备及文件的框架,环境变量,恢复模式下的命令行等等,一般我们不会直接使用它,但是它是core.img中必不可少的一部分。
这个是GRUB的核心。他是被grub2-mkimage命令生成,包含了kernel.imng以及一些必须必要的modules。通常core.img包含了足够的模块(modules)为了访问xfs、ext4文件系统/boot/grub2目录,并且在运行时加载从文件系统xfs所有剩余的模块,这些剩余模块包含启动目录处理,加载操作系统等等功能。
模块化的设计最主要的目的是使core.img保持足够小,目前disk限制core.img安装必须小于32kb,core.img一般被安在硬盘的特殊区域:embedding area(夹层区)这个区一般有32K限制。
所有GRUB其他部分被称为模块,他们大部分被core.img在运行时自动动态加载,其中一小部分被整合到core.img中,这小部分是必须,比如文件系统支持(xfs.mod)
与centos6差不多,加载驱动、切换到真正的根文件系统,区别是初始化程序从init变成了/usr/lib/systemd/systemd
systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的以来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。
与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:
CentOS7中我们的初始化进程变为了systemd。
1、执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。
2、然后执行sysinit.target来初始化系统和basic.target来准备操作系统。
3、接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。
4、最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。
systemd执行sysinit.target
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下面的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
如果有图形化界面再执行graphical图形化需要的服务
注意:
/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。
位置 | 描述 |
---|---|
/usr/lib/systemd/system/ | 存储每个服务的脚本,类似centos6的/etc/init.d/ |
/run/systemd/system | 系统执行过程中产生的脚本 |
/etc/systemd/system | 类似于centos6的/etc/rc.d/rc?.d/Sxx类文件的功能,管理员建立执行脚本,大部分是软连接 |
systemd单元类型 | ||
---|---|---|
单元类型 | 扩展名 | 说明 |
Service | .service | 描述一个系统服务 |
Socket | .socket | 描述一个进程间通信的套接字 |
Device | .device | 描述一个内核识别的设备文件 |
Mount | .mount | 描述一个文件系统的挂载点 |
Automount | .automount | 描述一个文件系统的自动挂载点 |
Swap | .swap | 描述一个内存交换设备或交换文件 |
Path | .path | 描述一个文件系统中文件或目录 |
Timer | .timer | 描述一个定时器(用于实现类似cron的调度任务) |
Snapshot | .snapshot | 用于保存一个systemd的状态 |
Scope | .scope | 使用systemd的总线接口以编程的方式创建外部进程 |
Slice | .slice | 描述居于Cgroup的一组通过层 次组织的管理系统进程 |
Target | .target | 描述组systemd的 单元 |
准备一张图片,支持格式有png、jpg、jpeg、tga,最好选择1024x768的png格式图片,兼容性最好。
[root@wzp ~]# mkdir /boot/grub2/images
#rz上传一张图片
[root@wzp ~]# cd /boot/grub2/images
[root@wzp images]# rz
#a修改配置文件,标红处为修改
[root@wzp images]# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="wzp linux"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_BACKGROUND=/boot/grub2/images/2.png
GRUB_GFXMODE=1440x900,1024x768,640x480
GRUB_CMDLINE_LINUX="crashkernel=rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
#b重新生成grub2.cfg文件,重启即可
[root@wzp images]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@wzp images]# reboot
#a.查看当前的选择菜单有什么
[root@wzp grub2]# awk -F\' '$1=="menuentry " {
print i++ " : " $2}' /boot/grub2/grub.cfg
0 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
1 : CentOS Linux (0-rescue-959fab0bc8d74ad795143b4cdee525c5) 7 (Core)
#b.修改/boot/grub2/grub.cfg
[root@wzp ~]# vim /boot/grub2/grub.cfg
menuentry 'wzp Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class wzp --class gnu-linux --class gnu --class os
menuentry 'wzp Linux (0-rescue-959fab0bc8d74ad795143b4cdee525c5) 7 (Core)' --class wzp --class gnu-linux
#c.其他影响查看系统版本的几个位置
/boot/grub2/grubenv
/etc/os-release #关联启动时进度条位置的名称
/etc/redhat-release
/etc/issue
/etc/motd
/proc/version
#d.修改启动进度条名称
[root@wzp ~]# vim /etc/os-release
PRETTY_NAME="wzp Linux 7 (Core)"
#centos6
#grub加密
[root@wzp ~]# grub-md5-crypt
Password:
Retype password:
$1$SY3F21$FoKaOREdTTS1HzhatnIrg0
[root@wzp ~]# vim /boot/grub/grub.conf
default=0
timeout=5
password --md5 $1$SY3F21$FoKaOREdTTS1HzhatnIrg0
#centos7.1
#grub2加密,is 后面时加密后的密码
[root@wzp ~]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password: PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.497F246861691979B9B7A6E3758A865929ED27D121E913DB7CE825BA8051A6F12C8AFA6A1A497BA87AC2AEEF2FDDC293523114CAC53603B78B6BD790EEE802A7.3E1A2876C499CD9F12A8A634C7D4A18B84F8F0AF69BDB4D9C1E859A1861BB01EA5E34BBF65388CED8F4435C50051C61FBB460E489F1D1E4DA41A5B5984E43F1C
#a.编辑文件,加入加密的密码
[root@wzp ~]# vim /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
set superusers = "root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.497F246861691979B9B7A6E3758A865929ED27D121E913DB7CE825BA8051A6F12C8AFA6A1A497BA87AC2AEEF2FDDC293523114CAC53603B78B6BD790EEE802A7.3E1A2876C499CD9F12A8A634C7D4A18B84F8F0AF69BDB4D9C1E859A1861BB01EA5E34BBF65388CED8F4435C50051C61FBB460E489F1D1E4DA41A5B5984E43F1C
#centos7.2之后可以使用下述方式
[root@wzp ~]# grub2-setpassword
Enter password:
Confirm password:
#a.如果现在重新启动系统并尝试修改引导条目,系统将要求提供凭据,但是可以在没有凭据的情况下修改引导条目。
#b.为了阻止未经授权的修改和未经授权的启动,我们需要对 /boot/grub2/grub.cfg 文件进行更改
#c.打开文件并使用密码搜索需要保护的启动条目,它以menuentry开头。找到条目后,从中删除 --unrestricted 参数
#d.重启验证
文章浏览阅读3k次。没有外部校准模式的校准 从多个图像中估计3D姿势需要校准相机,以达到与目标尺寸相称的精度水平–在测量像果蝇这样小的动物的腿部运动时,这是一个困难的挑战。因此,DeepFly3D没有使用典型的外部校准网格,而是使用苍蝇本身作为校准目标。它检测苍蝇身体上的任意点,并依靠捆绑调整(Chavdarova等人,2018)来同时为这些点分配三维位置,并估计每个摄像头的位置和方向。为了提高鲁棒性,它执行了适用于系留苍蝇的肢体长度和运动范围的几何约束。_动物行为3d模拟算法
文章浏览阅读823次。未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的程序。说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的_未能加载文件或程序集“excelreport”或它的某一个依赖项。试图加载格式不正确的
文章浏览阅读267次。python中的try、except、else、finally用法_try: 语句1 语句x #该语句会产生异常 语句2 except: 语句3 else: 语句4 finally:
文章浏览阅读2.5k次。1、cd xxx/xxxx //进入bag所在路径2、rosbag info xxx.bag //查看rosbag的信息如下图所示:解析数据获得带时间戳的点云数据1、rosrun pcl_ros bag_to_pcd <*.bag> <output_directory>获得带时间戳的图像数据法1如下代码能一次性没有遗漏的解析出全部带有时间戳的图片#coding:utf-8import roslib; import rosbagimport _ros解析bag
文章浏览阅读2.8w次,点赞10次,收藏7次。有很多时候我们想要查看日志文件,发现服务器已经被重启了,然后原来的日志就被打包存起来了,这个时候生成的gz日志文件我们就没有办法直接去查看了。 所以这个时候我们就需要zcat+日志名.gz来查看,还可以用 | grep 来进行筛选自己想要的日志信息。..._根据时间查询.gz中的日志
文章浏览阅读6.9k次,点赞5次,收藏32次。Snort规则学习入门引言从一条简单的snort规则开始alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)snort 每条规则都可以分成逻辑上的两个部分:规则头(header)和规则选项(General Option)从开头到括号前属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option keywords)。如果许多选项组合在一起_snort和mtx规则区别
文章浏览阅读2.7k次。整理的一部分PCI、PCIe基础知识PCI基础知识: 1.PCI总线的组成:HOST桥、PCI桥、PCI设备、 2.PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽 3.总线x1上的通讯和总线x2上的通讯无关,同一条总线上的设备可以自由通讯; 4.如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面 5.PCI的..._pci1x2x
文章浏览阅读2.4k次。简介LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存..._卷和快照
文章浏览阅读1.9k次。HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。HTTP: Status 1xx (临时响应)->表示临时响应并需要请求者继续执行操作的状态代码。详细代码及说明:HTTP: Status 1
文章浏览阅读3k次,点赞3次,收藏46次。TCP(1)-首部格式,序号确认和连接管理一.单选题(共12题,69.6分)1 关于TCP,以下哪一项描述是错误的A、提供面向字节流传输服务B、因为面向字节流,所示实现过程简单C、提供面向连接传输服务D、实现进程间通信正确答案: B首先要明确一点,TCP确实是面向字节流的,物理层是比特流。意思就是说,在网络里,不管是UDP还是TCP,都是面向字节流的,因为他们都以字节传输。但是TCP要比UDP更加复杂,这里不能说它所示实现过程简单,和UDP比复杂多了。TCP是面向连接的,服务给应用层_当 tcp 接收端要确认一个有效载荷大小 是100b和序列号为800 的数据段时,应该
文章浏览阅读1.3w次。作为一名合格的程序员,你必须知道一些计算机软件编程方面的术语。这次给大家解释一下下面两对常见的术语:高级语言/低级语言、解释语言/编译语言。什么是高级语言/低级语言?1、高级语言我们现在大多数人使用的语言,如C、C++、Python、Java、Matlab、LabVIEW等等,都属于高级语言,相对于低级语言,它更接近于我们平时正常的人思维,其最大的特点是编写容易,代码可读性好。实现同样的功能,使用..._python属于高级语言吗
文章浏览阅读1.5k次。Button----按钮ImageButton----图片按钮 共有特征:都可以作为一个按钮产生点击事件不同点1、 Button有text的属性,ImageButton没有2、 ImageButton有src属性,Button没有onClick事件Button和ImageButton都有一个onClick事件通过他们自身的.setOnClickListener(_下列说法错误的是a button和imagebutton都可以实现按钮功能b button没有src属