fájl másolása GRUB-menüpont alapján

 ( Oops | 2016. február 12., péntek - 17:13 )

Van egy fájl a fájlrendszeren. Többféle verziója is használatos, és még boot előtt kellene a megfelelőt a helyére másolni, hogy boot során már a megfelelő verzió legyen a helyén, az addig ott levőt felülírva.
Van-e mód arra, hogy hogy ezt például GRUB-ból megtegyem, hogy egy adott menüpontot kiválasztva egy verziót másol a helyére, másikat választva meg másikat?
Vagy máshogy?

(Konkrétan az /etc/network/interfaces fájlról van szó: más hálózati környezetben más beállításokkal kellene bootolnia a gépnek, más interface-en át csatlakozni a default gw-hez.)

Köszönöm, ha okosat szólsz.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

A grub parancsok között nem láttam ilyet. Viszont szerintem átadható a kernel paraméterek között olyan infó, amit a kernel semmire sem használ, de az oprendszer alatt kiolvasható, s ez alapján a file létrehozható, a hálózati szolgáltatás újraindítható.

A Grubban pedig ugyanaz a kernel különféle paraméterekkel külön menüpontokban szerepelne.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Az összes, a kernelnek a grub konfigban átadott kernel paraméter kiolvasható a /proc/cmdline-ból.
Ez alapján kell írni valami nagyon korai boot scriptet, ami kikeresi a neki szánt paramétert (fontos, hogy a /proc már mountolt legyen), és az alapján megnézi, hogy van-e tennivalója.

Igen, erre gondoltam, csak olyan paraméter kell, ami nincs hatással a kernel működésére, tehát csak átadja, de nem csinál vele semmit.


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Valamikor nagyon regen csinaltam ilyet: egy init szkript feldobott egy menut a juzernek, hogy mit szeretne, letarolta egy file-ban, majd az ifup mapping segitsegevel beallitotta a kivant halozati kornyezetet.

Az /etc/network/interfaces igy nezett ki:

auto eth0
mapping eth0
        script /etc/network/check-network-mode
        map VPN eth0-vpn
        map MediaConv eth0-mediaconv
        map Full eth0-full

auto eth1
mapping eth1
        script /etc/network/check-network-mode
        # map VPN eth1-vpn
        # map MediaConv eth1-mediaconv
        map Full eth1-full

#
# VPN mode (VPN, IPX only)
#

iface eth0-vpn ipx static
        frame 802.3
        netnum 0x48507431

#
# Media converter mode (no VPN, IP only)
#

iface eth0-mediaconv inet static
        address 192.168.190.254
        netmask 255.255.255.0
        network 192.168.190.0
        broadcast 192.168.190.255

#
# Full mode (VPN, IP+IPX)
#

iface eth0-full ipx static
        frame 802.3
        netnum 0x48507431

iface eth1-full inet static
        address 192.168.190.254
        netmask 255.255.255.0
        network 192.168.190.0
        broadcast 192.168.190.255

Az /etc/network/check-network-mode szkript pedig:

#! /bin/bash

# Network mode file
NETWORK_MODE_FILE="/var/run/network-mode"

INTERFACE="$1"

if [ -f "$NETWORK_MODE_FILE" ]; then
  . "$NETWORK_MODE_FILE"
fi
[ -z "$NETWORK_MODE" ] && exit 1

while read condition scheme; do
  if [ "$condition" = "$NETWORK_MODE" ]; then
    which="$scheme"
    break
  fi
done

if [ -n "$which" ]; then
  echo "$which"
  exit 0
else
  exit 1
fi

A /var/run/network-mode file-t eloallito init szkript neked marad hazi feladatnak :-)

Többek között épp azért kell, hogy másképp azonosítsuk a júzert. Még az előtt kell, hogy azonosítani kellene.

Nem ertem, hogy mit nem ertesz :-)

Mielott beallitanad a halozatot (/etc/init.d/networking), elinditod az uzemmod-valaszto szkriptet (ha nagyon szeretned, grub-bol is at tudsz adni parametereket, de azt csak akkor valasztanam, ha a kernel vagy a kernel parameterei is kulonbozoek kell legyenek, amugy egyszerubb egy init szkript).

Az a lenyeg, hogy az /etc/init.d/networking altal meghivott ifup altal meghivott /etc/network/check-network-mode szkript el tudja donteni, hogy eppen milyen uzemmodban akarsz mukodni. Utana mar az ifup dolga felhuzni a megfelelo interfeszeket (pl. eth0-home, eth0-work).

Öööö. Lehet, hogy csak nem figyeltem? :)

Köszi!

A check-network-mode scripted nézhetné a /proc/cmdline fájlt - abba meg az kerül, ami a grub-ban aktuálisan kiválasztott menünél a kernel sorban található - oda meg berakható tetszőleges olyan plusz paraméter, amit a kernel nem értelmez - azt ugyanis szépen figyelmen kívül hagyja - viszont a boot után a procfs-ben ott figyel majd.

A "más hálózati környezet" nem deríthető ki automatikusan? Ha kideríthető, inkább ebbe az irányba indulnék el.

Mármint a boot során kell a helyére kerülnie az adott fájlnak :-P Erre CentOS/RHEL alatt én a /etc/rc.d/rc.sysinit patkolását (frissítésnél lecserélődhet, úgyhogy reboot előtt ellenőrizni/javítani kell) hasnzáltam - a trükk annyi hozzá, hogy a grub menüben a "kernel" sort kiegészítettem egy (vagy több) paraméterrel, például:

kernel /vmlinuz-2.6.18-xxx ro root=/dev/sda2 pamparam=PARAMPAM

és az rc.sysinit-ben ezt a plusz stringet kell keresni a /proc/cmdline fájlban.