linux-系统启动流程-7
1,BIOS开机自检,检查cpu硬件及开机启动顺序,查找第一个磁盘磁头的MBR信息并加载BOOtloader,然后将控制权交与bootloader
2, GRUB
GRUB(Grand Unified Bootloader),多系统启动程序
stage1 : 查找加载stage 1.5
stage1.5: 可以识别文件系统, 即识别 /boot/ 磁盘第一个分区
stage 2: grub 识别/boot/grub/grub.conf ,根据配置文件,读取Kernel 信息,然后加载kernel 同时stage2也将initrd (Initial RAM Disk) 包含了磁盘的驱动程序,) 拷贝到内存,内核解压后,从该临时文件系统中加载驱动,识别根文件系统,根据 /etc/fstab 挂载文件系统 ,然后内核切根,随后执行第一个进程 init
内核解压后同时解压initramfs微型文件系统,通过此文件系统,内核获取磁盘的驱动程序,并驱动所有的硬件外设,读取磁盘后将文件系统根
切换到该磁盘文件系统下,通过/etc/fstab挂载所有文件系统。然后执行核心init 程序,根据/etc/inittab,执行脚本
系统进程
在内核加载完毕,并完成硬件检测与驱动程序加载后,主机硬件已经准备完毕,内核会主动呼叫第一个进程,也就是 /sbin/init
CentOS 5.x 系统相比也有较大变化。在 CentOS 5.x 系统中,主要通过 init 进程的配置文件 /etc/inittab 来设定系统,并启动 Linux。但是在 CentOS 6.x 系统中,由于用 Upstart 启动服务来替换以前的 init,所以在 /etc/inittab 配置文件中只能定义系统的默认运行级别,而其他的功能是靠 /etc/init/ 目录中的其他配置文件实现的
stage2:
开机启动的时候看到的Grub选项、信息,还有修改GRUB背景等功能都是stage2提供的,stage2会去读入/boot/grub/grub.conf或者menu.lst等配置文件
4.读取grub.conf文件
读取grub.conf文件以确定内核启动的参数,准备启动内核
5.启动内核
加载内核,核心开始解压缩,启动一些最核心的程序。
因为为了让内核足够轻小,硬件驱动并没有放在内核文件里面,我们可以看到内核很小,才4M左右,我们可以想象Windows中的驱动,安装系统时候还需要使用驱动软件下载好长时间呢
因此需要使用/initramfs-2.6.32-696.el6.x86_64.img来驱动硬件
6.加载伪文件系统(ramdisk),
内核已将启动起来了,再调用ramdisk文件,尝试驱动所有的硬件设备,到这一步,内核起来了,所有驱动也装上了,因此后面的启动就可以交给程序了
7.启动init进程
grub中默认指定init=/sbin/init程序,可以在grub.conf中kernel行自定义执行程序init=/bin/bash,此时可以绕过下面步骤直接进入bash界面。
内核源代码文件中显示996行左右,规定了init启动的顺序,/sbin/init->/etc/init->/bin/init->/bin/sh,/bin/bash没有写,应该是和/bin/sh一样吧
(1)读取/etc/inittab文件
inittab文件里面定义了系统默认运行级别,这一步做了一些工作如下:
a)初始运行级别(RUN LEVEL)
b)系统初始化脚本
c)对应运行级别的脚本目录
d)定义UPS电源终端/恢复脚本
e)在虚拟控制台生成getty,以生成终端
f)在运行级别5初始化X
(2)执行/etc/rc.d/rc.sysinit程序
系统初始化一些脚本,主要完成以下工作
a)设置主机名
b)设置欢迎信息
c)激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以关闭selinux
d)挂载/etc/fstab文件中定义的文件系统
e)检测根文件系统,并以读写方式重新挂载根文件系统
f)设置系统时钟
g)激活swap设备
h)根据/etc/sysctl.conf文件设置内核参数
i)激活lvm及software raid设备
j)加载额外设备的驱动程序
k)清理操作
(3)/etc/rc#.d/文件(各种服务)
里面定义的是各种服务的启动脚本,可以ls查看,S开头代表开机启动的服务,K开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,共7个运行级别,这里就不多说了
(4)/etc/rc.d/rc.local文件
这里面可以自定义开机启动的命令。
8.执行/bin/login
执行/bin/login程序,等待用户登录
CentOS7启动流程
CentOS7和CentOS6启动流程差不多,只不过到init程序时候,改为了systemd,因此详细解释一下systemd后的启动流程
1.uefi或BIOS初始化,开始post开机自检
2.加载mbr到内存
3.GRUB阶段
4.加载内核和inintamfs模块
5.内核开始初始化,使用systemd来代替centos6以前的init程序
(1)执行initrd.target
包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了
(2)从initramfs根文件系统切换到磁盘根目录
(3)systemd执行默认target配置
centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软连接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
(4)systemd执行sysinit.target
有没有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系统及basic.target准备操作系统
(5)systemd启动multi-user.target下的本机与服务器服务
(6)systemd执行multi-user.target下的/etc/rc.d/rc.local
6.Systemd执行multi-user.target下的getty.target及登录服务
getty.target我们也眼熟,它是启动终端的systemd对象。如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序
7.systemd执行graphical需要的服务
CentOS6,7启动区别
系统启动和服务器守护进程管理器,它不同于centos5的Sysv init,centos6的Upstart(Ubuntu制作出来),systemd是由Redhat的一个员工首先提出来的,它在内核启动后,服务什么的全都被systemd接管,kernel只是用来管理硬件资源,相当于内核被架空了,因此linus很不满意Redhat这种做法。
系统启动流程实验
centos 6 grub.conf
grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=f2230c8f-30fb-4c8a-b7c9-a08f0e42bf7b rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img
1,/boot/grub.conf 被破环的显示图
内核及initrd 后 tab出来的选项
root(hd0,0) 指boot分区,root=/dev/sda2 指根分区
进入后创建/boot/grub/grub.conf
default=0
timeout=5
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/sda2
initrd /initramfs-2.6.32-754.el6.x86_64.img
没有配置 root =/dev/sda2时报错如下
进入救援模式后
chroot /mnt/sysimage
grub-install --root-directory=/ /dev/sda
创建/boot/grub/grub.conf
default=0
timeout=3
title centos6
root (hd0,0)
kernel /vmlinuz-------- root=/dev/sda2
initrd /initramfs ----
2,破环了mbr 446 字节
dd if=/dev/zero of=/dev/sda bs=1 count=446
现象
还可以看见分区表 且可以挂载到 /mnt/sysimage
chroot /mnt/sysimage
grub-install /dev/sda
sync
sync 数据写入磁盘
退出重启
3,删除掉 /boot/initramfs-·内核版本号·
现象
可以显示grub内核列表,但是回车后无法进入下一项,光标在左上角一直闪烁,不能进入centoes 6logo 界面
救援光盘进入bash
切根 chroot /mnt/sysimage
生成 initramfs.img
mkinitrd /boot/initramfs-uname -r
.img uname -r
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
/boot/vmlinuz--
可以看到grub可以识别grub.conf
但是不能正常载入内核,
无法载入内核报错
救援模式进入系统,挂载光盘
进入镜像目录,复制vmlinuz 为 vmlinuz-uname -r
与/boot/grub/grub.conf 里kernel 保持一致
或者通过挂载光盘使用rpm强制安装内核生成
rpm -ivh --force kernel-2.6.32-71.el6.x86_64.rpm
https://www.ibm.com/developerworks/cn/linux/l-cn-disa-recov/
CentOS6启动流程
1.加载BIOS的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.核心执行init程序,并获取默认的运行信息
5.init程序执行/etc/rc.d/rc.sysinit文件
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(scripts)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login程序,等待用户登录
10.登录之后开始以Shell控制主机
内核
核心文件
未压缩的内核镜像 :/boot/vmlinuz-version-release
内核镜像可以挂载光盘,在iso中获取
RAMDISK 辅助的伪根系统
在stage-2阶段被读取进内存,被内核解压释放后暂时挂载,
内核读取硬件驱动文件后,识别系统磁盘,进而挂载真实文件系统,然后切换根到
真实的根上。
CentOS 5 /boot/initrd-VERSION-release.img
CentOS 6,7 /boot/initramfs-VERSION-release.img
可以使用工具生成
mkinitrd
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
CentOS 5 的inittab文件
init 初始化
init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
CentOS 6 的inittab文件
/etc/rc.d/rc.sysinit: 系统初始化脚本
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
centos 7
CentOS 7
引导顺序UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/system/default.target
systemd执行sysinit.target初始化系统及basic.target准备操作系
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
systemd执行graphical需要的
6破解
grub 菜单------e ------修改内核 加 1 进入单用户模式
7破解口令
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabe
lexit
reboot
方法2
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
按ctrl-x启动
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
修复grub2
GRUB“the Grand Unified Bootloader”
引导提示时可以使用命令行界面可从文件系统引导
主要配置文件 /boot/grub2/grub.cfg
修复配置文件grub2-mkconfig -o /boot/grub2/grub.cfg
修复grub
grub2-install /dev/sda BIOS环境
grub2-install UEFI环境
调整默认启动内核
vim /etc/default/grub
GRUB_DEFAULT=0
或者
grub2-set-default "CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)"
查看是否修改成功
grub2-editenv list
自制Linux系统
添加新硬盘,扫描新增磁盘
echo "- - -" /sys/
1,创建分区文件系统
fdisk /dev/sdb分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
挂载boot
mkdir /mnt/boot 子目录必须为boot
mount /dev/sdb1 /mnt/boot
然后安装grub
grub-install --root-directory=/mnt /dev/sdb
####################
确定busybox 复制在/dev/sdb1 中而不是/dev/sdb2
2,恢复内核及initramfs
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot
建立grub.conf
vim /mnt/boot/grub/grub.conf
title wanglinux
root (hd0,0)kernel
/vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash initrd
/initramfs-2.6.32-642.el6.x86_64.img
配置文件内核名称与目录中文件保持一致
3,创建一级目录,复制相关命令至指定目录
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –pv
/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
复制相关命令及库文件
ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid
ldd which swapon
判断链接库文件,复制到相应目录
如果需要使用网路功能,还需要复制驱动程序e1000
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
/mnt/sysroot/lib/
查看网卡驱动
ethtool -i eth0
modinfo e1000 查看驱动位置,复制网卡驱动
insmod e1000.ko 加载驱动模块
开机启动具有加载模块功能
############
使用脚本复制动态链接库文件至相关目录中,驱动模块一并复制进去
############
复制动态链接库脚本
如果有该命令就且存在目标目录,复制命令和动态链接库至指定目录
which --skip-alias mv 跳过别名
#!/bin/bash
bincopy(){
if which $1 &> /dev/null ;then
local bin_cmd=`which --skip-alias $1`
local dir_cmd=`dirname $bin_cmd `
[ -d ${chroot}${dir_cmd} ] || mkdir -pv ${chroot}${dir_cmd}
[ -f ${chroot}${bin_cmd} ] || { cp $bin_cmd ${chroot}${dir_cmd}; action
"cp $bin_cmd ${chroot}${dir_cmd}" ; }
return 0
else
echo "$1 is not found"
return 1
fi
}
libcopy(){
ldd $(which --skip-alias $1)|grep -Eo "/[^[:space:]]+" |while read line ;do
local lib_dir=`dirname $line`
[ -d ${chroot}${lib_dir} ] || mkdir -pv ${chroot}${lib_dir}
[ -f ${chroot}${line} ] || { cp $line ${chroot}${lib_dir}; action "cp
$line ${chroot}${lib_dir}" ; }
done
}
source /etc/init.d/functions
chroot=/mnt/sysroot
[ -d $chroot ] || mkdir -pv $chroot
while : ;do
read -p "please input a command you want to copy:" cmd
[[ $cmd =~ ^q(uit)?$ ]] && break
bincopy $cmd
if [ $? -eq 0 ]; then
libcopy $cmd
fi
done
内核模块编译
lsmod | grep xfs
显示由核心装载的模块 内容来自 /proc/modules
需要写模块路径,不能解决依赖关系
depmod
insmod 指定模块文件,不自动解决依赖模块
insmod `modinfo –n exportfs`
modprobe -r 装载模块
modinfo [ -k kernel ] [ modulename|filename... ]
-n:只显示模块文件路径
-p:显示模块参数-
a:作者
-d:描述
编译内核
前提:获取目标主机硬件设备信息,系统信息,开发环境准备
目标主机硬件设备相关信息
cpu
cat /proc/cpuinfo
x86info -a
lscpu
硬件设备
lspci
-v
-vv
lsusb
-v
-vv
lsblk
hal-device:CentOS 6
编译系统
安装开发包组
下载源码文件
.config:准备文本配置文件
make menuconfig:配置内核选项
make [-j #] (选择相应的功能)
make modules_install:安装模块
make install :安装内核相关文件
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
部分编译内核
编译内核的一部分功能:
(a) 只编译某子目录中的相关代码
cd /usr/src/linux
make dir/
(b) 只编译一个特定的模块
cd /usr/src/linux
make dir/file.ko
示例:只为e1000编译驱动:
make drivers/net/ethernet/intel/e1000/e1000.ko
示例
tar xf linux-3.10.67.tar.xz -C /usr/src
cd /usr/src
ln -sv linux-3.10.67 linux
cd /usr/src/linux
cp /boot/config-$(uname -r) ./.config
make help
make menuconfig
make -j 2
make modules_install
make install
reboot
busybox 编译
centos 6 没有编译成功 centos7 成功,可以在6 中使用
编译安装busybox
环境
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel libmcrypt-devel glibc-static ncurses-devel
下载源代码
wget https://busybox.net/downloads/busybox-1.30.0.tar.bz2
make menuconfig
按下面选择,把busybox编译也静态二进制、不用共享库
Busybox Settings -->Build Options -->[*] Build BusyBox as a static binary (no shared libs)
make && make install 如果出错,执行make clean后,重新执行上面命令
mkdir /mnt/sysroot/
cp -a _install/* /mnt/sysroot/
_install 目录文件中存放有软连接
面试
查看加载模块
lsmod modinfo modprobe
开机启动文件 /etc/rc.d/
引导加载程序 LILO GRUB
开机启动流程
查看BIOS版本 biosdecode
查看服务器型号: dmidecode | grep 'Product Name'
查看主板的序列号: dmidecode |grep 'Serial Number'
ethtool -i eth0
内核参数处理
sysctl -a 显示当前所有可用的内核参数
sysctl kernel.hostname 读特定的内核参数,比如kernel.hostname
sysctl -w kernel.hostname=abc 把hostname改为abc
linux 系统运行级别
0: 系统停机(关机)模式,系统默认运行级别不能设置为0,否则不能正常启动,一开机就自动关机。
1:单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
2:多用户模式,没有NFS网络支持。
3:完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。
4:系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5:图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6:重启模式,默认运行级别不能设为6,否则不能正常启动,就会一直开机重启开机重启。
/etc/rc.d/rc.local 写入此文件的命令登陆前自动执行
系统关机及重启
shutdown -h 10 自动关机
-r 10 自动重启
centos 6 设置grub密码
vim /boot/grub.conf
default=0
timeout=8
password centos
........
###############
破坏的文件是需要命令进行恢复,即切根后可以执行完整的命令
如果没有命令,需要从光盘进行安装软件
#######
1,破坏stage-1 :mbr破坏掉
切换跟使用grub-install /dev/sda
2,删除vmlinuz和initramfs文件后无法启动
切跟后
mkinitrd /boot/initramfs-`uname -r`.img `uname -r `
cp /mnt/cdrom/isolinux/vmlinuz /boot/vmlinuz-`uname -r`
sync
sync
或
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.e16.x86_64.rpm --root=/mnt/sysimage/ --force
centos 7 编译安装的服务配置service 服务脚本
linux-系统启动流程-7的更多相关文章
- linux基础-附件1 linux系统启动流程
附件1 linux系统启动流程 最初始阶段当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主 ...
- Linux系统启动流程及安装命令行版本
Debian安装 之前也安装过很多次linux不同版本的系统,但安装后都是直接带有桌面开发环境的版本,直接可以使用,正好最近项目不是很忙,想一直了解下Linux的整个启动流程,以及如何从命令行模式系统 ...
- 【转载】Linux系统启动流程
原文:Linux系统启动流程 POST(Power On Self Test/上电自检)-->BootLoader(MBR)-->Kernel(硬件探测.加载驱动.挂载根文件系统./sbi ...
- Linux系统启动流程及grub重建(1)
日志系统 Linux系统启动流程 PC: OS(Linux) POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel--& ...
- Linux 入门记录:十八、Linux 系统启动流程 + 单用户修改 root 密码 + GRUB 加密
一.系统启动流程 一般来说,Linux 系统的启动流程是这样的: 1. 开机之后,位于计算机主板 ROM 芯片上的 BIOS 被最先读取,在进行硬件和内存的校验以及 CPU 的自检没有异常后, BIO ...
- Linux系统启动流程(重要!)
Linux系统启动流程 从上至下为: BIOS MBR:Boot Code 执行引导程序-GRUB(操作系统) 加载内核 执行init run level 1.BIOS(Basic Input ...
- Linux系统启动流程分析
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...
- linux 系统启动流程
原著资料网址:http://wenku.baidu.com/view/414127fdf705cc1755270997.html (版权归原作者所有) Linux系统的启动分5个阶段,每个阶段都完成不 ...
- [ 总结 ] Linux系统启动流程
Linux系统启动过程分析: 按下电源 --> BIOS自检 --> 系统引导(lilo/grub) --> 启动内核 --> 初始化系统 --> 用户登录 1. BIO ...
- Linux系统启动流程与系统目录
启动流程 # 1,开机BIOS自检 检查一系列的硬件,最后根据启动顺序启动,是硬盘还是光驱等 # 2,MBR引导 读硬盘0柱面0磁道1扇区的前446字节 1扇区=512字节 MBR=4446字节 四个 ...
随机推荐
- SSM项目——乐淘商城话述1.0
乐淘商城 项目介绍 淘淘网上商城是一个综合性的B2C平台,类似京东商城.天猫商城.会员可以在商城浏览商品.下订单,以及参加各种活动.管理员.运营可以在平台后台管理系统中管理商品.订单.会员等.客服可以 ...
- udb
1/ 配置升级 高可用实例创建时默认是 一主一备 所以可以在线升级, 先升级备库 然后升级主库 所以可以在线升级 只是主备切换的时候有闪断会影响20s左右 有单独创建的从库 那就是一主一备 + ...
- AttributeError: 'dict' object has no attribute 'status_code'
前端AJAX请求数据,提示错误:“AttributeError: 'dict' object has no attribute 'status_code'”. 原因:是提示返回对象dict没有“sta ...
- Maven - 配置setting.xml
1.配置本地库路径 <localRepository>C:/fyliu/mvn/repo</localRepository> 2.配置中央仓库 <mirror> & ...
- Java 读取Json文件内容
读取json文件为String类型: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logge ...
- 【校内test】桶哥的问题
(以上题目出自_rqy两年前) #A:桶哥的问题——买桶[链接] [题目描述] 桶哥要买一些全家桶.他有a元钱,而每个桶要花b元钱.他能不能买到c个桶? [输入格式] 一行三个整数a, b, c [输 ...
- QT use of undeclared identifier 'cout'
在QT 5.12中直接使用cout将提示错误如下: 添加库 #include<iostream>,并将cout&end改为std::cout&std::endl 代码如下: ...
- java 线程池 - ThreadPoolExecutor
1. 为什么要用线程池 减少资源的开销 减少了每次创建线程.销毁线程的开销. 提高响应速度 ,每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度. 提高线程的可管理性 ,线 ...
- 在Vue项目中加载krpano全景图
在Vue-cli项目中做krpano全景图编辑器的时候,由于js插件的路径是动态的,做的过程中遇到了加载不到资源的难题,在网上搜索了好久也没找到合适的办法,最后想到了可能是JS加载的问题,于是解决了问 ...
- 11.AutoMapper 之值转换器(Value Transformers)
https://www.jianshu.com/p/b77311546e64 值转换器(Value Transformers) 值转换器应用于单一类型的转换.AutoMapper在分配值之前,会检测该 ...