linux系统故障(一)之grub恢复

2023-05-16

linux系统故障(一)之grub恢复

前言

1.什么是linux系统故障?

2.什么是grub?

3.grub坏了我们怎么恢复?

4.grub恢复的具体方法?

实验环境

本次实验由于需要多次重启虚拟机,我们就不选择用xshell远程连接了。

VMware Workstation

centos7

1.什么是linux系统故障?

https://baike.baidu.com/item/LINUX%E7%B3%BB%E7%BB%9F%E6%95%85%E9%9A%9C%E8%AF%8A%E6%96%AD%E4%B8%8E%E6%8E%92%E9%99%A4/7044754?fr=aladdin

2.什么是grub?

GRUB

GNU GRUB是一个非常强大的引导加载程序,是计算机启动时运行的第一个程序,它负责将控制加载转移到操作系统内核软件。

GRUB起源于1995年,当时Erich Boleyn试图用犹他大学的Mach 4微内核(现在称为GNU Mach)启动GNU Hurd。埃里希和布莱恩·福特设计了多重引导规范,因为他们决定不加入大量的互不兼容的PC的启动方式。

在接下来的几年里,GRUB被扩展以满足许多需求,但很快就发现它的设计没有跟上它所做的扩展,我们已经达到了如果没有进行任何进一步改变就很难破坏现有功能。

GRUB2

大约在2002年,Yoshinori K. Okuji开始研究PUPA(GNU GRUB的初步通用编程架构),旨在重写GRUB的核心,使其更清洁,更安全,更强大,更强大。

PUPA最终被重命名为GRUB 2,GRUB的原始版本被重命名为GRUB Legacy。

GRUB Legacy继续进行少量维护,但最后一个版本(0.97)是在2005年完成的,在撰写本文时,似乎不太可能会有另一个版本。

到2007年左右,GNU / Linux发行版开始将GRUB 2用于有限的范围,到2009年底,默认情况下会安装多个主要发行版。

GRUB功能

GRUB主要实现目标:

1、对用户来说,基本功能要简单明了;

2、功能丰富,要支持内核的各种参数定制配置;

3、用于启动FreeBSD,NetBSD,OpenBSD和Linux的向后兼容性。通过链加载功能支持专有内核(如DOS,Windows NT和OS / 2)。

除了特定的兼容模式(链式加载和Linux 搭载格式)之外,所有内核都将以与多引导规范中相同的状态启动。

GRUB具有以下功能:

1、识别多种可执行格式:支持许多a.out变体和ELF。符号表也会加载。

2、支持非多引导内核:支持许多缺少多引导兼容性的免费32位内核(主要是FreeBSD,NetBSD 2,OpenBSD和Linux)。还支持其他引导加载程序的链加载。

3、加载多个模块:完全支持加载多个模块的多重引导功能。

4、加载配置文件:支持具有预设引导命令的人类可读文本配置文件。您还可以动态加载另一个配置文件,并将预设配置文件嵌入GRUB映像文件中。命令列表(请参阅命令)是命令行支持的超集。一个示例配置文件中提供 的配置。

5、提供菜单界面:可以使用菜单界面列出具有可编程超时的预设引导命令。引导条目的数量没有固定限制,当前实现有几百个空间。

6、拥有灵活的命令行界面:可从菜单访问的相当灵活的命令行界面可用于编辑任何预设命令,或从头开始编写新的启动命令集。如果没有配置文件,GRUB将退回到命令行;命令列表是配置文件支持的子集。编辑命令非常类似于bash命令行(见命令行编辑在bash特性),用TAB命令,设备,分区和文件的完井中根据上下文的目录。

7、支持多种文件系统类型:透明地支持多种文件系统类型,以及有用的显示阻止列表表示法。目前支持的文件系统类型是Amiga Fast FileSystem(AFFS),AtheOS fs,BeFS, BtrFS(包括raid0,raid1,raid10,gzip和lzo), cpio(小端和大端bin,odc和newc变体), Linux ext2 / ext3 / ext4,DOS FAT12 / FAT16 / FAT32,exFAT,HFS, HFS +,ISO9660(包括Joliet,Rock-ridge和多块文件), JFS,Minix fs(版本1,2和3),nilfs2, NTFS(包括压缩),ReiserFS,ROMFS, Amiga智能文件系统(SFS),Squash4,tar,UDF, BSD UFS / UFS2,XFS和ZFS(包括lzjb,gzip,zle,镜像,条带,raidz1 / 2/3和加密)在AES-CCM和AES-GCM中)。

8、支持自动减压:可以解压缩gzip或 xz3压缩的文件。该功能对用户来说是自动且透明的(即所有功能都对指定文件的未压缩内容进行操作)。这大大减少了文件大小和加载时间,对于软盘来说是一个特别大的好处。某些内核模块应该以压缩状态加载,因此可以指定不同的模块加载命令以避免解压缩模块。

9、访问任何已安装设备上的数据:支持从BIOS识别的任何或所有软盘或硬盘读取数据,与根设备的设置无关。

10、独立于驱动器几何转换:与许多其他引导加载程序不同,GRUB使特定的驱动器转换无关紧要。安装并运行一个转换的驱动器可以转换为另一个转换,而不会对GRUB的配置产生任何不利影响或更改。

11、检测所有已安装的RAM:GRUB通常可以在PC兼容的机器上找到所有已安装的RAM。它使用先进的BIOS查询技术来查找所有内存区域。由于在多重引导规范(见描述动机在多重引导规范),不是所有的内核利用这些信息,但是GRUB提供它那些谁做。

12、支持逻辑块地址模式:在传统的磁盘调用(称为CHS模式)中,存在几何转换问题,即BIOS无法访问1024个柱面,因此可访问空间限制为至少508 MB且最多为8 GB。GRUB不能普遍解决这个问题,因为所有机器都没有使用标准接口。但是,一些较新的机器具有新的接口,即逻辑块地址(LBA)模式。GRUB会自动检测LBA模式是否可用,并在可用时使用它。在LBA模式下,GRUB可以访问整个磁盘。

13、支持网络启动:GRUB基本上是基于磁盘的引导加载程序,但也具有网络支持。您可以使用TFTP 协议从网络加载操作系统映像。

14、支持远程终端:为了支持没有控制台的计算机,GRUB提供远程终端支持,以便您可以从远程主机控制GRUB。目前仅实现串行终端支持。

GRUB2改进

1、在GRUB可以手动直接编辑/boot/grub/menu.lst文件,来编辑启动文件;在GRUB2中有一个grub的配置文件/etc/default/grub,编辑对应的选项再使用grub-mkconfig来生成grub.cfg文件。

2、GRUB2引导菜单启动项是从/boot自动生成的,不是有menu.lst配置的。

3、分区编号发生变化:第一个分区现在是1而不是0,但第一个设备仍然以0开始计数,如hd0。

4、界面的定制更加灵活,在GRUB2有主题支持。

5、自动搜索可用的内核和硬盘中的可用系统。

3.grub坏了我们怎么恢复?

首先,当grub坏了的时候,我们重启虚拟机,会发现进入到grub>这个界面,这个界面是告诉我们我们可以手写grub的启动配置文件,这是方法一。然后就是我们今天的实验了,从启动菜单中通过镜像来重写grub里面的配置文件,这是方法二。

4.grub恢复的具体方法?

首先我们来说一下方法一:

方法一:

在虚拟机完好的时候,我们找到grub2里面,查看里面的grub.cfg文件

[root@localhost ~]# cat /boot/grub2/grub.cfg

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  1592aaf3-4910-4fca-baaa-53d8eb1e6262
	else
	  search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
	fi
	linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
	initrd16 /initramfs-3.10.0-693.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-39f75f8b9d404d8eb776a1608f548431) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-39f75f8b9d404d8eb776a1608f548431-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
	load_video
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  1592aaf3-4910-4fca-baaa-53d8eb1e6262
	else
	  search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
	fi
	linux16 /vmlinuz-0-rescue-39f75f8b9d404d8eb776a1608f548431 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
	initrd16 /initramfs-0-rescue-39f75f8b9d404d8eb776a1608f548431.img
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

然后,我们删除这个文件并重启。

[root@localhost ~]# rm -rf /boot/grub2/grub.cfg
[root@localhost ~]# init 6

重启后,我们会发现这种情况。

在这里插入图片描述

这个是什么意思?这个的意思就是让我们手写grub的启动菜单(个人建议:非大佬不要尝试)

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
set pager=1

if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

terminal_output console
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
set tuned_initrd=""
### END /etc/grub.d/00_tuned ###

### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
  source ${prefix}/user.cfg
  if [ -n "${GRUB2_PASSWORD}" ]; then
    set superusers="root"
    export superusers
    password_pbkdf2 root ${GRUB2_PASSWORD}
  fi
fi
### END /etc/grub.d/01_users ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  1592aaf3-4910-4fca-baaa-53d8eb1e6262
	else
	  search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
	fi
	linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
	initrd16 /initramfs-3.10.0-693.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-39f75f8b9d404d8eb776a1608f548431) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-39f75f8b9d404d8eb776a1608f548431-advanced-5cfaac82-4194-4195-af05-7d40616118b7' {
	load_video
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1'  1592aaf3-4910-4fca-baaa-53d8eb1e6262
	else
	  search --no-floppy --fs-uuid --set=root 1592aaf3-4910-4fca-baaa-53d8eb1e6262
	fi
	linux16 /vmlinuz-0-rescue-39f75f8b9d404d8eb776a1608f548431 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
	initrd16 /initramfs-0-rescue-39f75f8b9d404d8eb776a1608f548431.img
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# 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.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

输完重启即可。(这是小编复制原来的文件,非手打)

方法二:

重建grub分区

刚刚那个界面我们重新启动,这个时候我们要眼疾手快,在出现加载进度条的时候,按“ESC”。

在这里插入图片描述

我们选择第三个,进入到我们刚装系统的界面,选择最下面的那个。

在这里插入图片描述

然后我们选择第三个,进入命令模式。

在这里插入图片描述

选择1去连接

在这里插入图片描述

第一步,引导急救模式,加载系统镜像。

chroot /mnt/sysimage/

第二步,重新建立加载sda分区。

grub2-install /dev/sda

第三步,重新构建grup菜单配置文件。

grub2-mkconfig -o /boot/grub2/grub.cfg

第四步,退出bash环境。

exit

第五步,重启。

reboot

三个,进入到我们刚装系统的界面,选择最下面的那个。

[外链图片转存中…(img-za0HsFQB-1573782133754)]

然后我们选择第三个,进入命令模式。

[外链图片转存中…(img-UB1FzFDf-1573782133755)]

选择1去连接

[外链图片转存中…(img-0jTEH26f-1573782133756)]

第一步,引导急救模式,加载系统镜像。

chroot /mnt/sysimage/

第二步,重新建立加载sda分区。

grub2-install /dev/sda

第三步,重新构建grup菜单配置文件。

grub2-mkconfig -o /boot/grub2/grub.cfg

第四步,退出bash环境。

exit

第五步,重启。

reboot
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux系统故障(一)之grub恢复 的相关文章

  • 【程序员面试宝典】栈的应用

    1 下一个较大元素 现在我们有一个int数组 xff0c 请你找出数组中每个元素的下一个比它大的元素 给定一个int数组A及数组的大小n xff0c 请返回一个int数组 xff0c 代表每个元素比他大的下一个元素 若不存在则为 1 保证数
  • time_wait与面试的暧昧

    背景知识 TCP三次握手与四次挥手 http blog csdn net double happiness article details 70160738 time wait是什么 xff1f 通过上面三次握手和四次挥手的学习 xff0c
  • 【通信方式五】socket编程之TCP通信

    1 网络字节序 网络字节序就是熟知的关于大小端的问题 xff0c 关于前面的大小端的判断方法 xff0c 以及代码实现再此就不在赘述 xff0c 下面只谈网络中的字节序问题 xff08 如何判定当前机器的大小端 xff1a http blo
  • 【通信方式六】socket编程之UDP通信

    相关博客 通信方式五 socket编程之TCP http blog csdn net double happiness article details 74938008 由于TCP协议是可靠的面向连接的协议 xff0c 因此在服务器端需要执
  • shell下的第一个编程(不一样的1到100累加)

    相信对于一个程序 猿 来说 xff0c 除了我们入门的 hello world 之外 xff0c 最简单的代码就是只有从1累加到100这样简单的程序吧 xff0c 没错这样的程序在现在来看或许根本不如我们的法眼 xff0c 那么问题来了 x
  • 【每日一题-1】有序链表合并与累加和问题

    基础题 合并两个有序链表 xff0c 合并以后的链表依旧有序 思路 xff1a xff08 1 xff09 特殊情况处理 xff1a 若两个链表都为则返回空 xff0c 若其中一个链表为空返回另外一个链表的头结点 xff1b xff08 2
  • 【每日一题-2】链表基础面试题

    1 查找链表的倒数第k个节点 span style font family none font size 12px ListNode FindKthToTail ListNode pListHead unsigned int k if pL
  • 【每日一题-3】链表带环问题

    判断链表是否带环 xff1f 如果带环 xff0c 环的长度是多少 xff1f 环的入口节点是什么 xff1f span style font family none font size 12px struct ListNode int v
  • Linux更改镜像源

    https mirrors tuna tsinghua edu cn span class token comment 清华大学镜像源 span span class token comment 1 搜索Ubuntu span span c
  • 【每日一题-5】复杂链表的复制

    逆序打印单链表 span style font family none font size 12px void ReversePrintList listNode pHead if pHead 61 61 NULL return NULL
  • 【每日一题-6】栈和队列与替换空格

    两个栈实现一队列 span style font family none font size 12px class Queue void Push int data inStack push data int Pop if inStack
  • HTTP协议详解(真的很牛逼)

    引言 HTTP是一个属于应用层的面向对象的协议 xff0c 由于其简捷 快速的方式 xff0c 适用于分布式超媒体信息系统 它于1990年提出 xff0c 经过几年的使用与发展 xff0c 得到不断地完善和扩展 目前在WWW中使用的是HTT
  • shell下的命令代替

    命令替换是指Shell 执行命令并将命令替换部分替换为执行该命令后的结果 shell下的命令代替为 34 96 96 xff08 反引号 xff09 34 和 34 34 使用单反引号的替换方式 执行结果 替换成 的方式 执行结果 两种命令
  • getopt函数簇

    xff08 一 xff09 在Linux中 xff0c 用命令行执行可执行文件时可能会涉及到给其加入不同的参数的问题 xff0c 例如 xff1a a out a1234 b432 c d 程序会根据读取的参数执行相应的操作 xff0c 在
  • 【每日一题-8】出栈入栈合法性与二进制中1的个数

    元素出栈 入栈顺序的合法性 如 xff1a 入栈的序列 xff08 1 2 3 4 5 xff09 xff0c 出栈序列为 xff08 4 5 3 2 1 xff09 xff0c 则合法 入栈的序列 xff08 1 2 3 4 5 xff0
  • 【每日一题-9】层序遍历与N!后的0的个数

    实现一颗二叉树的层序遍历 span style font family none font size 12px typedef struct Node int val struct Node left struct Node right N
  • 【每日一题-10】求第K层节点与求数组中出现一半的数

    strong span style font size 14px span style color rgb 51 51 51 font family none 求二叉树第k层的节点个数 span span strong span style
  • 【每日一题-11】求二叉树高度/销毁一棵二叉树与链表翻转

    求二叉树的高度 span style font family none font size 12px int TreeDepth Node root if root 61 61 NULL return 0 if root gt left 6
  • 更新数据时redis缓存与数据库数据不一致的问题

    最初级的缓存不一致问题及解决方案 问题 xff1a 先修改数据库 xff0c 再删除缓存 如果删除缓存失败了 xff0c 那么会导致数据库中是新数据 xff0c 缓存中是旧数据 xff0c 数据就出现了不一致 解决思路 xff1a 先删除缓
  • 【每日一题-12】平衡二叉树/镜像与杨氏矩阵查找

    判断一棵二叉树是否是平衡二叉树 span style font family none font size 12px typedef struct TreeNode int val struct TreeNode left struct T

随机推荐

  • 【每日一题-13】二叉树中查找节点/子树

    在二叉树中查找一个节点 span style font family none font size 12px struct TreeNode int data TreeNode left TreeNode right TreeNode in
  • 【每日一题-14】完全二叉树&寻找最近公共节点

    判断一棵树是否是完全二叉树 判断依据 xff1a 完全二叉树的前k层都是满的 xff0c 最后一层从左到右都是满的 xff0c 如果不符合该规则则不是完全二叉树 span style font family none font size 1
  • 【每日一题-15】二叉树非递归遍历&求两个集合的差集

    实现二叉树的前序 中序 后序非递归遍历 span style font family none font size 12px include lt stack gt struct Node int val struct Node left
  • 【每日一题-16】重建二叉树&C模拟实现C++继承多态

    由前序遍历和中序遍历重建二叉树 span style font family none font size 12px void reBuildTree vector lt int gt pre int begin1 int end1 vec
  • 【每日一题-17】线索化二叉树与单例模式

    将二叉搜索树转换成一个排序的双向链表 提示 xff1a 要求不能创建任何新的结点 xff0c 只能调整树中结点指针的指向 xff0c 也就是left当prev xff0c right当next 中序线索化的变型 span style fon
  • go学习笔记(1)——感悟

    在接触到go语言之前 xff0c 我本人一直学习的是C C 43 43 语言 xff0c 本想着凭借原有的语言功底能够很快的去自学任何一门新的编程语言 xff0c 只不过渣小白毕竟还是渣 xff0c go语言的更新对于其他语言的一些继承和更
  • go学习笔记(2)——go环境安装及代码包说明

    Linux下go的环境变量的配置 首先将下载的go的安装包解压到 usr local中 xff08 1 xff09 下载方法 xff1a go 1 8 Linux x86 64 下载 wget http ark mytorchwood co
  • go学习笔记(3)——go命令行

    go命令行清单 在安装好go机器上的Terminal中输入 go help 命令 xff1a Usage go command arguments The commands are build compile packages and de
  • go学习笔记(4)——比较两个类型相等

    字符串比较方法 xff1a xff08 1 xff09 61 61 xff1a 逐个比较且不分大小写 xff0c 相等返回true xff0c 不相等返回false fmt Println 34 你好 34 61 61 34 你好 34 t
  • 2021年校招软件测试工程师经典面试题,月薪15K你需要掌握哪些知识点?

    软件测试工程师 xff0c 和开发工程师相比起来 xff0c 前期可能不会涉及太深奥的内容 xff0c 但是涉及的面还是比较广的 面试实习生或者一年左右的岗位 xff0c 问的也主要是一些基础性的问题比较多 涉及的知识主要有MySQL数据库
  • CCF2021-9-19

    一共五道题目 xff0c 可以带参考书和纸笔进考场 xff0c 忘了带纸笔 xff0c 带了本参考书没用上 xff0c 总体做的情况不太好 第一题和第二题都是使用数组 xff0c 第一道题拿了满分 xff0c 第二题70 xff0c 后面数
  • go学习笔记(5)——字符串拼接方法

    字符串拼接清单 xff1a xff08 1 xff09 使用 43 61 运算符直接进行拼接 xff1a 需要注意的是 xff0c go语言拼接的两个对象必须得全部都是字符串类型 xff0c 否则会出现直接报类型不匹配的错误 xff0c 关
  • go学习笔记(6)——音乐播放器实现

    声明 xff1a 首先说明这个项目来自于许式伟的 Go语言编程 xff0c 书中也给出了详尽的源代码描述 xff0c 不过代码中还是存在一些问题 xff0c 首先说明一下所存在的问题 问题一 xff1a 音乐的播放结构体中定义了五个属性字段
  • Go格式化输出

    1 GO数据类型转化为JSON类型 函数原型 xff1a func Unmarshal data byte v interface err GO数据类型输出为JSON类型示例 package main import 34 encoding
  • C学习回顾1

    1 求下面程序的输出 include lt stdio h gt int main int i 61 43 printf 34 d n 34 printf 34 d 34 printf 34 d 34 i 4321 return 0 结果分
  • golang Unmarshal拿不全数据问题

    说明 xff1a 这个问题出现在后端调用json Unmarshal方法去解析数据库中存的数据时 xff0c 解析出来的结果中只能拿到部分数据 xff0c json格式经检查后正确无误 xff0c 同时也没有字段名出错等低级错误 首先来看要
  • Golang开发新手常犯的50个错误

    50 Shades of Go Traps Gotchas and Common Mistakes for New Golang Devs 原文地址 xff1a http devs cloudimmunity com gotchas and
  • Go学习之regexp包学习

    Go中regexp包主要存放的是处理正则表达式相关的结构和处理函数 xff0c 具体的函数原型可以在GOROOT中寻找相应的包查看 下面只是给出各个不同的函数的功能和使用方法 xff0c 正则表达式的基本概念可以查看正则表达式基本概念学习总
  • Go1.1.1新功能module的介绍及使用

    Go1 1 1版本发布 2018 08 24发布 已经过去几天 xff0c 从官方的博客中看到 xff0c 有两个比较突出的特色 xff0c 一个就是今天讲的module xff0c 模块概念 目前该功能还在试验阶段 xff0c 有些地方还
  • linux系统故障(一)之grub恢复

    linux系统故障 xff08 一 xff09 之grub恢复 前言 1 什么是linux系统故障 xff1f 2 什么是grub xff1f 3 grub坏了我们怎么恢复 xff1f 4 grub恢复的具体方法 xff1f 实验环境 本次