Results 1 to 9 of 9

Thread: How to create a "reboot into windows" menu entry

  1. #1
    Join Date
    Feb 2007
    Location
    perdita
    Beans
    1,622
    Distro
    Ubuntu

    How to create a "reboot into windows" menu entry

    WARNING: This method uses setuid on 2 binaries, which might present potential security risks.

    More info on setuid: http://en.wikipedia.org/wiki/Setuid

    Step 1: Set up grub2
    Add the following to /etc/default/grub:
    Code:
    GRUB_DEFAULT=saved
    # if you uncomment the following line, it will keep windows as default until you boot into ubuntu again.
    # GRUB_SAVEDEFAULT=true
    Then run:
    Code:
    sudo update-grub2
    Example /etc/default/grub:
    Code:
    cat /etc/default/grub 
    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    
    
    GRUB_DEFAULT=saved
    # if you uncomment the following line, it will keep windows as default until you boot into ubuntu again.
    # GRUB_SAVEDEFAULT=true
    
    
    #GRUB_HIDDEN_TIMEOUT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT=10
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""
    
    # Uncomment to disable graphical terminal (grub-pc only)
    #GRUB_TERMINAL=console
    
    # The resolution used on graphical terminal
    # note that you can use only modes which your graphic card supports via VBE
    # you can see them in real GRUB with the command `vbeinfo'
    #GRUB_GFXMODE=640x480
    
    # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
    #GRUB_DISABLE_LINUX_UUID=true
    
    # Uncomment to disable generation of recovery mode menu entries
    #GRUB_DISABLE_LINUX_RECOVERY="true"
    
    # Uncomment to get a beep at grub start
    #GRUB_INIT_TUNE="480 440 1"
    Step 2: Create the reboot scripts
    /usr/sbin/reboot_into_windows_once.sh :
    Code:
    #!/bin/bash
    # Set the default boot entry for GRUB, for the next boot only. + reboot
    /usr/sbin/grub-reboot "Windows Vista (loader) (on /dev/sda1)"
    /sbin/reboot
    /usr/sbin/reboot_into_windows_always.sh :
    Code:
    #!/bin/bash
    # Set the default boot entry for GRUB. + reboot
    /usr/sbin/grub-set-default "Windows Vista (loader) (on /dev/sda1)"
    /sbin/reboot
    Don't forget to make them executable:
    Code:
    sudo chmod 755 /usr/sbin/reboot_into_windows_once.sh
    sudo chmod 755 /usr/sbin/reboot_into_windows_always.sh
    You should of course replace "Windows Vista (loader) (on /dev/sda1)" by your own menu entry from grub.
    You can find it by looking at /boot/grub/grub.cfg.
    Example:
    Code:
    #
    # DO NOT EDIT THIS FILE
    #
    # It is automatically generated by /usr/sbin/grub-mkconfig using templates
    # from /etc/grub.d and settings from /etc/default/grub
    #
    
    ### BEGIN /etc/grub.d/00_header ###
    if [ -s $prefix/grubenv ]; then
      load_env
    fi
    set default="${saved_entry}"
    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 recordfail {
      set recordfail=1
      if [ -n ${have_grubenv} ]; then if [ -z ${boot_once} ]; then save_env recordfail; fi; fi
    }
    insmod ext2
    set root='(hd0,6)'
    search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
    if loadfont /usr/share/grub/unicode.pf2 ; then
      set gfxmode=640x480
      insmod gfxterm
      insmod vbe
      if terminal_output gfxterm ; then true ; else
        # For backward compatibility with versions of terminal.mod that don't
        # understand terminal_output
        terminal gfxterm
      fi
    fi
    insmod ext2
    set root='(hd0,6)'
    search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
    set locale_dir=($root)/boot/grub/locale
    set lang=fr
    insmod gettext
    if [ ${recordfail} = 1 ]; then
      set timeout=-1
    else
      set timeout=10
    fi
    ### END /etc/grub.d/00_header ###
    
    ### BEGIN /etc/grub.d/05_debian_theme ###
    set menu_color_normal=white/black
    set menu_color_highlight=black/light-gray
    ### END /etc/grub.d/05_debian_theme ###
    
    ### BEGIN /etc/grub.d/10_linux ###
    menuentry 'Ubuntu, avec Linux 2.6.32-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux   /boot/vmlinuz-2.6.32-22-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro   quiet splash
            initrd  /boot/initrd.img-2.6.32-22-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.32-22-generic (mode de récupération)' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            echo    'Chargement de Linux 2.6.32-22-generic ...'
            linux   /boot/vmlinuz-2.6.32-22-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro single 
            echo    'Chargement du disque mémoire initial...'
            initrd  /boot/initrd.img-2.6.32-22-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.31-20-generic' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux   /boot/vmlinuz-2.6.31-20-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro   quiet splash
            initrd  /boot/initrd.img-2.6.31-20-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.31-20-generic (mode de récupération)' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            echo    'Chargement de Linux 2.6.31-20-generic ...'
            linux   /boot/vmlinuz-2.6.31-20-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro single 
            echo    'Chargement du disque mémoire initial...'
            initrd  /boot/initrd.img-2.6.31-20-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.28-17-generic' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux   /boot/vmlinuz-2.6.28-17-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro   quiet splash
            initrd  /boot/initrd.img-2.6.28-17-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.28-17-generic (mode de récupération)' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            echo    'Chargement de Linux 2.6.28-17-generic ...'
            linux   /boot/vmlinuz-2.6.28-17-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro single 
            echo    'Chargement du disque mémoire initial...'
            initrd  /boot/initrd.img-2.6.28-17-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.27-7-generic' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux   /boot/vmlinuz-2.6.27-7-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro   quiet splash
            initrd  /boot/initrd.img-2.6.27-7-generic
    }
    menuentry 'Ubuntu, avec Linux 2.6.27-7-generic (mode de récupération)' --class ubuntu --class gnu-linux --class gnu --class os {
            recordfail
            savedefault
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            echo    'Chargement de Linux 2.6.27-7-generic ...'
            linux   /boot/vmlinuz-2.6.27-7-generic root=UUID=fa9fcdbc-2341-4545-ba2d-be044e93e483 ro single 
            echo    'Chargement du disque mémoire initial...'
            initrd  /boot/initrd.img-2.6.27-7-generic
    }
    ### END /etc/grub.d/10_linux ###
    
    ### BEGIN /etc/grub.d/20_memtest86+ ###
    menuentry "Memory test (memtest86+)" {
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux16 /boot/memtest86+.bin
    }
    menuentry "Memory test (memtest86+, serial console 115200)" {
            insmod ext2
            set root='(hd0,6)'
            search --no-floppy --fs-uuid --set fa9fcdbc-2341-4545-ba2d-be044e93e483
            linux16 /boot/memtest86+.bin console=ttyS0,115200n8
    }
    ### END /etc/grub.d/20_memtest86+ ###
    
    ### BEGIN /etc/grub.d/30_os-prober ###
    menuentry "Windows Vista (loader) (on /dev/sda1)" {
            savedefault
            insmod ntfs
            set root='(hd0,1)'
            search --no-floppy --fs-uuid --set 6c30ee3230ee02c6
            chainloader +1
    }
    ### 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 ###
    Step 3: Set UID where necessary
    Code:
    sudo chmod u+s /sbin/reboot
    sudo chmod u+s /usr/bin/grub-editenv
    THIS WILL ALLOW NORMAL USERS TO RUN /sbin/reboot AND /usr/bin/grub-editenv AS IF THEY WERE ROOT!


    Step 4: Create reboot menu entries
    Run alacarte:
    Code:
    alacarte
    This howto has been modified to allow for the use of 2 scripts, so you should create entries for each of them:

    Entry 1:
    -Name: Reboot into Windows (once)
    -Command: /usr/sbin/reboot_into_windows_once.sh

    Entry 2:
    -Name: Reboot into Windows (always)
    -Command: /usr/sbin/reboot_into_windows_always.sh

    Create a new menu entry for each one of the scripts like in the image below:
    reboot1.png

    Et voilà:
    reboot2.png

    Note: There is probably a way of using dbus (or whatever the normal reboot menu entry uses) to reboot instead of using setuid on the reboot binary, but I haven't looked into it yet.

    Note2: A password dialog and/or confirmation dialog can easily be added to the script if you don't want to use setuid and/or prefer a confirmation dialog before rebooting. Use zenity, gksudo or kdesudo.

    References:
    Grub 2 basics guide
    Last edited by KIAaze; July 1st, 2010 at 09:07 AM. Reason: howto improvements

  2. #2
    Join Date
    Jan 2010
    Location
    Brooklyn, NY
    Beans
    8
    Distro
    Ubuntu 10.04 Lucid Lynx

    Question Re: How to create a "reboot into windows" menu entry

    Does this create a 'one time' reboot into windows (as in, when restarting from within windows, it will reboot into ubuntu by default) or does this forever change the 'default OS' that grub will boot from if not selected?

    G

  3. #3
    Join Date
    Feb 2007
    Location
    perdita
    Beans
    1,622
    Distro
    Ubuntu

    Re: How to create a "reboot into windows" menu entry

    I'm not sure anymore actually. ^^'
    I only set this up on one PC a while ago and don't want to test it right away on the one I'm currently using.
    I think it set the default boot entry until changed, but I can't confirm it with certainty.

    According to the Grub 2 basics guide:
    Quote Originally Posted by drs305 View Post
    • grub_default=saved - (grub 1.98) enables the "grub-reboot" and "grub-set-default" commands.
      • this setting allows the use of the following commands to set a default os. The default os will not be set merely by an interactive selection of an os from the menu.
      • grub-set-default. Sets the default boot entry until changed.
        • the format is "sudo grub-set-default x, with x being the menuentry position (starting with 0 as the first entry) or the exact menu string. Examples: sudo grub-set-default 3 or sudo grub-set-default "ubuntu, linux 2.6.32-15-generic"
        • to obtain the existing menuentry choice number (starting from 0) or the menuentry "string", run "grep menuentry /boot/grub/grub.cfg"

      • grub-reboot. This command sets the default boot entry for the next boot only. The format of the command is the same as for "grub-set-default" (see above).
      • for an example of how to enable the "saved" option with a custom menu, see the "custom user entries" section.

    • grub_default="xxxx" - an exact menu entry, including the quotation symbols, may also be used. In this case, location in the menu will not matter. Example: grub_default="ubuntu, linux 2.6.31-9-generic"


    • grub_savedefault=true * if set to true this setting will automatically set the last selected os from the menu as the default os on the next boot. No commands need be run to set the default os. For this entry to work, the grub_default entry should be set to saved.
    So using grub-reboot (as in the tutorial) sets the default boot entry for the next boot only.
    However, using "GRUB_SAVEDEFAULT=true" sets it forever.

    Which means that theoretically, in the end, it would be set forever.
    An easy way to change this should be to just leave out the "GRUB_SAVEDEFAULT=true" entry.
    When leaving it out, you should actually be able to create 2 different "reboot into windows" menu entries!:
    -Reboot into Windows "forever" -> Uses "grub-set-default" in the script.
    -Reboot into Windows "for the next boot only" -> Uses "grub-reboot" in the script.

    I'll add it to the tutorial once I get to confirm this.
    Last edited by KIAaze; June 24th, 2010 at 12:02 AM.

  4. #4
    Join Date
    Jan 2010
    Location
    Brooklyn, NY
    Beans
    8
    Distro
    Ubuntu 10.04 Lucid Lynx

    Re: How to create a "reboot into windows" menu entry

    I can confirm - leaving off that line certainly gives me what I wanted - one time into windows, as per spec.

    G

  5. #5
    Join Date
    Sep 2009
    Beans
    8,874
    Distro
    Ubuntu Development Release

    Re: How to create a "reboot into windows" menu entry

    Quote Originally Posted by guckpup View Post
    I can confirm - leaving off that line certainly gives me what I wanted - one time into windows, as per spec.

    G
    What is it that your actually trying to do and achieve?





  6. #6
    Join Date
    Oct 2005
    Location
    Wabasha MN
    Beans
    2,206
    Distro
    Ubuntu 12.10 Quantal Quetzal

    Re: How to create a "reboot into windows" menu entry

    I didn't think this was a very good howto. You forgot to mention that the scrip file needs to be set to execute and in the scrip you need root right to run the reboot command. Also all the scrip does is reboots the computer and it come up to the grub menu and you still have to select the windows OS. It doesn't do anything different then rebooting the computer.
    My hometown on the Mississippi River.
    Using a Asus 3632QM laptop with 8gig RAM, 750gig Hybrid.
    Machine Registered 366271, 366273, 366275.
    Registered Ubuntu user number 18630. Registered Linux user number 458093.

  7. #7
    Join Date
    Feb 2007
    Location
    perdita
    Beans
    1,622
    Distro
    Ubuntu

    Re: How to create a "reboot into windows" menu entry

    Quote Originally Posted by irv View Post
    You forgot to mention that the script file needs to be set to execute
    Fixed.

    Quote Originally Posted by irv View Post
    and in the scrip you need root right to run the reboot command. Also all the script does is reboots the computer and it come up to the grub menu and you still have to select the windows OS. It doesn't do anything different then rebooting the computer.
    No, you don't need root rights to run the reboot command if you set UID on it as indicated in the howto.
    The scripts set the default entry in GRUB to Windows.
    Unless you have configured GRUB to wait for user input, this means that it will automatically boot into Windows after any configured timeout.

    Quote Originally Posted by guckpup
    I can confirm - leaving off that line certainly gives me what I wanted - one time into windows, as per spec.
    Thanks. I modified my howto to add the 2 scripts.

  8. #8
    Join Date
    Nov 2010
    Beans
    89
    Distro
    Ubuntu 13.04 Raring Ringtail

    Re: How to create a "reboot into windows" menu entry

    I have a problem with your solution on one pc: it sets always default boot windows also if I used only the option to reboot to windows once.
    On another pc after reboot from windows I get linux as default like I wanted.

  9. #9
    Join Date
    Mar 2008
    Beans
    169
    Distro
    Ubuntu Development Release

    Re: How to create a "reboot into windows" menu entry

    Quote Originally Posted by magowiz82 View Post
    I have a problem with your solution on one pc: it sets always default boot windows also if I used only the option to reboot to windows once.
    On another pc after reboot from windows I get linux as default like I wanted.
    In case anybody else has this problem (I did), be sure to run the following to set the default, as described here

    Code:
    sudo grub-set-default 0

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •