原本安装的是Ubuntu14,但是在使用caffe时总是出错,所以干脆将Ubuntu从14升级到16,结果整出一堆麻烦。在解决这些麻烦的过程也学习了不少系统启动的细节。印证了那句话“如何没有装过十遍以上的系统就不能说学会了linux”。那么这是我的第二遍了,我也准备迎接剩下的八遍了。

下面我会从几个方面讲起

  1. 安装过程
  2. 系统启动
  3. grub常用命令
  4. 我的解决方案

安装过程

ubuntu安装的详细过程参见我的另一篇博客——安装win8+Ubuntu14.04双系统的经验总结 - 上官栋 - 博客园,这里不过多讨论了。我一开始是从liveUSB升级的方法安装ubuntu16,但是启动电脑的时候直接黑屏了,我以为失败了。接着又尝试自定义分区的方式重新安装,结果又黑屏了。然后在开机时进入BIOS调整启动顺序进入windows,把载有ubuntu的盘格式化之后,在用easyBCD重写了MBR,重新安装ubuntu16。为了以防万一,我又下载了ubuntu的最新版重新制作启动盘。这样相当于重装一次双系统,我想这样应该不会出错了吧。结果又黑屏了。之后又尝试了几种不同的安装方法,结果都会进入这个命令行的界面。

等到我实在找不到可行的办法才开始认真琢磨这个命令行界面是怎回事。一番搜索之后才认识到我进入了grub的命令行。也终于跳出了反复装系统的死循环。

系统启动

想要明白grub是什么,必须要明白开机启动的过程。这里推荐一篇博客计算机的启动过程(详细) - CSDN博客。讲得比我要详细的多。

系统在启动时会先从BIOS中读取程序,这些程序用于硬件检测,环境初始化。同时BIOS也存储了用户设定的启动顺序,例如从硬盘A,硬盘B,光驱,优盘等不同硬件启动。按照顺序,计算机会检测这些硬件是否装载了操作系统(比较其放置MBR的位置的结尾两位是否为0xAA55)。如果装载了,就会读入这个设备第一个分区的程序,也就是主引导记录(MBR)。

到这里还不是操作系统的程序。MBR的作用是告诉计算机操作系统存储在我这个存储器的那个分区上。如果操作系统装在主分区上,计算机就会根据卷引导记录查找到分区中具体的位置,装载入操作系统。如果在逻辑分区,那么就从扩展分区中依次查找,直到找到操作系统。不过要是有两个操作系统呢?那么这个MBR就不能满足要求了。因为他不提供选择的功能,程序只能加载一个操作系统。为了适应计算机结构的发展,Intel又对BIOS+MBR做了改进,提出了EFI+GPT的结构。EFI可以支持32位,64位指令,硬件接口可扩展,采用C语言的堆栈架构,容易跨平台,也容易开发。GPT采用新的分区方式,可以有多个主分区,硬盘容量上限突破2T。

如果我们想在一个硬盘里面装两个操作系统应该怎么办?无论是BIOS+MBR还是EFI+GPT似乎都不支持这种设定。有一种方法是修改MBR或者GPT中的操作系统指向,让其指向一个小的操作系统(mini OS),也就是现在常用的grub和LILO。这个mini OS的功能主要是让用户选择操作系统,但是实际上他的功能和权限远远超过这个要求。你完全可以在grub下访问硬盘中的文件。

通过grub这种mini OS就可以选择我们需要的操作系统了,到这里终于算是启动成功了。

grub常用指令

通过系统启动中的说明,我们明白了grub就是引导计算选择操作系统的mini OS。作为OS就会有指令,下面介绍一些:

set:设置常量,例如“set root=(hd0,0)”就是讲root设置为hd0,0。如果只输入“set”,就可以看到环境中常量,注意root和prefix的值,这两个量很重要,分别指ubunto系统目录和grub所在目录,启动失败主要是这两个变量错误。

linux:内核加载命令,例如“linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1”

initrd:镜像文件加载命令,例如“initrd /boot/initrd.img-3.13.0-29-generic”

insmod:启动模式选择,例如“insmod/boot/grub/i386-pc/normal.mod”

boot:启动

exit:退出

normal:进入normal.mod

cat:查看文件

ls:列出目录下的文件

我的解决方案

其实在一开始进入grub界面只是一些参数错误,操作系统并没有什么问题。但是不熟悉命令行操作的我本能的认为一定是安装出现了错误。结果一开始就没有正确的认识问题的根源,花了很多不必要的时间。以后还是应该习惯去使用命令行,这才是与机器打交道的正确方法。

出现黑屏的原因是grub环境变量中root和prefix设置错误,我的ubuntu安装在/dev/sda11,在grub是(hd0,gpt11)。但是root变量却是(hd0,gpt2),这是windows所在的分区。这样就导致grub不能加载grub的选择界面,也不能加载ubuntu的内核。针对此有三种解决方案

一、进入选择界面

输入命令

set root=(hd0,11)
set prefix=(hd0,11)/boot/grub
insmod /boot/grub/i386-pc/normal.mod
normal

经过反复的实验,其实输入下面的命令也是可以的

prefix=(hd0,11)/boot/grub
normal

也就是问题的关键在于让grub找到grub.cfg引导文件。这样就可以进入系统选择界面。

二、加载linux内核

输入命令

set root=(hd0,11)
linux (hd0,11)/boot/vmlinuz-3.13.0-29-generic root=/dev/sda11
initrd (hd0,11)/boot/initrd.img-3.13.0-29-generic
boot

这段命令是让系统加载ubuntu的内核,直接进图ubuntu,不经过选择界面

三、加载windows系统

输入exit退出grub,选择windows boot manager,加载windows系统

在进入ubuntu之后,有人建议输入命令

update-grub
grub-install /dev/sda

用来更新grub。但我的问题是grub在启动时的环境变量错误。这种方法也试过,但问题没有解决。所以现在每次开机要输入一些命令。不过现在我不想折腾了,就当做密码长一点吧。以后再装系统时一起解决吧。

2018年3月2日更新:

在安装

安装Ubuntu16.04失败的更多相关文章

  1. 初用Linux, 安装Ubuntu16.04+NVIDIA387+CUDA8.0+cudnn5.1+TensorFlow1.0.1

    因为最近Deep Learning十分热门, 装一下TensorFlow学习一下. 本文主要介绍安装流程, 将自己遇到的问题说明出来, 并记录自己如何处理, 原理方面并没有能力解释. 由于本人之前从来 ...

  2. win10安装ubuntu16.04双系统

    前话:因为感兴趣吧也是专业需要,所以自学了U盘重装系统以及在win10的情况下安装Ubuntu16.04双系统.借此博客,记录下我安装Ubuntu的过程,方便日后回忆. 正因如此,本篇博客会写的十分简 ...

  3. Win7 U盘安装Ubuntu16.04 双系统详细教程

    Win7 U盘安装Ubuntu16.04 双系统详细教程 安装主要分为以下几步: 一. 下载Ubuntu 16.04镜像软件: 二. 制作U盘启动盘使用ultraISO: 三. 安装Ubuntu系统: ...

  4. 路由器安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错误。向目标系统中安装busybox-initramfs软件包时出现一个错误。请检查/var/log/syslog或查看第四虚拟控制台以获得详细

    公司的路由器要ubuntu服务器进行路由网络功能的管理,在安装的时候出现下面的错误提示: 安装ubuntu-16.04.1-server-amd64出现“无法安装busybox-initramfs”错 ...

  5. win7下通过easyBCD引导安装Ubuntu16.04(并处理遇到的坑)

    Ubuntu16.04作为目前最新版本的ubuntu系统,相信很多人都想在自己的电脑上安装一下,然而系统的安装方法各式各样,u盘法.grub引导法等等,这里我将介绍在win7系统下用easyBCD软件 ...

  6. win10下安装Ubuntu16.04双系统

    其实我是不喜欢系统的,之前都是在win下面进行开发,现在来了个项目,经过各种环境的安装调研,最终选择在Ubuntu下面进行开发.之前想着为啥不在虚拟机里面安装Ubuntu进行操作呢,由于虚拟机的体验不 ...

  7. win10安装ubuntu16.04及后续配置

    原文地址:https://www.jianshu.com/p/842e36a8255c UEFI 模式下win10安装ubuntu16.04双系统教程 - baobei0112的专栏 - CSDN博客 ...

  8. win10安装ubuntu16.04双系统历程

    目录 win10安装ubuntu16.04双系统 历程 安装时间 安装准备 安装过程 其他问题 win10安装ubuntu16.04双系统 历程 安装时间 2018.11.30 安装准备 u盘(格式化 ...

  9. 用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu16.04图文教程

    用 EasyUEFI 在 Win8/10 中硬盘安装 Ubuntu 作者:TeliuTe 来源:基础教程网 1.准备Ubuntu安装文件 1)下载带amd的64位 Ubuntu 桌面版光盘镜像文件,如 ...

随机推荐

  1. bzoj 1150: [CTSC2007]数据备份Backup

    Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家 ...

  2. bzoj 3670: [Noi2014]动物园

    Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...

  3. Java中list<Object[]>、list<Student>、list<Map<String,String>>排序

    1:list<Object[]>的排序   public static void main(String[] args) { // TODO Auto-generated method s ...

  4. 未来五年什么样的IT技术最具颠覆性?这里有你想知道的答案

    据外媒报道称,近日Gartner研讨会在美国弗罗里达州奥兰多举行,智能化.大数据和物联网成为届研讨会的三大主题.市场研究机构Gartner Research的副总裁兼资深研究员大卫·卡利(David ...

  5. Java 浮点型与双精度数值比较

    对于双精度与浮点数之间的比较存在潜在的转化

  6. ab返回结果参数分析

    Server Software    返回的第一次成功的服务器响应的HTTP头.Server Hostname    命令行中给出的域名或IP地址Server Port    命令行中给出端口.如果没 ...

  7. Webpack 2 视频教程 016 - Webpack 2 中生成 SourceMaps

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  8. 笔记-CGRectInset CGRectoffset UIEdgeInsetsInsetRect 这三个函数的使用情况

    //CGRectInset 将原来的矩形放大或者缩小,正表示缩小,-表示放大. CGRect rect= CGRectMake(20, 50, 100, 80); CGRect rect1=CGRec ...

  9. Python学习_13_继承和元类

    继承 继承的含义就是子类继承父类的命名空间,子类中可以调用父类的属性和方法,由于命名空间的查找方式,当子类中定义和父类同名属性或者方法时,子类的实例调用的是子类中的属性,而不是父类,这就形成了pyth ...

  10. 前端学习_04_font-awesome字体图标

    使用font-awesome字体图标库 font-awesome是一个比较大的矢量图标库,包含大部分IT类公司logo和常用的一些小图标,通过使用font-awesome提供的css样式集,可以在网页 ...