Schimba boot-ul remote intre Windows și Linux folosind Grub4Dos

This article has been written before more than 24months, information might old.

De multe ori poți avea o mașină în rețea care are instalat și o distribuție de linux și un SO Windows și vrei ca remote să poți schimba între două sau mai multe sisteme de operare.
În cazul în care nu am introduce în discuție un sistem de operare precum Windows totul ar fi prea simplu pentru ca evident am schimba configurarea boot loader-ului am restarta mașina și asta ar fi tot.
Dar în cazul în care se ne conectăm la o mașina care rulează Windows, și când spun conectăm ma refer la orice formă de administrare de la distanță ( rdp, vnc, rcp, orice) în mod cel mai probabil nu vom putea schimba configurația boot loader-ului pentru că Windows-ul cel puțin deocamdată nu ne oferă o metodă nativă de a lucra cu fișiere aflate pe un sistem ext3 ext4 și probabil și pe altele mai des folosite de către o distribuție linux.
Așadar o simpla soluție este să facem boot într-un loader care există într-un spațiu ntfs, și asta în principal pentru ca linux-ul de la versiunea 2.6 conține implicit un driver scris de Anton Altaparmakov (University of Cambridge) care permite operații de citire/suprascriere pe ntfs.
Folosind grub4dos deci putem încărca atât un SO Windows cat si un SO bazat pe linux, însă grub4dos poate avea avea limitările lui ( si aici ma refer la UEFI), dar majoritatea mașinilor nu sunt UEFI-only ( ma rog cele mai vechi nu au UEFI deloc ).
După ce instalam grub4dos pe o partiție e cazul să facem un menu.lst care să fie capabil sa încarce un Windows cat și un linux, dar dacă distribuția care o folosiți utilizează Grub2 eu as prefera să încarc grub2 decât să încarc linux-ul direct din grub4dos.
În final menu.lst poate conține ceva similar cu:

# This is a sample menu.lst file. You should make some changes to it.
# The old install method of booting via the stage-files has been removed.
# Please install GRLDR boot strap code to MBR with the bootlace.com
# utility under DOS/Win9x or Linux.

color white/black black/light-gray
timeout 6
default /default
savedefault 1

title Windows 
root (hd1,2)
chainloader /bootmgr


title Linux Grub2
root (hd1,0)
kernel /boot/grub/i386-pc/core.img
boot 

Acest exemplu poate încarcă un Win7 și un Grub2, iar acum putem de la distanță modificând acest fișier și restartând mașina să schimbam între cele doua SO de la distanța, modificarea în cazul de mai sus ar fi savedefault 1 pentru Grub2 si savedefault 0 pentru Windows. Putem să facem și un script ca sa nu mai deschidem fișierul:

Cu programul sed e simplu:

#!/bin/sh

if [ $1 = "1" ]; then
   sed '9s/.*/savedefault 0/' menu.lst
   echo "Changed boot to Windows"
else
  sed '9s/.*/savedefault 1/' menu.lst
  echo "Changed boot to Grub2"
fi

Pe windows folosind doar batch se implementează extrem de ineficace similar cu:

@echo off
setlocal enabledelayedexpansion

set path=I:\menu.lst
::——-
set pathtemp=%path%2
set old=savedefault 0
set new=savedefault 1
set cnd=%1
set count = 0
IF [%1]==[] ( set cnd=2)

IF EXIST %pathtemp% ( del %pathtemp% /F )

IF %cnd% EQU 1 (

For /f "tokens=* delims=" %%x in (%path%) do (
For /f "tokens=*" %%a in ("%%x") do (
if /i "%%a" EQU "%new%" (set output=!old!) else set output=%%a
echo !output! >> %pathtemp%
)
)
copy %pathtemp% %path% /Y > NUL
echo Changed boot to Windows.
) ELSE (
For /f "tokens=* delims=" %%x in (%path%) do (
For /f "tokens=*" %%a in ("%%x") do (
if /i "%%a" EQU "%old%" (set output=!new!) else set output=%%a
echo !output! >> %pathtemp%
)
)
copy %pathtemp% %path% /Y > NUL
echo Changed boot to Grub2.
)

Dar nu va funcționa perfect mai ales ca ‘for /f’ prin comportamentul implicit ( care nu se poate schimba ) sare liniile goale și dacă dorești sa ai linii goale pe acolo va trebui sa iți faci logica statică în for-urile outer de mai sus în care să specifici vreau 1,2,3 linii după ce am citit x linii care au conținut ceva poți trimite o line goala folosind ‘@echo:’, mai mult pentru asta am imbricat 2 for-uri ca altfel se putea și cu un singur for.

În orice caz recomand pentru windows să se folosească orice altceva decât batch.

Share the joy

Leave a Reply