raid1 vasaló

Ma megint op.rendszer költöztetés raid1-re volt terítéken.

Ilyenkor tartózkodnak a múltkori emlékek a hibátlan rövidtávú és hibátlan hosszútávú emlékezetek közötti határvidéken a dzsumbujban. Mi a túró volt a másolással? Kiderül, hogy mégsem a "cat" nem a "dd" és nem is a "cp" hanem az mc volt a nyerő. Aztán meg cfdisk, sfdisk, és mi volt a grubbal, meg az MasterBootRecord-dal?

Ennek vége, összeszedtem magam, és gatyába ráztam a raid1 tükör szülészetet az alábbi scripttel.
Mukod rendesen /dev/sdb-t lerendezi hibátlanul.
Utána arról indul féllábú ahogy kell.

Nincs vele semmi bajom, de azért kiraktam ide - lehet cincálni, stílust igazítani. Ez most nem rosszindulatú megjegyzés.

szerk. 2009. november 15., vasárnap - 02.56

Maradtak benne hülyén elkövetett vagy felesleges dolgok.
Ha le van sikálva - beleértve a javasolt változtatásokat - akkor a végső formában lesz kirakva.
(és akkor nem látszik majd, hogy mit - csak az, hogy mire javítottam)


#!/bin/sh
# raid1 lemeztükör generálása 
# nem általános, hanem a kialakult gyakorlatomhoz írva
# a másolandó rendszer ismeretében

if ! [ "$1" = "execute" ]; then 
  echo 'Simon nem mondta, hogy "execute"'; exit; fi

d_parts='1 2 3 5 6 7 8 9 10'

d_src='/dev/sda'
d_tgt='/dev/sdb'
log_name='raid1_gen.log'

log_f='./'$log_name
dir_s='/mnt/sd_rx'
dir_d='/mnt/md_rx'

echo $DATE | tee $log_f
echo "---------------------------------------------" | tee -a $log_f
echo "Raid1 féllábú tömb létrehozása "$d_tgt"-n" | tee -a $log_f
echo "---------------------------------------------" | tee -a $log_f
sfdisk -d $d_tgt | tee $log_f
echo "---------------------------------------------" | tee -a $log_f
echo -n "A "$d_tgt" összes adata elvész. Folytatjuk? (nem/igen) " | tee -a $log_f
read persze
if ! [ "$persze" = "igen" ]; then exit; fi
echo " " | tee -a $log_f
echo "---------------------------------------------" | tee -a $log_f

function fs_md () {
  echo -n "md$1 " | tee -a $log_f
  mdadm -C /dev/md$1 -f -l 1 -n 2 $2$1 missing | tee -a $log_f
  mdadm --detail /dev/md$1 | tee -a $log_f
}

function fs_ext3 () {
  fs_md $1 $3 
  echo -n "($2""$1): " | tee -a $log_f
  mkfs.ext3 /dev/md$1 | tee -a $log_f
}

function fs_swap () {
  fs_md $1 $3
  echo -n "($2""$1): " | tee -a $log_f
  mkfswap /dev/md$1 | tee -a $log_f
}

function fs_reiser () {
  fs_md $1 $3
  echo -n "($2""$1): " | tee -a $log_f
  mkreiserfs -f /dev/md$1 | tee -a $log_f
}

# start

# partíciós tábla másolása
sfdisk -d $d_src > /boot/grub/sd.part | tee -a $log_f
sfdisk $d_tgt < /boot/grub/sd.part | tee -a $log_f

# mbr másolása
dd if=$d_src of=/boot/grub/sd.mbr bs=512 count=1 | tee -a $log_f
dd if=$d_src of=$d_tgt bs=512 count=1 | tee -a $log_f

# munkakönyvtárak létrehozása
mkdir $dir_s
mkdir $dir_d
echo "===================================" | tee -a $log_f

for part in $d_parts ; do
# partíció beállítása: autolinux-raid
  sfdisk --change-id $d_tgt $part fd | tee -a $log_f
# formázás, raid1-félláb
  case $part in
    1) fs_ext3   $part $d_src $d_tgt $dir_s $dir_d ;;
    2) fs_swap   $part $d_src $d_tgt ;;
    3) fs_ext3   $part $d_src $d_tgt $dir_s $dir_d ;;
    *) fs_reiser $part $d_src $d_tgt $dir_s $dir_d ;;
  esac
  echo "--------------------------------" | tee -a $log_f
# lemeztartalom másolása
  case $part in
    2) ;;
    *)
       mount -v -a $d_src$part $dir_s | tee -a $log_f
       mount -v -a /dev/md$part $dir_d | tee -a $log_f
#      dd-vel, cat-tal előbb elfogy a hely, 
#      mert md lefoglal plusz területet a pertícióból
#      cp nem úgy működik, ahogy nekem kéne, tehát meg kellett írni
       cd $dir_s
       ls -a >> $log_f
       lista=`ls -a`	# ezt hrgy84 nem szeresse :-)
       for lst_ in $lista; do
         case "$lst_" in 
            ".") ;; 
            "..") ;;
            *) cp -a $dir_s'/'$lst_ $dir_d'/'$lst_ | tee -a $log_f ;;
         esac
       done
       cd ~
       umount -v $dir_s | tee -a $log_f
       umount -v $dir_d | tee -a $log_f
       ;;
  esac
done

# a /boot könyvtár nálam mindig az 1-es partíción van
mount -a /dev/md1 $dir_d | tee -a $log_f
dir_g=$dir_d'/boot/grub'
sfdisk -d $d_tgt > $dir_g'/sd.part' | tee -a $log_f
dd if=$d_tgt of=$dir_g'/sd.mbr' bs=512 count=1 | tee -a $log_f
# a menu.lst-ben átírni sda-t md-re
cd $dir_g
mv ./menu.lst menu.tmp
sed -e 's/sda/md/g' ./menu.tmp > ./menu.lst
rm ./menu.tmp
umount $dir_d | tee -a $log_f

# done
echo -n 'Done: ' | tee -a $log_f
date | tee -a $log_f

mount -a /dev/md3 $dir_d
# fstab  sdax -> mdx
cd $dir_d'/etc'
mv ./fstab fstab.tmp
sed -e 's/sda/md/g' ./fstab.tmp > ./fstab
rm ./fstab.tmp
# a raid1_gen.log-ot is rútul átmásolom
cd ~
cat $log_f > $dir_d'/root/'$log_name
# ha benn maradok foglalt lesz a dev, és nincs umount
cd ~
umount $dir_d

# munkakönyvtárak törlése
rmdir $dir_s
rmdir $dir_d
# csakugyan done.

Hozzászólások

Szerintem cd-zes helyett egyszerubb abszolut utvonalakat megadni. Foleg hogy valtozokban tarolod a konyvtarneveket...

1) Szeretnem tudni, hogy ez micsoda:


echo -n "($2""$1): "

mikor ez egyszerubb helyette:


echo -n "($2 $1): "

de egyaltalan, minek adsz at valami parametert, amit utana lenyegeben fel sem hasznalsz? Ez igy total illogikus. Foleg, hogy a main szekcioban deklaralt valtozok siman elerhetok a fuggvenyekbol is, raadasul ugy, hogy nem kell elore definialni oket.

2) Miert nincs user ellenorzes? En siman kilepnek !root futtataskor, mert csak hibakkal szornam tele a kepernyot. Sajnos a shell scriptek nem lepnek ki az elso hibanal.

Holnap meg biztos ranezek a scriptre, igy elso blikkre ennyi.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

1)
- valamit itt még kiírtam az alkotás elején, aztán megszüntetvén a szófosást így hagytam.
mit'tomén minek meghagyom így:

 echo -n "($2$1): "

- ez még onnan maradhatott benne mikor az alatta levő sor még nem volt végrehajtási szinten csak echo-zva volt, hogy lássam mit-mikor akarok elkövetni (aztán így maradt) - erre használtam a "$2"-t

2) nem kellett mert (és nem is jutott eszembe):
- a script még nem hagyta el a root home könyvtárt
- nincs benne a path-ban
A rend kedvéért persze belerakom egészen az elejére.

rsync, es az atvisz minden szuksegest.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Így jár az (meg én) aki nem jut el a man-ban idáig:
You can also use rsync in local-only mode, where both the source and destination don't have a ':' in the name. In this case it behaves like an improved copy command.

szerk.
Aztán sajnos eljut egy ilyen eredményhez is:


  a 'cp -r /a /b' /a-t /b/a-ba másolja és 
  a /a/x-et /b/a/x-be akkor, ha a /b létezik, 
  de /a-t /b-be és /a/x-et /b/x-be helyezi, 
  ha korábban nem volt /b könyvtár. 

Nekem viszont van, mert ide mountoltam /dev/mdx-et :-(