启动双系统linux

2014-07-06 18:12:35 user_longling 阅读数 4698

        电脑上装了Windows 7和Ubantu双系统,由于Linux系统用的次数比较少并且还是默认的启动项对此很不能容忍,因此得修改Windows为默认的启动项。

        由于电脑上的系统引导程序是GRUB,因此修改当然也就落到Linux系统上啦。

        修改/boot/grub/grub.cfg该文件中的默认加载启动项(默认自动加载第一个启动项,default="0")由于该文件比较重要在修改前把他备份了一下(cp /boot/grub/grub.cfg /boot/grub/grub.cfg.back)

       电脑上开机启动选择项有5个,而Windows的选项正好是排第5,因此将默认启动项由原先默认0改成4即可。


修改前(grub.cfg.back是修改前备份的):


修改后:



注意grub.cfg文件为只读文件因此修改需用root用户强行修改。



2016-08-06 22:43:08 Touch_Dream 阅读数 7870

电脑上装了Windows 7和Ubantu双系统,由于Linux系统用的次数比较少并且还是默认的启动项对此很不能容忍,因此得修改Windows为默认的启动项。
由于电脑上的系统引导程序是GRUB,因此修改当然也就落到Linux系统上啦。
修改/boot/grub/grub.cfg该文件中的默认加载启动项(默认自动加载第一个启动项,default="0"),由于该文件比较重要在修改前把他备份了一下(cp /boot/grub/grub.cfg /boot/grub/grub.cfg.back)

电脑上开机启动选择项有5个,而Windows的选项正好是排第5,因此将默认启动项由原先默认0改成4即可。
修改前(grub.cfg.back是修改前备份的):

修改之后:


注意grub.cfg文件为只读文件因此修改需用root用户强行修改。



2017-01-10 17:20:55 peng_apple 阅读数 4421
双系统启动的方式不止一种。
一、对于双系统的启动镜像来说:
     1、Linux系统和Android系统的uboot、kernel镜像相同而文件系统(rootfs)不同;
     2、Linux系统和Android系统的uboot镜像相同而kernel镜像和文件系统(roofts)不同。
     这两种情况都可以实现对双系统的启动和切换。

二、双系统启动和相互切换的实质是设置标志位,在启动时读取标志位信息从而启动相应的系统!下面是两种实现方式。
     1、启动(重启)时,单独分出一个分区存储标志位(保证两个系统都能对这一块分区操作);
          在应用程序中向分区写入标志位,然后重启在uboot阶段自动scan读取这个分区中的标志位(对应启动相应的系统)

     2、在文件系统分区写入一个.txt文件(文件存储标志位);
          在uboot中scan读取该.txt文件的中的内容(标志位),然后决定启动相应的系统。

三、本次主要讨论Linux系统和Android共uboot的情况,实现方式为单独分出一个分区存储标志位。已实现。

     1、要实现双系统的启动和相互切换,需要对uboot启动过程、bootargs引导参数有相应的了解。

     2、首先,将uboot,Android系统的kernel和file system,Linux系统的kernel和file system烧写到emmc中,如下图所示。
          注意:烧写的物理位置应与下面讲到的bootargs引导参数相对应,否则系统启动会失败!!!
                      
 
 图中为主要烧写部分,其他的烧写按照自己思路稍微调整。
     设置flags分区,存储我们的启动标志位。

     3、对uboot的修改:
          (1)将bootargs引导参数写入uboot中,并且制作command命令,至于怎样将制作的command命令放在".u_boot_cmd"段: ,用下面例子讲解。

     例子:
     a)在common文件夹下创建cmd_sunplus.c;
     b)在cmd_sunplus.c中添加“sunplus_linuxemmcboot 和sunplus_androidemmcboot”命令的响应函数的实现。具体的实现代码如下:

//====================================================================
int do_sunplus_linuxemmcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int ret = 0;

    /*①
     设置bootargs引导参数
    //这里BOOT_TYPE_LINUX_EMMC为    "console=ttyAMA0,115200 root=/dev/mmcblk0p8 rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(boot),1M(bootargs),4M(baseparam),4M(pqparam),4M(logo),3058M(unused),8M(kernel),96M(rootfs),1M(flags),-(others) coherent_pool=1M"
     */
    setenv("bootargs", BOOT_TYPE_ANDROID_EMMC );

    /*②
      从emmc中读取kernel到内存中:起始地址为0x600000(内核文件存储的实际物理地址),长度为0x4000,读到起始地址为0x1000000的内存中
   */
    ret = run_command("mmc read 0 0x1000000 0x600000 0x4000" , 0);
    if(ret == -1) {
        printf("read kernel failed.\n");
        sp_failed();
    }

    /* ③
     启动Linux的kernel
    */
    printf(GREEN"Boot to linux.\n"NONE);
    run_command("bootm 0x1000000" , 0);
    printf("bootm linux sys failed.\n");
    return ret;
}

U_BOOT_CMD(
    sunplus_linuxemmcboot,    1,    0,    do_sunplus_linuxemmcboot,
    "[sunplus app func]:boot up linux from emmc",
    "\n"
);


int do_sunplus_androidemmcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int ret = 0;

    /*①
     设置bootargs引导参数
    //这里BOOT_TYPE_ANDROID_EMMC为    "console=ttyAMA0,115200 blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(recovery),2M(deviceinfo),8M(baseparam),8M(pqparam),20M(logo),20M(logobak),40M(fastplay),40M(fastplaybak),40M(kernel),20M(misc),8M(userapi),8M(hibdrv),8M(qbflag),300M(qbdata),800M(system),1024M(userdata),500M(cache),50M(private),50M(sdcard),218M(unused),1M(flags),-(others) coherent_pool=1M"
     */
    setenv("bootargs", BOOT_TYPE_ANDROID_EMMC );

    /*②
      从emmc中读取kernel到内存中:起始地址为0x4B000(内核文件存储的实际物理地址) ,长度为0x5000,读到起始地址为0x1FFBFC0的内存中
   */
    ret = run_command("mmc read 0 0x1FFBFC0 0x4B000 0x5000" , 0);
    if(ret == -1) {
        printf("read kernel failed.\n");
        sp_failed();
    }
    
    /* ③
     启动Android的kernel
   */
    printf(GREEN"Boot to android.\n"NONE);
    run_command("bootm 0x1FFBFC0" , 0);
    printf("bootm android sys failed.\n");

    return ret;
}

U_BOOT_CMD(
    sunplus_androidemmcboot,    1,    0,    do_sunplus_androidemmcboot,
    "[sunplus app func]:boot up android from emmc",
    "\n"
);
//====================================================================   
     c)将common/cmd_sunplus.c编译进u-boot.bin,在common/Makefile中加入如下代码:
          COBJS-$(CONFIG_BOOT_SUNPLUS) += cmd_sunplus.o

     d)在include/configs/hi3798mx.h(代码相应位置)加入如代码:
          #define CONFIG_BOOT_SUNPLUS 

     e)重新编译下载U-Boot就可以使用sunplus_linuxemmcboot 和sunplus_androidemmcboot 命令了
     
     (2)在boot源码的Main.c中,找到main_loop()函数。

     要实现双系统启动,需要在boot启动阶段扫描咱们定义的标志位,然后启动相应的系统。下图是main_loop()函数的扫描标志位操作在如图所示位置加入扫描标志位分区,既能率先扫描分区,又能达到控制Ctrl+C到boot命令下
 
 
 
 
     4、编译boot,烧写完成之后启动系统。
          启动完成后,在Linux系统下,flags(标志位分区)是/dev/mmcblock0p9第九分区,在/dev/mmcblock0p9设备文件中写入“android”,重启即可切换到Android系统。同理,在Android系统下,flags(标志位分区)在/dev/block/mmcblock0p23第23分区,在/dev/block/mmcblock0p23设备文件中写入“linuxaa”,即可切换到Linux系统。
     两个系统虽然是不同的设备文件名,但都是操作的同一块物理地址(起始地址为0x63400)。
     这样就完成了双系统的启动。
 
 
          本文只是一种思路,有更好的请广大码友指教!
 
2017-04-26 21:28:08 zhuiqiuk 阅读数 7241

方法适用于

(1)先装Linux后装windows,Linux无启动引导(或无法启动)

(2)linux,windows双系统,重装windows后,Linux无法启动

(3)Linux,windows双系统,无法进入windows

(4)类似于上面两种情况的也行

以下方法,以Ubuntu 12.04和windows7 旗舰版双系统为例

工具/原料

  • Ubuntu 12.04,windows7 旗舰版,U盘(或读卡器+SD卡)

步骤

  1. 制作U盘(或读卡器+SD卡)启动盘(LiveCD)

    下载Ubuntu12.04的iso文件,并把它刻录到U盘(或读卡器+SD卡)上

  2. 从U盘启动

    重启电脑,进入BIOS(开机时按住F2、Delete等,这根据你的机器而定,不过大多为F2、Delete)。(我的主板为华硕,请根据你的主板继续以下步骤)

    修复windows 、Linux双系统无法正确启动
  3. 点击启动菜单,选择你的启动U盘(或把U盘图标拖到最前面)

    修复windows 、Linux双系统无法正确启动
    修复windows 、Linux双系统无法正确启动
    修复windows 、Linux双系统无法正确启动
  4. 启动U盘后,点击try Ubuntu(或使用Ubuntu)。不要选择Install选项,不然你就会重装系统(虽重装后能正确启动两系统,但被重装的系统的资料可能会丢失)

  5. 组合键Ctrl+Alt+T,打开终端

  6. 输入命令sudo fdisk -l

    找到你Linux安装的分区

    我在这假设为sda8

    修复windows 、Linux双系统无法正确启动
  7. 输入以下代码

    sudo mount /dev/sda8 /mnt      /*  挂载Linux所在分区到mnt/下  */

    sudo grub-install --root-directory=/mnt /dev/sda      /*安装grub*/

    执行完后,重启电脑。

    进入BIOS,启动菜单,选择第一项(即你安装Linux的硬盘,根据你的情况而定)

    终于,出现了grub引导界面,就选择你的操作系统吧。

    如果完成以上步骤还没成功,请继续以下步骤

    修复windows 、Linux双系统无法正确启动
  8. 完成上面的步骤,你就可以进入Ubuntu了(如果不行执行步骤四,进入Ubuntu使用模式,看步骤9)

    组合键Ctrl+Alt+T,打开终端,

    执行

    sudo update-grub

    重启电脑,就可以出现grub引导界面了

    修复windows 、Linux双系统无法正确启动
    修复windows 、Linux双系统无法正确启动
  9. 如果以上步骤你无法实现,可以用工具软件

    执行以下代码

    sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update sudo apt-get install -y boot-repair && (boot-repair &)

    【也可分步执行

    sudo add-apt-repository ppa:yannubuntu/boot-repair

    sudo apt-get update 

    sudo apt-get install -y boot-repair && (boot-repair &)

    打开应用程序,点击推荐修复,然后等待。在这个步骤完成后,重启机器,你就会重新看到GRUB,实现双启动

    ---步骤9 来源于http://linux.cn/article-2525-1.html/

2013-05-03 16:13:34 rachel_luo 阅读数 21801

在安装了windows与linux双系统的环境下,往往需要先安装windows系统再安装linux系统,这是因为linux的引导程序能够识别windows系统,而windows的引导程序无法识别linux系统,而且如果先安装linux再安装windows的话,windows的引导程序会将linux的引导程序覆盖掉,造成linux无法识别。

前不久刚装了双系统:windows server 2003和Linux(centos6.3),默认的第一启动系统是linux,如果我想把默认启动的系统改为windows的话,如何操作呢?操作步骤如下:

1、以root身份登录linux系统;

2、启动终端,输入命令:vi /boot/grub/grub.conf,文件内容如下:

  #boot=/dev/sda

    default=0 (默认启动哪个系统的设置,此处默认启动linux系统)

    timeout=5 (启动系统过程中,等待的时长<单位:秒>,让用户可手动选择启动系统)

title CentOs 6.3 Linux AS
......
title windows server 2003
......
title other ...
......

   (每一个title代表一个系统,系统代号从0开始,要想默认启动windows server 2003,设置default=1即可

修改后保存文件,重启系统,就可以进入windows系统了。

   PS:如果想调整GRUB中的系统顺序和添加删除系统名称,修改grub.conf文件中的title就可以了。