noob met bash scripten
Ondanks dat ik al weer een lange tijd een fervent gebruiker van linux op de desktop ben, heb ik nog maar weinig met de ware kracht van linux geëxperimenteerd.
MIjn eerste ervaring met linux was het installeren van Freesco op een 386. Dit zal ergens in 1999 zijn geweest. Later (2001) mezelf voor een uitdaging gesteld door installatie-cd van Slackware 8 aan te schaffen. Mijn idee hier achter was het uitproberen van linux op de desktop. Na veel uit te proberen, en vooral lezen is het gelukt, maar de definitieve overstap van Windows naar een linux-desktop kwam in 2004, met de introductie van Ubuntu. 4.10 kwam, zag en overwon op mijn desktop. Sindsdien niet meer anders.
Nu heb ik een aantal weken geleden een nieuwe laptop aangeschaft, en hierop heb ik Ubuntu 8.04 geïnstalleerd. Ook hier weer de spreekwoordelijke trein. Aangezien ik behoorlijk wat zooi op een nfs-server heb staan, wil ik deze regelmatig aanroepen op mijn laptop. Nu kan dat natuurlijk makkelijk door /etc/fstab aan te passen, en daarna sudo mount /media/Files en sudo umount /media/Files te gebruiken, maar ik dacht dat het met een scriptje makkelijker moet kunnen.
Zie hier mijn eerste bashscript:
code:
Waarschijnlijk is het nodeloos complex, maar het werkt. Enige aanvullingen?
MIjn eerste ervaring met linux was het installeren van Freesco op een 386. Dit zal ergens in 1999 zijn geweest. Later (2001) mezelf voor een uitdaging gesteld door installatie-cd van Slackware 8 aan te schaffen. Mijn idee hier achter was het uitproberen van linux op de desktop. Na veel uit te proberen, en vooral lezen is het gelukt, maar de definitieve overstap van Windows naar een linux-desktop kwam in 2004, met de introductie van Ubuntu. 4.10 kwam, zag en overwon op mijn desktop. Sindsdien niet meer anders.
Nu heb ik een aantal weken geleden een nieuwe laptop aangeschaft, en hierop heb ik Ubuntu 8.04 geïnstalleerd. Ook hier weer de spreekwoordelijke trein. Aangezien ik behoorlijk wat zooi op een nfs-server heb staan, wil ik deze regelmatig aanroepen op mijn laptop. Nu kan dat natuurlijk makkelijk door /etc/fstab aan te passen, en daarna sudo mount /media/Files en sudo umount /media/Files te gebruiken, maar ik dacht dat het met een scriptje makkelijker moet kunnen.
Zie hier mijn eerste bashscript:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| #!/bin/bash
#***********************************************#
# mount.sh #
# written by loreom #
# July 20, 2008 #
#***********************************************#
# script om nfs shares te mounten
# variables
SERVER_IP="10.0.1.6"
SHARE_1="/shared/media"
SHARE_2="/shared/files"
MOUNTPOINT_1="/media/Media"
MOUNTPOINT_2="/media/Files"
TYPE="-t nfs"
OPTIONS="-o tcp,rsize=8192,wsize=8192,intr,rw,bg,nosuid,port=2049,mountport=65003"
# mount shares
mounting ()
{
sudo mount $TYPE $SERVER_IP":"$SHARE_1 $MOUNTPOINT_1 $OPTIONS
sudo mount $TYPE $SERVER_IP":"$SHARE_2 $MOUNTPOINT_2 $OPTIONS
}
# umount shares
umounting ()
{
sudo umount $MOUNTPOINT_1 $MOUNTPOINT_2
}
## check status
# controle door mount te greppen op shares en dit in mount.log op te slaan
# md5sum controle of mount.log overeenkomst met mount.md5
# mount.md5 bevat md5 hash van mount.log indien shares gemount zijn
# dus als mount.md5test niet gelijk is aan mount.md5 zijn de shares niet gemount
# tmpfiles aanmaken
touch mount.log
touch mount.md5test
# tmpfiles vullen
mount | grep $MOUNTPOINT_1 > mount.log
mount | grep $MOUNTPOINT_2 >> mount.log
md5sum mount.log > mount.md5test
# md5sum test
if (diff mount.md5 mount.md5test > /dev/null)
then
echo "unmounting shares"
umounting
else
echo "mounting shares"
mounting
fi
# tmpfiles verwijderen
rm mount.log
rm mount.md5test
exit |
Waarschijnlijk is het nodeloos complex, maar het werkt. Enige aanvullingen?
|
|
Eindelijk....? |
Reacties
Je zou de mount status ook kunnen testen door iets met het commando 'mount'
code:
code:
1
2
3
4
| rick@kobalt:~$ DEVICE='/dev/sda1' ; OUTPUT=`mount | grep ${DEVICE} | wc -l` ; if [ ${OUTPUT} -eq 1 ]; then echo "Device mounted" ; else echo "Device not mounted" ; fi
Device mounted
rick@kobalt:~$ DEVICE='/dev/sdz1' ; OUTPUT=`mount | grep ${DEVICE} | wc -l` ; if [ ${OUTPUT} -eq 1 ]; then echo "Device mounted" ; else echo "Device not mounted" ; fi
Device not mounted |
Ook pas met bash aan de gang gegaan, dit was mijn manier om te testen of een mount bestond, gewoon de map waar de mount aan gekoppeld is uitlezen en als dit niks teruggeeft is de mount niet aanwezig.
code:
code:
1
2
3
4
5
6
7
8
9
10
11
| mnttst=`ls /mnt/media`;
#controle of lokale mount locatie te lezen
#Controleren of de mount aanwezig is.
if [ "$mnttst" != "" ]
then
echo "mount is aanwezig, geen actie nodig.";
else
echo "mount niet aanwezig, begin mount actie.";
mount 10.0.1.6:/shared/media /mnt/media
fi; |
@Pumbaa82,
Je oplossing lijkt eenvoudiger, maar is naar mijn idee niet helemaal volledig. Wat nu als de mount wel aanwezig is, maar de share geen gegevens bevat. Dan zal jouw oplossing alsnog proberen de share te mounten.
Je oplossing lijkt eenvoudiger, maar is naar mijn idee niet helemaal volledig. Wat nu als de mount wel aanwezig is, maar de share geen gegevens bevat. Dan zal jouw oplossing alsnog proberen de share te mounten.
Speel eens met autofs.
Met name de executable map '/etc/auto.net'. Deze is erg makkelijk voor het dynamisch mounten van nfs-exports. De filesystems worden dan gemount onder '/net/<hostname>/<pad naar het geexporteerde filesystem>'.
In jou geval dus '/net/10.0.1.6/shared/media' en '/net/10.0.1.6/shared/files'
Met name de executable map '/etc/auto.net'. Deze is erg makkelijk voor het dynamisch mounten van nfs-exports. De filesystems worden dan gemount onder '/net/<hostname>/<pad naar het geexporteerde filesystem>'.
In jou geval dus '/net/10.0.1.6/shared/media' en '/net/10.0.1.6/shared/files'
Je zou ook eens kunnen experimenteren met NFS4.
Die is een stuk sneller en robuster wanneer de serverkant ineens onbereikbaar is, wat met een laptop niet ondenkbaar is.
Met NFS4 kun je een hele export-structuur ineens mounten.
NFSv4 exporteren
NFSv4 heeft een paar nieuwe dingen, waaronder het kunnen exporteren van losse filesystemen in 1 path, zodat je op een machine eigenlijk alleen maar 1 mount hoeft te doen om alle onderliggende exports te mounten.
Voorbeeld /etc/exports :
code:
NFSv4 mounten
Een voorbeeld voor het definieren van mounts in de fstab:
code:
Snelheid NFSv4
De metingen met bonnie++ (filesystembenchmark) zijn gedaan op een NFSv4 mount naar de fileserver over gbit.
code:
Problemen onder Debian
Het mounten onder Debian gaat fout tijdens het booten, dus als omweg kun je dit proberen: Een file (executable) /etc/init.d/mymount
code:
En een symlink vanuit het gewenste runlevel naar dat scriptje:
code:
Omdat het mounten het booten heel erg vertraagd en uiteindelijk alsnog faalt, is de optie noauto nodig in de fstab.
Je kunt de structuur in de export-tree ook samenstellen met de --bind optie van mount. Dan kun je bijv je /home ook mounten op /nfsexports.
Die is een stuk sneller en robuster wanneer de serverkant ineens onbereikbaar is, wat met een laptop niet ondenkbaar is.
Met NFS4 kun je een hele export-structuur ineens mounten.
NFSv4 exporteren
NFSv4 heeft een paar nieuwe dingen, waaronder het kunnen exporteren van losse filesystemen in 1 path, zodat je op een machine eigenlijk alleen maar 1 mount hoeft te doen om alle onderliggende exports te mounten.
Voorbeeld /etc/exports :
code:
1
2
3
4
5
| /nfs4exports 192.168.1.0/24(ro,sync,insecure,root_squash,no_subtree_check,fsid=0) /nfs4exports/data 192.168.1.0/24(rw,nohide,sync,insecure,root_squash,no_subtree_check) /nfs4exports/home 192.168.1.0/24(rw,nohide,sync,insecure,no_root_squash,no_subtree_check) /nfs4exports/ftp 192.168.1.0/24(rw,nohide,sync,insecure,root_squash,no_subtree_check) /nfs4exports/www 192.168.1.0/24(rw,nohide,sync,insecure,root_squash,no_subtree_check) |
NFSv4 mounten
Een voorbeeld voor het definieren van mounts in de fstab:
code:
1
2
3
4
5
6
7
8
| # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> /dev/xvda1 / ext3 rw,noatime 0 1 /dev/xvdb1 none swap defaults 0 0 192.168.1.5:/ftp /FTPmap nfs4 rw,_netdev,noauto 0 0 192.168.1.5:/home /home nfs4 rw,_netdev,noauto 0 0 192.168.1.5:/www /www nfs4 rw,_netdev,noauto 0 0 |
Snelheid NFSv4
De metingen met bonnie++ (filesystembenchmark) zijn gedaan op een NFSv4 mount naar de fileserver over gbit.
code:
1
2
3
4
5
6
7
8
9
| Version 1.03 ------Sequential Output------ --Sequential Input- --Random-
-Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks--
Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP
mailserver 2560M 51158 82 45530 5 26788 3 45326 73 60513 2 283.8 0
------Sequential Create------ --------Random Create--------
-Create-- --Read--- -Delete-- -Create-- --Read--- -Delete--
files /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP /sec %CP
16 253 0 11048 2 666 0 295 0 12370 0 697 0
mailserver,2560M,51158,82,45530,5,26788,3,45326,73,60513,2,283.8,0,16,253,0,11048,2,666,0,295,0,12370,0,697,0 |
Problemen onder Debian
Het mounten onder Debian gaat fout tijdens het booten, dus als omweg kun je dit proberen: Een file (executable) /etc/init.d/mymount
code:
1
2
3
4
| #!/bin/bash mount /FTPmap mount /home mount /www |
En een symlink vanuit het gewenste runlevel naar dat scriptje:
code:
1
2
| webserver:~# ls -l /etc/rc2.d/ |grep mymount lrwxrwxrwx 1 root root 17 Mar 17 10:30 S99mymount -> ../init.d/mymount |
Omdat het mounten het booten heel erg vertraagd en uiteindelijk alsnog faalt, is de optie noauto nodig in de fstab.
Je kunt de structuur in de export-tree ook samenstellen met de --bind optie van mount. Dan kun je bijv je /home ook mounten op /nfsexports.
@TD-er, ik zal eens gaan kijken naar NFSv4. Voorlopig doet mijn scriptje wat ie moet doen, nl met 1 commando mijn shares mounten / unmounten op het moment dat ik het aanroep. Ik heb niet altijd een netwerk, en dan gaat het sowieso niet lukken, en vanaf een andere locatie zal ik toch eerst een VPN verbinding open moeten hebben.
Om te kunnen reageren moet je ingelogd zijn. Via deze link kun je inloggen als je al geregistreerd bent. Indien je nog geen account hebt kun je er hier één aanmaken.