Linux::FAQ en Oplossingen
In deze sectie aantekeningen over uitgevoerde projecten.
Extra harde schijf toevoegen
- Monteer extra harde schijf, start PC en verifieer herkenning in de BIOS
- Start ClearOS systeem en controleer Linux herkenning via PuTTY:
# dmesg (opstartlog) - Maak partitie op extra schijf (in dit voorbeeld de derde HDD: 'sdc'). Zie ook Linux::Bestandssystemen FDISK
# fdisk /dev/sdc
kies optie : n (nieuw) kies : primair kies : 1 (voor sdc1) specificeer start en eindblok of selecteer geboden defaults kies optie : w (write/opslaan) - Formatteer partitie
# mkfs -t ext3 /dev/sdc1 - Maak een directory aan in de root (in voorbeeld 'vault' genoemd) met beperkte rechten voor usergroep 'backup' en geen enkele voor 'iedereen'
# mkdir /vault
# chmod 750 /vault
# chown root:backup /vault - Voeg een instructie toe aan '/etc/fstab' voor het koppelen van '/vault' aan sdc1:
/dev/sdc1 /vault ext3 defaults 1 2
Zie ook fstab wiki - Voer de fstab mount uit:
# mount -a - In het voorbeeld is het de bedoeling dat samba user 'backup' de door root in '/vault' geplaatste backups kan lezen en kopieren. Dit kan vrij eenvoudig geregeld worden door een symbolic link te plaatsen in de samba share '/home/backup'. Zie ook sectie Samba: Samba Network File Server
# cd /home/backup
# ln -s /vault
Verhuizen van bijvoorbeeld /HOME naar eigen partitie of andere HDD
- Zie sectie Extra harde schijf toevoegen items 1 t/m 4 voor het aanmaken van een partitie (in dit voorbeeld 'sdc2')
- CD naar root, maak directory '/newhome' en koppel deze aan 'sdc2':
# cd /
# mkdir /mnt/newhome
# mount -t ext3 /dev/sdc2 /mnt/newhome - Kopieer de inhoud van '/home' directory naar '/mnt/newhome' op de nieuwe partitie
Omdat de '/home' directory hardlinks, softlinks, bestanden en geneste directories kan bevatten zal een gewone copy 'cp' de taak misschien niet compleet uitvoeren. Het is beter het commando 'cpio' te gebruiken.
Zie hiervoor ook: http://www.gnu.org/software/cpio/manual/cpio.pdf
# cd /home/
# find . -depth -print0 | cpio --null --sparse -pvd /mnt/newhome
# cd /
Zie kader 'cpio' voor uitleg van gebruikte opties - Verifieer dat alles correct gecopieerd is.
- Ontkoppel de nieuwe partitie 'sdc2':
# umount /mnt/newhome - Ontkoppel /home. Omdat deze aktief is moet deze 'losgewerkt' worden van het systeem. Dit wordt gedaan met optie -l (lazy)
# umount -l /home - Hernoem de losgemaakte /home naar '/oldhome' en maak een nieuwe /home aan
# mv /home /oldhome
# mkdir /home - Nu kan de nieuwe /home gekoppeld worden aan 'sdc2'
# mount /dev/sdc2 /home - Maak deze mount automatisch door de volgende regel toe te voegen aan /etc/fstab:
/dev/sdc2 /home ext3 defaults 1 2
In fstab is vaak sprake van 'LABEL', zie voor meer informatie hierover:
http://wiki.sabayon.org/index.php?title=HOWTO:_UUID_and_Volumes - Voer fstab uit:
# mount -a - Reboot linux en check dat alles werkt.
- Verwijder '/oldhome' en '/mnt/newhome'
|
/HOME van aparte partitie terugzetten naar systeempartitie 'sda1'
Het terugzetten van '/home' wordt als voorbeeld gebruikt. Kan uitgevoerd worden met elk koppelpunt dat tot nu toe een eigen partitie heeft.
- Maak een directory 'newhome' in de root:
# mkdir /newhome
Zorg dat op sda1 nog voldoende ruimte is voor het datavolume van '/home' - Kopieer de inhoud van '/home' naar '/newhome':
# find . -depth -print0 | cpio --null --sparse -pvd /newhome
Zie voor uitleg kader CPIO - Verwijder regel uit '/etc/fstab' betreffende koppelpunt van '/home'
- Ontkoppel '/home'. Omdat deze aktief is moet deze 'losgewerkt' worden van het systeem. Dit wordt gedaan met optie -l (lazy)
# umount -l /home - Maak plaats voor nieuwe home:
# rmdir /home - Plaats nieuwe /home:
# mv /newhome /home - Run aangepaste fstab:
# mount -a - De oorspronkelijke aparte partitie van '/home' (in voorbeeld vorige sectie was dat 'sdc2') kan nu verwijderd of leeggemaakt/geformatteerd worden.
Wijzig grootte van Partitie and Filesysteem met behoud van data
Het verkleinen en vergroten van een partitie en het bijbehorende bestandssysteem met daarin data is mogelijk met e2fsck. resize2fs en fdisk.
Zie optioneel # man resize2fs
Belangrijk:
- Om te vergroten moet er genoeg diskruimte vrij zijn, dwz er moeten genoeg cilinders en sectoren vrij zijn aan het einde van de disk.
- Om te verkleinen moet er voldoende vrije ruimte zonder data in het bestandssysteem zijn.
- Het is met navolgende methode niet mogelijk het begin van een partitie en bestandssyteem te verplaatsen zonder alle data te verliezen!
Voor navolgende voorbeelden hebben we de drive /dev/sdc van de testserver gebruikt.
Deze harddisk van 500GB heeft 1 partitie sdc1 met een bestandsysteem van 459G. Hiervan is 169G in gebruik met data.
[root@testserver ~]# df -h
Bestandssysteem Grtte Gebr Besch Geb% Aangekoppeld op
/dev/sda1 9,5G 442M 8,6G 5% /
/dev/sda2 28G 1,3G 25G 5% /usr
/dev/sda3 92G 1,8G 86G 2% /var
/dev/sdb1 459G 169G 268G 39% /home
/dev/sdc1 459G 169G 267G 39% /vault
tmpfs 2,0G 0 2,0G 0% /dev/shm
Er zijn geen vrije cilinders/sectoren aan het einde van de schijf en vergroten is dus niet mogelijk. Daarom laten we eerst het verkleinen als voorbeeld zien.
Verklein partitie met behoud van data
We gaan de partitie met het bestandssysteem /dev/sdc1 verkleinen van 459G naar +/- 300G. Er blijft dan voldoende vrije ruimte voor de data.
1. Unmount het bestandssysteem en verifiëer
[root@testserver ~]# umount /dev/sdc1 [root@testserver ~]# df -h Bestandssysteem Grtte Gebr Besch Geb% Aangekoppeld op /dev/sda1 9,5G 442M 8,6G 5% / /dev/sda2 28G 1,3G 25G 5% /usr /dev/sda3 92G 1,8G 86G 2% /var /dev/sdb1 459G 169G 268G 39% /home tmpfs 2,0G 0 2,0G 0% /dev/shm
2. Run e2fsck op /dev/sdc1
Het eerst uitvoeren van deze check van het bestandssyteem is een vereiste voor het hierna volgende resize2fs.
WARNING!!! Running e2fsck on a mounted filesystem may cause SEVERE filesystem damage.
[root@testserver ~]# e2fsck -f /dev/sdc1
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdc1: 167085/61063168 files (15.8% non-contiguous), 46216404/122096000 blocks
3. Resize het bestandssyteem met resize2fs
Nu kan het bestandssysteem verkleind worden naar 300G
[root@testserver ~]# resize2fs /dev/sdc1 300G
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/sdc1 to 78643200 (4k) blocks.
Het bestandssysteem op /dev/sdc1 is nu 78643200 blokken groot.
Let op: Het eindresultaat is 78643200 blocks van 4k of te wel 314,6G. Omdat de partitie ook nog de nodige superblocks moet bevatten moeten we ook nog rekenen op 3%-5% ruimteverlies. Maak daarom de partitie niet kleiner dan 314,6G + 5% = 330G
4. Delete de partitie
Om de partitie te wijzigen moeten we deze eerst deleten en dan een nieuwe creëren.
Check eerst wat de eerste cilinder van de huidige partitie is, dit hebben we nodig voor het aanmaken van de nieuwe partitie.
[root@testserver ~]# fdisk /dev/sdc Het aantal cylinders van deze schijf is ingesteld op 60801. Hier is niets mis mee, maar het is groter dan 1024, en kan met bepaalde instellingen problemen veroorzaken met: 1) software die werkt bij het opstarten (bijv. oude versies van LILO) 2) opstart- en partitioneringssoftware van andere besturings- systemen, zoals DOS FDISK en OS/2 FDISK Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem /dev/sdc1 1 60801 488384001 83 Linux Opdracht (m voor hulp): d Geselecteerde partitie 1 Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem Opdracht (m voor hulp): w De partitietabel is gewijzigd! Aanroepen ioctl() om partitietabel opnieuw in te lezen. Synchroniseren schijven.
5. Creëer nieuwe (kleinere) partitie
Niet kleiner dan 330G zoals uitgelegd in punt 3! Bij een te kleine partitie zal de systeemboot crashen.
Zorg ervoor dat de eerste cilinder dezelfde blijft, zijnde het ankerpunt van het bestandssysteem en de data hierin.
[root@testserver ~]# fdisk /dev/sdc Opdracht (m voor hulp): n Opdracht actie e uitgebreid p primaire partitie (1-4) p Partitienummer (1-4): 1 Eerste cylinder (1-60801, standaard 1): 1 Laatste cylinder of +size of +sizeM of +sizeK (1-60801, standaard 60801): +330G Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem /dev/sdc1 1 40121 322271901 83 Linux Opdracht (m voor hulp): w De partitietabel is gewijzigd! Aanroepen ioctl() om partitietabel opnieuw in te lezen. Synchroniseren schijven.
Deze nieuwe partitie gebruikt nu van de 60801 cilinders op de harde schijf de eerste 40121 cilinders en blijven er aan het einde nog 20680 cilinders beschikbaar voor een extra partitie.
6. Reboot het systeem
We zouden de partitie nu kunnen mounten met het # mount commando, maar het is beter een reboot te doen omdat dan direct aan het licht komt of alles goed is gegaan. Als we de partitie bijvoorbeeld toch nog te klein hebben gemaakt zal de boot crashen en moeten we de zaak oplossen door een monitor en keyboard op de server aan te sluiten.
Note: In dit geval zijn de data niet verloren! Blijf rustig en voer op de monitor van de server onderstaand voorbeeld uit van het vergroten van de partitie, te beginnen bij punt 2.
Na een succesvolle reboot lezen we de bestandssystemen uit
[root@testserver ~]# df -h
Bestandssysteem Grtte Gebr Besch Geb% Aangekoppeld op
/dev/sda1 9,5G 446M 8,6G 5% /
/dev/sda2 28G 1,3G 25G 5% /usr
/dev/sda3 92G 1,8G 86G 2% /var
/dev/sdb1 459G 169G 268G 39% /home
/dev/sdc1 296G 169G 112G 61% /vault
tmpfs 2,0G 0 2,0G 0% /dev/shm
Vergroot partitie met behoud van data
We gaan de hierboven verkleinde partitie met het bestandssysteem /dev/sdc1 (terug) vergroten naar de volle schijfcapaciteit.
1. Unmount het bestandssysteem en verifiëer
[root@testserver ~]# umount /dev/sdc1 [root@testserver ~]# df -h Bestandssysteem Grtte Gebr Besch Geb% Aangekoppeld op /dev/sda1 9,5G 446M 8,6G 5% / /dev/sda2 28G 1,3G 25G 5% /usr /dev/sda3 92G 1,8G 86G 2% /var /dev/sdb1 459G 169G 268G 39% /home tmpfs 2,0G 0 2,0G 0% /dev/shm
2. Delete de partitie.
Om de partitie te wijzigen moeten we deze eerst deleten en dan een nieuwe creëren.
Check eerst wat de eerste cilinder van de huidige partitie is, dit hebben we nodig voor het aanmaken van de nieuwe partitie.
[root@testserver ~]# fdisk /dev/sdc Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem /dev/sdc1 1 40121 322271901 83 Linux Opdracht (m voor hulp): d Geselecteerde partitie 1 Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem Opdracht (m voor hulp): w De partitietabel is gewijzigd! Aanroepen ioctl() om partitietabel opnieuw in te lezen. Synchroniseren schijven.
3. Creëer nieuwe (grotere) partitie
Zorg ervoor dat de eerste cilinder dezelfde blijft, zijnde het ankerpunt van het bestandssysteem en de data hierin.
[root@testserver ~]# fdisk /dev/sdc Opdracht (m voor hulp): n Opdracht actie e uitgebreid p primaire partitie (1-4) p Partitienummer (1-4): 1 Eerste cylinder (1-60801, standaard 1): 1 Laatste cylinder of +size of +sizeM of +sizeK (1-60801, standaard 60801): Standaardwaarde 60801 wordt gebruikt Opdracht (m voor hulp): p Schijf /dev/sdc: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Eenheden = cylinders van 16065 * 512 = 8225280 bytes Apparaat Boot Start Einde Blokken Id Systeem /dev/sdc1 1 60801 488384001 83 Linux Opdracht (m voor hulp): w De partitietabel is gewijzigd! Aanroepen ioctl() om partitietabel opnieuw in te lezen. Synchroniseren schijven.
Deze nieuwe partitie gebruikt nu van de 60801 cilinders op de harde schijf de eerste 40121 cilinders en blijven er aan het einde nog 20680 cilinders beschikbaar voor een extra partitie.
4. Run e2fsck op /dev/sdc1
Het eerst uitvoeren van deze check van het bestandssyteem is een vereiste voor het hierna volgende resize2fs.
WARNING!!! Running e2fsck on a mounted filesystem may cause SEVERE filesystem damage.
[root@testserver ~]# e2fsck -f /dev/sdc1
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdc1: 167085/39321600 files (15.8% non-contiguous), 45532276/78643200 blocks
5. Resize het bestandssyteem met resize2fs
Nu kan het bestandssysteem vergroot worden naar de capaciteit van de partitie.
Als geen grootte ingevoerd wordt wordt de hele capaciteit van de partitie benut.
[root@testserver ~]# resize2fs /dev/sdc1
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/sdc1 to 122096000 (4k) blocks.
Het bestandssysteem op /dev/sdc1 is nu 122096000 blokken groot.
6. Mount partitie en check
[root@testserver ~]# mount /dev/sdc1 /vault
[root@testserver ~]# df -h
Bestandssysteem Grtte Gebr Besch Geb% Aangekoppeld op
/dev/sda1 9,5G 446M 8,6G 5% /
/dev/sda2 28G 1,3G 25G 5% /usr
/dev/sda3 92G 1,8G 86G 2% /var
/dev/sdb1 459G 169G 268G 39% /home
tmpfs 2,0G 0 2,0G 0% /dev/shm
/dev/sdc1 459G 169G 267G 39% /vault
Externe HDD aansluiten met USB
- Sluit externe HDD aan op een USB poort
- # dmesg -> Zie aan het einde wat het nieuwe device is. Zoek naar een regel met iets als: sd 4:0:0:0: Attached scsi disk sdd . In ons voorbeeld is het nieuwe device dus 'sdd1'
- Mount device sdd1:
# cd /
# mkdir /mnt/usb-hdd
# mount -t ext3 /dev/sdd1 /mnt/usb-hdd
of als het een HDD met NTFS is:
# mount -t ntfs /dev/sdd1 /mnt/usb-hdd
In dit laatste geval moet er wel een driver voor het NTFS bestandssysteem geïnstalleerd zijn. Zie hiervoor Server::Configureren NTFS bestandssysteem
Draai Piwigo met de backup in /VAULT
Piwigo op mijn server slaat de data (foto's) op in /home/pwgdata en beheert deze data in de MySQL-MariaDb database 'piwigo'. Met behulp van een CRON maakt de server dagelijks een volledige backup van de directory '/home/pwgdata' en een dump van de MySQL database en deze worden weggeschreven naar /vault/piwigo/pwgdata. Zie hiervoor ook Piwigo::Backup.
Voor een restore van de Piwigo (foto)data moet zowel de complete ‘pwgdata’ directorie als de MariaDB ‘piwigo’ database teruggezet worden. Het is hierbij belangrijk dat beide op het zelfde moment gemaakt zijn, wat in dit geval door de dagelijkse backup gegarandeerd wordt.
Let op!!: Het is ook mogelijk Gallery op de testserver te 'klonen' met de backup van de mainserver (of omgekeerd).
Gebruik /vault als pwgdata vervanger van /home
In mijn webserver hebben zowel de /home als de /vault een eigen harde schijf. In het geval de harde schijf met de /home directory crashed of ernstig corrupt is, kan Piwigo vrij snel weer in de lucht gebracht worden door te switchen naar 'pwgdata' in de backup op /vault.
- Voor een restore is het beter te zorgen dat het oude bestand verwijderd is.
- Als het PIWIGO programma zelf nog wel werkt is het niet nodig deze te vervangen door de backup uit /vault.
- Om een restore te doen van PIWIGO is het voldoende de huidige lege of corrupte /home/pwgdata directories /_data, /galleries, /update, template-extensions en /local te verwijderen en te vervangen door hun respectievelijke laatste backups in /vault/piwigo/pwgdata
Note:
Door het grote datavolume van vooral de directorie 'galleries' zal dit kopieren erg lang duren. Als tussenoplossing kunnen we in dit stadium Piwigo laten draaien op de 'pwgdata'in de vault. Zie 'Overschakelen naar Vault' hieronder.
- Vervolgens moet de Piwigo database hersteld worden. Voer onderstaande commando's uit voor het droppen van de oude MariaDB piwigo database en het importeren van de sql-dump in de backup:
a. cd naar /vault/piwigo/pwgdata/dbase_dump met het laatste goede bestand 'piwigo-dump.sql'
b. # mysqladmin -uroot -p'' drop piwigo (verwijdert de oude 'piwigo')
c. # mysql -uroot -p'' < piwigo-dump.sql (importeert de backup 'piwigo') Hiermee is PiWiGo weer (tijdelijk) hersteld naar de situatie van de laatste backup.
Overschakelen naar Vault
In Piwigo hebben we SYMBOLIC LINKS gebruikt om de data op te slaan buiten de webroot in /home/pwgdata. Om snel in de lucht te zijn kunnen we in plaats van bovenstaande stap 3 eerst in het piwigo programma de symbolic links naar de probleembestanden verwijderen en deze vervangen met symbolic links naar de backups in Vault.
Bijvoorbeeld voor ../piwigo/galleries:
a.
# cd /var/www/html/piwigo
b. # unlink galleries
c. # ln -s /vault/piwigo/pwgdata/galleries galleries
d. Doe hetzelfde met _data, upload, template-extension en local.
Herstel nu de database zoals omschreven in bovenstaande stap 4. En op deze manier is Piwigo weer beschikbaar.
Tijdelijk!
Nu hebben we de server weer 'up and running' met Gallery maar hebben we nog niet alles opgelost. De gecrashte op gecorrumpteerde schijf moet zo spoedig mogelijk hersteld of vervangen worden. Tot die tijd is het belangrijk dat de automatische backup met CRON naar /vault niet uitgevoerd wordt. doe dit met # crontab -e
Uiteindelijk herstel
Kopiëer de fysieke backupbestanden naar Piwigo met een andere naam, bijvoorbeeld:
# cp -aR /vault/piwigo/pwgdata/galleries /home/pwgdata/bck-galleries
Op dezelfde manier kopiëren we _data, upload, template-extension en local.
Vervolgens stoppen we Piwigo en verwijderen we de symbolic links:
# unlink galleries
Zo ook voor _data, upload, template-extension en local
Als alle links verwijderd zijn hernoemen we de fysieke bestanden:
# rename bck-galleries galleries bck-galleries
Zo ook voor bck_data, bck-upload, bck-template-extension en bck-local
Herstel nu de oorspronkelijke symbolic links naar de data in /home/pwgdata
# ln -s /home/pwgdata/galleries galleries
Opnieuw ook voor _data, upload, template-extension en local
Hiermee is PiWiGo weer hersteld naar de situatie van de laatste backup!
Installatievoorbeeld Canon MP540 PRINTER met WEBMIN
Hiervoor is het nodig dat de printer beschikbaar is als LAN netwerkprinter of als gedeelde printer op 1 van de LAN netwerk PC's
Aangezien de server, beschreven op deze site, in headless mode gebruikt wordt verloopt alle output via een browser of werkstation met puTTY. Een printer op zo'n server configureren heeft dan ook weinig zin. De hier na volgende procedure is dan ook alleen ter informatie.
Missende Linux Printer Drivers toevoegen
Met een nieuwe printer kan het zijn dat er op het door ClearOS geleverde pakket nog geen drivers beschikbaar zijn. Dit was voor mijn Canon MP540 All-in-One het geval. Ook kon er geen equivalent driver pakket gevonden worden, waarmee de printer naar behoren werkte. Een zoektocht langs de verschillende RPM sites leverde ook niets op.
De gezochte drivers werden uiteindelijk via Google gevonden bij Canon!
- Haal met een Windows PC het bestand MP540_RPM_drivers.tar op bij http://software.canon-europe.com/software/
- Plaats dit bestand in '/usr/tmp' op de server
- Voer uit aan prompt:
# cd /usr/tmp/
# tar -xf MP540_RPM_drivers.tar - Dit resulteert in 2 tarballs waarvan één voor de scanner. We gaan verder met de tarball voor de printer:
# tar -xf MP540_RPM_printer.tar
Er zijn nu twee RPM bestanden over en opnieuw een tarball. De laatste lijkt alle bestanden te bevatten om zelf te compileren. Hier gaan we verder met de twee RPM bestanden. - Installeer 'cnijfilter-common-3.00-1.i386.rpm' en 'cnijfilter-mp540series-3.00-1.i386.rpm'.
Dit kan aan de prompt of bijvoorbeeld met Webmin. Het kan zijn dat voor dependencies 'gtk2' eerst geïnstalleerd moet worden. - Het geheel afgewerkt met een reboot van de server.
- Activeer CUPS in Webconfig en pas de Firewall aan voor CUPS poort 631 udp en tcp
- Log in op CUPS met browser op https://<myserver-IP>:631/admin, user en wachtwoord als van server
Downloadpagina met behulp van PHP
Hoe browsers omgaan met download bestanden
Als een gebruiker naar de URL van een bestand gaat (bijvoorbeeld een download link) dan zal dit bestand in de browser getoond worden als de browser dit bestandstype ondersteund. Imagebestanden zoals jpg, png, gif, etc zullen bijna altijd in de browser getond worden. Archief bestanden zoals zip, tar, gzip, etc. daarentegen zullen altijd gedownload worden. Sommige bestanden worden getoond in bepaalde browsers en niet bij anderen afhankelijk of de browser het bestand kan lezen. Internet Explorer zal bijvoorbeeld gewoonlijk proberen MS Word in de browser te openen, terwijl de meeste andere browsers het zullen downloaden. Google Chrome heeft zijn eigen pdf converter en zal proberen pdf bestanden om te zetten om ze te laten zien in de browser.
Of een browser een bestand kan lezen is ook afhankelijk van eventuele add-on's geïnstalleerd door de gebruikers.
Als een browser het bestand kan lezen wordt deze getoond, maar als de browser het niet kan lezen dan zal deze een download naar de harde schijf forceren.
Hoe kan een download geforceerd worden voor alle bestandtypen
Op deze server heb ik een download directory aangemaakt. Hierin kunnen mappen met bestanden geplaatst worden die beschikbaar zijn voor download.
In het configuratiebestand van de http server
staat per default de instelling van 'Indexes' uit, om te voorkomen dat een browser de directory listing toont als er geen automatisch opstartbestand zoals 'index.htm' voorkomt. De gebruiker zal in dit geval de door mij beschikbaar gestelde bestanden niet zien. Zie hiervoor op deze site: HTTPD.CONF Apache configuratie
Bij de downloadmap willen we juist dat de directorylisting wel getoond wordt zodat bestanden geselecteerd kunnen worden. Dit kan door middel van een speciale directive 'Options +Indexes' voor de downloadmap.
Zie het resultaat met de url: www.makkink.eu/exploringlinux/download en ondanks dat de mappen en bestanden door elkaar staan wordt wel een complete listing van aangeboden bestanden getoond. Als op een map geklikt wordt dan opent deze met op zijn beurt weer een listing van de mapinhoud. Als een bestand geselecteerd wordt dan doet zich echter het hierboven bechreven probleem voor en wordt het bestand of geopend of gedownload.
Het meest eenvoudige om een bestand toch als download aan te laten bieden is door het bestand in te pakken in een archief zoals zip en tar.
Maar zelfs dan is de downloadpagina zeer basic zonder enkele vorm van layout en design.
De PHP METHODE
Hieronder volgt een voorbeeld zoals ik het op deze site opgelost heb gebruikmakend van PHP.
De toelichting is hierbij gesplitst in de volgende onderdelen:
- Algemene HTML layout van de downloadpagina
- Haal met PHP de directory-listing en sorteer de output-array
- Creëer default HTMT uitvoer-tabel met PHP
- Loop door de output-array, verwerk en plaats deze in de uitvoer-tabel
Downloadpagina van layout voorzien
Om te beginnen wordt een html gemaakt met de gewenste layout. Zie hier een eenvoudig voorbeeld.
In dit stadium is nog geen PHP aanwezig en is daarom
het venster waar de downloads getoond zullen gaan worden nog leeg.
Om de mappen en bestanden te tonen en te navigeren door eventuele (sub)directories en hierin een bestand te kunnen selecteren en aan te bieden voor download wordt nu PHP gebruikt. Om te beginnen wijzigen we hiervoor de extentie van de pagina van .html naar .php
Hieronder volgt een nadere uitleg en documentatie van het PHP proces.
Klik hier om de complete PHP-download code te bekijken en eventueel af te drukken
Directory listing met PHP
Variabelen definieren:
- De locatie waar images, zoals icons, opgeslagen zijn (relatief tot dit aanroepende php bestand):
//Definieer de locatie waar images voor deze pagina zich bevinden $imgpath = "../img/";
- De locatie waar de download mappen en bestanden zich bevinden (relatief tot dit aanroepende php bestand):
//Definieer de locatie waar de downloads zich bevinden $path = "../download/";
Note: Middels bovenstaande settings wordt gezorgd dat de te downloaden bestanden zich op een andere locatie bevinden dan de downloadpagina, hiermee wordt voorkomen dat de downloadpagina zelf ook als download aangeboden zou worden. Voor het geforceerd downloaden is het wel belangrijk dat download.php en force.php in de zelfde directory staan.
- Als bovenstaande '$path' directory een sub-directory bevat kan deze t.z.t. in de output-tabel geselecteerd worden. Als resultaat wordt dan de downloadpagina opnieuw geopend maar nu met een aan de url toegevoegde parameter ('d') die het pad ($path) bevat naar de geselecteerde sub-directory.
Dus als de url een toegevoegde parameter heeft vervangt deze de oorspronkelijk gezette '$path'. Zie ook verderop in dit script 'Verzamel tabelvariabelen met loop door bestanden' punt 3
//Als parameters aan calling url toegevoegd zijn, gebruik deze if (!empty($_GET["d"])) { $path = $_GET["d"]; }
- Als afgedaald is in een sub-directory wordt, om terug te keren naar de parent-directory, het pad hiernaartoe ($upurl) meegegeven als parameter van de url.
Als we echter al in de 'root' downloaddirectory aangeland zijn moet de volgende stap terug niet belanden in de parent directory hiervan, maar moet er verwezen worden naar de calling-directory van de download-webpagina
// Bewaar pad naar bovenliggende folder
$upurl = dirname($path)."/";
if ($upurl != "../") {
$upurl = "download.php?d=".$upurl;
}
Directory listing halen:
- In de nu volgende routines wordt het statement is_dir gebruikt en deze vereist dat je verhuist naar de parent directory van het te testen bestand.
Zie hiervoor de PHP manual.
//warning: `is_dir` requires you to change to the parent directory of what you are testing //see <uk3.php.net/manual/en/function.is-dir.php#70005> for details chdir ($path);
Vanaf dit punt is $path de current directory en de locatie van waaruit het script wordt uitgevoerd.
- Nu gaan we de directorylisting halen.
// Haal directory listing $dirArray = array_diff (scandir ('.'), array ('.', '..', '.DS_Store', 'Thumbs.db') );
Met scandir ('.') wordt de listing van de huidige directory in een array $dirArray geschreven.
Met array_diff worden de mappen en bestanden opgegeven in array ('.', '..', '.DS_Store', 'Thumbs.db') overgeslagen.
Sorteer directory listing in de array: eerst directories en daarna alfabetisch.
- Let op: dit stukje code is met zgn. 'ternary' operators (? is if : is else).
usort ($dirArray, create_function ('$a,$b', ' return is_dir ($a) ? (is_dir ($b) ? strnatcasecmp ($a, $b) : -1) : (is_dir ($b) ? 1 : ( strnatcasecmp ($a, $b) )) ; '));
Tel het aantal gevonden bestanden
- Om later in een loop de array uit te lezen, moeten we het aantal elementen vaststellen.
// count elements in array $indexCount = count($dirArray);
HTML voor Tabel samenstellen met PHP
- Met de statement 'print' maken we de HTML aan voor de header van de tabel
print("<TABLE border=0 cellpadding=2 cellspacing=0>\n"); print("<TR><TD><img src='$imgpath"); print("pix.gif' /></TD><TD><img src='$imgpath");
print("pix.gif' width='300' height='1' /></TD><TD><img src='$imgpath");
print("pix.gif' width='150' height='1' /></TD><TD></TD></TR>\n");
print("<TR><TH></TH><TH>Bestandsnaam</TH><TH>Gewijzigd op</th><th>Grootte Kb</th></TR>\n"); - Plaats op de eerste regel in de tabel een icon met een link om terug te keren naar de parent directory.
print("<tr><td><img src='$imgpath"); print("back.gif' alt='[DIR]' /></td><td><a href='$upurl' class=\"index\">Map omhoog</a></td><td></td><td></td>\n");
De variabele $upurl bevat het complete path van de huidige parent directory. - Als er geen bestanden gevonden zijn, sluiten we de tabel, geven we een boodschap weer en verlaten we de PHP functie ('die')
// print boodschap als er geen files in de folder zijn en verlaat script if ($indexCount < 1) { // geen bestanden in map print("</TR>\n"); print("</TABLE>\n"); // sluit table af die ("<p>Op het moment zijn er helaas geen downloadbestanden beschikbaar<br/> Probeer het later nog eens of neem contact met mij op</p>"); }
In het geval er geen bestanden gevonden zijn zal de tabel er ongeveer als volgt uitzien:
Downloads
![]() | ![]() | ![]() | |
Bestandsnaam | Gewijzigd op | Grootte Kb | |
---|---|---|---|
Map omhoog |
Op het moment zijn er helaas geen downloadbestanden beschikbaar
Probeer het later nog eens of neem contact met mij op
Verzamel tabelvariabelen met loop door bestanden
- Zet een loop op en handel elementen in array één voor één af
// loop through the array of files, collect variables and print them all for($index=0; $index < $indexCount; $index++) {
- Check of een element een directory of file is
//check of bestand een file of directory is en maak bijbehorende variabelen aan if (is_dir("$dirArray[$index]")) { //bestand is een dir
- Als het element een directory is:
-Voeg aan $file_name een slash '/' toe ter indicatie in de weer te geven tabel dat het om een directory gaat
-Maak een link $url aan voor $filename. Met het aanklikken van deze link wordt de downloadpagina opnieuw geladen maar dan nu met een toegevoegd argument 'd' waardoor afgedaald wordt in de sub-directory $file_name. Zie hierover ook begin van dit php-script 'Variabelen definiëren' 3e punt.
-Definiëer de vóór de directorynaam weer te geven icon.
$file_name=$dirArray[$index]."/"; $url="download.php?d=".$path.$dirArray[$index]."/"; $icon="dir.gif";
-
Als het element geen directory is:
- Zet variabele $file_name
- Maak een link $url aan voor $file_name. Deze link roept php-script 'force.php' en geeft als argument de $file_name mee en het pad er naar toe. Het php-script 'force.php' voorkomt dat de browser het bestand opent en forceert het downloaden.
-Vervolgens wordt gekeken om wat voor bestand het gaat en verzorgt weergave van de bijbehorende icon.
} else { //bestand is een file $file_name=$dirArray[$index]; $url="force.php?f=".$path.$dirArray[$index]; //bepaal icon behorend bij filetype switch(strtolower(substr(strrchr($file_name, '.'), 1))) { case 'pdf': $icon = "pdf.gif"; break; case 'zip': $icon = "compressed.gif"; break; case 'gz': $icon = "compressed.gif"; break; case 'tar': $icon = "compressed.gif"; break; case 'jpg': $icon = "image.gif"; break; case 'gif': $icon = "image.gif"; break; case 'png': $icon = "image.gif"; break; case 'avi': $icon = "movie.gif"; break; case 'wmv': $icon = "movie.gif"; break; case 'doc': $icon = "layout.gif"; break; case 'xls': $icon = "layout.gif"; break; case 'ppt': $icon = "layout.gif"; break; case 'mp3'; $icon = "sound.gif"; break; case 'wav'; $icon = "sound.gif"; break; default: $icon= "text.gif"; } }
- Filesize wordt uitgedrukt in bytes. Voer bewerking uit voor weergave in de tabel in 'Kb' zonder cijfers achter de komma. Als de filesize minder dan 1 Kb is wordt deze omhoog afgerond naar 1 Kb
// formatteer filesize output if (filesize("$dirArray[$index]")>1000) { $file_size=number_format(filesize("$dirArray[$index]")/1000, 0, ',', ''); }else { $file_size=1; }
Vul tabel rij voor rij met verzamelde output
- Elke loop resulteert in een set variabelen per element. Aan het einde van elke loop worden deze waarden in een Table Row weergegeven. Na de laatste loop wordt dan ook de Table gesloten.
//Geef verzamelde output weer per table row print("<TR><td><img src='$imgpath$icon' alt='[ICO]' /></td>"); print("<td><a href=\"$url\" class=\"index\">$file_name</a></td>"); print("<td>"); print(date ("d M Y H:i", filemtime("$dirArray[$index]"))); print("</td>"); print("<td align='right'>"); print($file_size); print("</td>"); print("</TR>\n"); } //Sluit table na laatste loop print("</TABLE>\n");
Download bestand met force.php
In de voorgaande secties hebben we gezien dat indien een element geen directory is en dus een bestand dat deze een link krijgt om down te loaden.
Als een gebruiker deze download link aanklikt dan zou dit bestand echter in de browser getoond worden als de browser dit bestandstype ondersteund. Om een download te forceren wordt daarom de url als argument doorgestuurd naar het php-script force.php
<?php $file = ($_GET['f']); header('Cache-Control: public, must-revalidate, max-age=0'); header('Pragma: no-cache'); // voor .basename() moeten eventuele spaties in $file verwijderd of omgezet worden header("Content-disposition: attachment; filename=".basename(str_replace(' ', '_', $file))); header("Content-type: application/octet-stream"); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); ob_clean(); flush(); readfile("$file"); ?>
-
In bovenstaand php-script wordt het argument 'f' uitgelezen en opgeslagen in variabele $file.
De waarde van argument 'f' is het pad en bestandsnaam van het te downloaden bestand dat meegegeven werd in de url van de bestandslink in de vorige sectie. - Daarna wordt een serie HTML 'header' statements gemaakt die er voor zorgdragen dat het geselecteerde bestand geforceerd aangeboden wordt voor download middels de 'readfile' functie.
Zie voor nadere toelichting de readfile functie in de PHP manual.
Data uitwisselen tussen Linux machines op het zelfde netwerk
SSH Protocol
Secure Shell (kortweg: SSH) is een protocol uit de toepassingslaag van de TCP/IP-protocolgroep.SSH maakt het mogelijk om op een versleutelde manier in te loggen op een andere computer, en op afstand commando's op de andere computer uit te voeren via een shell. Omdat ssh met encryptie werkt, is het voor eventuele afluisteraars, die de (internet)verbinding aftappen, zo goed als onmogelijk om wachtwoorden of commando's te achterhalen.
Voorbeelden van netwerkcommunicatie tussen Mainserver en Testserver
Machines:
Mainserver IP:192.168.1.xxx
Testserver IP:192.168.1.yyy
Taken:
1. Haal op testserver bestandslijst van mainserver
2. Kopieer op testserver bestanden van de mainserver (ontvangen)
3. Kopieer op testserver bestanden naar de mainserver (zenden)
Met SSH bestandslijst ophalen van Linux share op netwerk
Voer commando uit op testserver om bestandslijst op te halen van de mainserver:
# ssh root@192.168.1.155 ls -l /var/www/html/
Er zal naar het wachtwoord van Mainserver-root gevraagd worden. Zie ook FAQs SSH
Met Secure Copy bestanden van de Mainserver halen
Voer commando's uit op de testserver (-r voor recursive).
Als bestanden op bestemming al bestaan worden deze overschreven!
# scp -r root@192.168.1.155:/vault/g2data /home/
of
# cd /home
# scp -r root@192.168.1.155:/vault/g2data .
Er zal in beide gevallen naar het wachtwoord van Mainserver-root gevraagd worden. Zie ook FAQs SCP
Met Secure Copy bestanden naar de Mainserver sturen
Voer commando's uit op de testserver.
Als bestanden op bestemming al bestaan worden deze overschreven!
# scp -r /vault/g2data/ root@192.168.1.155:/vault/
Er zal naar het wachtwoord van Mainserver-root gevraagd worden. Zie ook FAQs SCP
Netwerkkaart toevoegen/vervangen
In de BIOS moet PnP enabled zijn
- Verwijder de Network Interface Card (NIC), bijvoorbeeld 'eth1'
- Boot en stel vast dat het systeem de NIC mist
- # shutdown (dus niet power uit!).
- Installeer de kaart en boot
- Als de NIC niet automatisch geladen wordt zoek dan in /etc/sysconfig/network-scripts naar bestand 'ifcfg-eth1'
- Als dit bestand niet bestaat maak het dan aan:
# touch /etc/sysconfig/network-scripts/ifcfg-eth1 - Het bestand moet minstens de volgende regels bevatten:
DEVICE=eth1
TYPE="Ethernet"
ONBOOT="yes"
USERCTL="no"
BOOTPROTO="static"
IPADDR="192.168.1.50" (gewenste vaste IP van NIC)
NETMASK="255.255.255.0"
GATEWAY="192.168.1.254" - Herstart netwerk:
# service network restart
Servernaam wijzigen
Als we de naam van een server willen wijzigen van bijvoorbeeld 'homeserver' naar 'testserver' moeten hiervoor een reeks instellingen aangepast worden.
Het is daarbij belangrijk dat de LDAPapp gewijzigd wordt vóór apps die van LDAP gebruik maken zoals bijv. Samba
- Directory Server
Webconfig > Server > Directory > Directory Server.
Wijzig: Base Domain
Controleer wijziging eventueel in /var/clearos/openldap/config.php - Windows Networking (Samba)
Webconfig > Server > File > Windows Networking (Samba) > Settings
Wijzig: Server Name en Server Comment - IP settings
Webconfig > Network > Setting > IP settings
Wijzig: Hostname - Hosts
Edit /etc/hosts
Wijzig: oude naam naar nieuwe naam - Webserver
Webconfig > Server > Web > Webserver > Settings
Wijzig: Server Name - DNS Server
Webconfig > Network > Infastructure > DNS Server > DNS Entries
Wijzig: Hostname - Mail Settings
Webconfig > System > Settings > Mail Settings > Settings
Wijzig: Mail Domain en Mail Hostname
Reboot
- System Registration
Log in! en vervolgens Webconfig > System > Settings > System Registration
Voeg aan de URL in de browser toe: ../reset
https://homeserver:81/app/registration/reset
Als resultaat wordt de bestaande registratie van 'homeserver' verwijderd.
Vul nu het registratieformulier opnieuw in met de nieuwe gegevens. - Browser Bladwijzers
Pas alle gerelateerde Bladwijzers in de browsers aan - puTTY
Pas settings van SSH console pyTTY aan - Last Pass
Pas Last Pass data van gerelateerde server aan
Server verhuizen naar ander netwerk
Als de server verhuisd wordt naar een ander netwerk is de kans groot dat de IP range van dat 'nieuwe' netwerk afwijkt van de range waarvoor de server geconfigureerd is.
Als gevolg hiervan zullen onderdelen van de configuratie van de firewall, samba, etc met 'hard-coded' IP's resulteren in blokkades.
Voorbeelden van de Mainserver-configuraties met 'hard-coded' IP's
- Firewall
Zie Server::Firewall > Firewall Custom en Webconfig > Network > Firewall > Custom Firewall
Om toegang tot specifieke poorten te beperken worden deze alleen open gezet voor clienten in het lokale netwerk zoals bijvoorbeeld voor Webconfig de rule:
$IPTABLES -I INPUT -p tcp --source 192.168.178.0/26 --destination 192.168.178.4 --dport 81 -j ACCEPT
Bovenstaande houdt in dat alleen voor de "hard-coded" IP's tussen 192.168.178.0 en .63 port 81 open staat.
Door in mijn thuisnetwerk op de router de DHCP pool in te stellen boven IP 192.168.178.63, zullen clienten die via DHCP een IP-adres krijgen geen toegang krijgen tot poort 81.
Dat houdt dat alleen "trusted IP's" met door de beheerder op de router ingestelde IP reservering toegang krijgen tot poort 81. Zie ook meer hierover in Server::Samba > Beperking toegang tot 'trusted-IP's'
- Samba fileserver
Zie Server::Samba > Samba Network Server met in in de sambaconfiguratie de toevoeging hosts allow = 192.168.178.0/26
Ook hier worden alleen netwerkclienten toegelaten met IP's tussen 192.168.178.0 en 63
- Hosts bestand
Eenvoudig gezegd is het bestand /etc/hosts een bestand met platte tekst dat door het besturingssysteem wordt gebruikt om hostnamen naar IP-adressen te vertalen. Het systeem zal altijd eerst het hosts-bestand controleren en alles wat niet in het hosts-bestand is gedefinieerd, wordt opgezocht op de DNS-servers die zijn gedefinieerd in de netwerkinstellingen.
Op de mainserver ziet het hosts bestand er als volgt uit:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.178.4 mainserver.makkink.eu mainserver
192.168.178.5 testserver.makkink.eu testserver
192.168.178.10 ben-xps
192.168.178.14 erica
192.168.178.15 benovo
192.168.178.16 asrock
192.168.178.24 hp6234
Opnieuw allemaal "hardcoded IP's" die niet meer zullen kloppen als de Mainserver in een ander netwerk geplaatst wordt.
Waar moeten IP's in de diverse configuraties gecorrigeerd worden?
Om vast te stellen waar deze hard-coded IP's voorkomen gebruiken we het commando #grep bijvoorbeeld:
# grep -rnw '/etc' -e '192.168.178'
Op de mainserver resulteert dit bijvoorbeeld in:
/etc/hosts:3:192.168.178.4 mainserver.makkink.eu mainserver /etc/hosts:4:192.168.178.5 testserver.makkink.eu testserver /etc/hosts:5:192.168.178.10 ben-xps /etc/hosts:6:192.168.178.14 erica /etc/hosts:7:192.168.178.15 benovo /etc/hosts:8:192.168.178.16 asrock /etc/hosts:9:192.168.178.24 hp6234 /etc/clearos/firewall.d/custom:9: $IPTABLES -I INPUT -p tcp --source 192.168.178.0/26 --destination 192.168.178.4 --dport 81 -j ACCEPT # Webconfig-trusted-IPs /etc/clearos/firewall.d/custom:10: # $IPTABLES -I INPUT -p tcp --source 192.168.178.0/26 --destination 192.168.178.4 --dport 22 -j ACCEPT # SSH-trusted-IPs /etc/clearos/firewall.d/custom:11: $IPTABLES -A INPUT -p udp --source 192.168.178.0/24 --destination 192.168.178.4 --dport 1024:65535 -j ACCEPT # SMB-Highports /etc/clearos/firewall.d/custom:12: $IPTABLES -I INPUT -p udp --source 0.0.0.0/0 --destination 192.168.178.4 --dport 138 -j ACCEPT # NETBIOS-DGM /etc/clearos/firewall.d/custom:13: $IPTABLES -I INPUT -p udp --source 192.168.178.0/24 --destination 192.168.178.0/24 --dport 137 -j ACCEPT # NETBIOS-NS /etc/samba/smb.conf:128: hosts allow = 192.168.178.0/26 /etc/samba/smb.conf:140: hosts allow = 192.168.178.10 192.168.178.37 /etc/samba/smb.conf:152: hosts allow = 192.168.178.10 /etc/samba/smb.conf:164: hosts allow = 192.168.178.10 192.168.178.37 /etc/httpd/conf.d/custom_httpd.inc:51: Require ip 192.168.178.0/24 /etc/httpd/conf.d/awstats.conf:30: Require ip 192.168.178.0/24 /etc/httpd/conf.d/awstats.conf:37: Allow from 192.168.178.0/24 /etc/httpd/conf.d/custom_httpd.conf:127: Require ip 192.168.178.0/24 /etc/httpd/conf.d/phpldapadmin.conf:12: Require ip 192.168.178.10
Uit bovenstaande kunnen we dus afleiden in welke bestanden de IP's gecorrigeerd moeten worden naar het IP adres van de nieuwe router.
Als de IP range van de nieuwe router bijvoorbeeld 192.168.1.0/24 is moeten we in bovenstaande bestanden alle voorkomens van 192.168.178 wijzigen naar 192.168.1
IP Update door middel van script
SSH toegang:
Om het script uit te kunnen voeren is het essentiëel dat er met een PC in het nieuwe netwerk een SSH verbinding, m.b.v. bijv. puTTY, gemaakt kan worden met de server.
Daarom moet de firewall alle clienten in het thuisnetwerk, waarin de server opgenomen wordt, toegang verlenen tot poort 22
Zie
Server::Firewall > Firewall Inkomend, dus hier geen "hard-coded"IP's gebruiken!
Mocht er toch een "hardcoded" IP gebruikt zijn dan rest niets anders dan de server te voorzien van keyboard en monitor en vervolgens de firewall uit te schakelen met het commando: # systemctl stop firewall
Script # 'server-ipupdate'
Voor het eenvoudig updaten van de IP's na een router-wissel heb ik een script 'server-ipupdate' geschreven.
Dit script maakt gebruik van een referentie bestand /usr/local/server-netips dat de IP's bevat zoals ze tot voor de uitwisseling zijn.
# Huidig LAN IP lanip 192.168.178.0 # # Huidig IP van de PC (ssh client)van waaruit het netwerk en server beheerd wordt. clientip 192.168.178.10 # # Huidig IP van de server hostip 192.168.178.4
Zie hier het complete script 'server-ipupdate'.
In het script zetten we m.b.v. van het 'string editor' commando # sed eerst de variabelen voor de oude te vervangen ip's uit het referentiebestand /usr/local/server-netips en zetten we de variabelen van de niewe IP's. Zie ook Return only the portion of a line after a matching pattern
# Oude IP's in het referentiebestand prev_lanip=$(sed -n '/lanip/{s/.*lanip *\([^ ]*\).*/\1/p;q;}' /usr/local/server-netips | cut -d. -f-3); prev_srvrip=$(sed -n '/hostip/{s/.*hostip *\([^ ]*\).*/\1/p;q;}' /usr/local/server-netips); prev_clientip=$(sed -n '/clientip/{s/.*clientip *\([^ ]*\).*/\1/p;q;}' /usr/local/server-netips); # Nieuwe IP range met de nieuwe router nw_lanip=$(ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}' | cut -d. -f-3); nw_srvrip=$(ip route get 8.8.8.8 | sed -n '/src/{s/.*src *\([^ ]*\).*/\1/p;q}'); nw_clientip=$(echo $SSH_CLIENT | awk '{ print $1}');
En vervolgens gebruiken we # sed om alle voorkomens van de oude IP's te vinden en deze te wijzigen naar de nieuwe IP-range bijvoorbeeld voor de firewall
Zie ook
How to Use sed to Find and Replace String in Files
sed -i "s/\b$prev_srvrip\b/$nw_srvrip/g" /etc/clearos/firewall.d/custom; sed -i "s/\b$prev_lanip\b/$nw_lanip/g" /etc/clearos/firewall.d/custom;
Met bovenstaande wordt in het firewall configuratiebestand /etc/clearos/firewall.d/custom de regel:
$IPTABLES -I INPUT -p tcp --source 192.168.178.0/26 --destination 192.168.178.4 --dport 81 -j ACCEPT # Webconfig-trusted-IPs
gewijzigd naar:
$IPTABLES -I INPUT -p tcp --source 192.168.1.0/26 --destination 192.168.1.21 --dport 81 -j ACCEPT # Webconfig-trusted-IPs
In bovenstaand voorbeeld is de nieuwe router range 192.168.1 ($nw_lanip) en de nieuwe server IP 192.168.1.21 ($nw_srvip)
Als laatste wordt met het script het refentie bestand /usr/local/server-netips ook geupdated.
# ALTIJD als laatste # update referentiebestand /usr/local/server-netips sed -i "s/\b$prev_srvrip\b/$nw_srvrip/g" /usr/local/server-netips; sed -i "s/\b$prev_clientip\b/$nw_clientip/g" /usr/local/server-netips; sed -i "s/\b$prev_lanip\b/$nw_lanip/g" /usr/local/server-netips;
Procedures voor het opnemen van de Mainserver in een netwerk met ander IP-bereik
Voor de duidelijkheid van de hiernavolgende procedures gebruiken we voor het oorspronkelijke thuisnetwerk het IP bereik 192.168.178.0/24 en nemen we van het nieuwe netwerk aan dat het IP-bereik 192.188.1.0/24 is.
1. Procedure met behoud van volledige Mainserver functionaliteit als File- en Webserver
- Verbindt de ‘beheerders-PC’ via een netwerkkabel met de ‘nieuwe’ router.
- Open in de browser op deze PC het Router Gebruikers Interface en log in (zie routerhandleiding voor IP adres, gebruikersnaam en wachtwoord).
- De Mainserver is dusdanig geconfigureerd dat alleen apparaten in het lokale netwerk en binnen het IP bereik 0-63 toegang wordt verleend.
Hiervoor moet op de router dit bereik vrijgehouden worden t.b.v. IP-reservering (Static IP) voor deze apparaten. Stel daarom op de router de DHCP pool in beginnend boven 64, bijvoorbeeld 192.188.1.64 tot 192.188.1.200
Gasten, mogelijk ongewenst, krijgen nu middels DHCP automatisch een IP buiten het ‘trusted-IP’ bereik en krijgen als gevolg geen toegang tot de Mainserver.
- Zoek op de router de netwerkverbinding van de ‘beheerders-PC’ (MAC-adres) en wijzig het aanvankelijk door DHCP verkregen IP naar een IP reservering binnen de range 192.188.1.0/26 (0-63), bijvoorbeeld 192.188.1.50.
Herstart de ‘beheerders’ PC
- Sluit de Mainserver aan op de router en lokaliseer op de router de netwerkverbinding van de Mainserver (MAC-adres) en reserveer op de router een vast IP bijvoorbeeld 192.188.1.5.
Hiermee heeft de Mainserver een vast lokaal IP, benodigd voor portforwarding naar de Webserver.
Herstart de Mainserver.
- Doe hetzelfde voor alle client PC's in het netwerk die toegang tot de Samba-shares moeten krijgen, dus met een vast IP in het bereik 192.188.1.0/26
- Start nu op de 'beheerders-PC' een SSH sessie op de Mainserver op adres 192.188.1.5 via poort 22 (bijvoorbeeld met de SSH-client puTTY voor Windows).
Log in met gebruikersnaam ‘beheerder’ (Zie LastPass voor accounts en wachtwoorden).
- SU naar root en start op de command-line het script: 'server-ipupdate'
Het script zoekt in de diverse Mainserver-configuratiebestanden naar alle oude "hardcoded" IP's 192.168.178.x en vervangt deze met het nieuwe IP 192.188.1.x .
Herstart de Mainserver.
- Hiermee is de Mainserver geïntegreerd in het nieuwe thuisnetwerk.
- We kunnen nu in de browser van de ‘beheerders-PC’ de Mainserver Gebruikersinterface 'Webconfig' openen met de URL: https://192.188.1.5:81 (log in als root).
- Op een Windows PC in het nieuwe thuisnetwerk kunnen we nu in de Verkenner de Samba Fileserver benaderen met het adres: \\192.188.1.5\files of \\mainserver\files
Er zal om authenticatie gevraagd worden, log in als één van de gebruikers van de gebruikersgroep 'lanshare' (zie Webconfig>System>Accounts>Users en/of Groups)
Bijvoorbeeld gebruiker 'beheerder'. Ga naar LastPass voor wachtwoord).
Zie on-line voor inloggen op Samba vanaf een Windows PC:
https://www.makkink.eu/exploringlinux/server7/html/samba.html#sambanetwerk
Of off-line op Desktop-PC van Ben met url:file:
///D:/Data/Documenten/Webdesign/webserver/exploringlinux/server7/html/samba.html#sambanetwerk
Of eerst website downloaden van STACK:
www/exploringlinux/server7/
- De Webserver is lokaal in de browser te openen met de url: https://192.188.1.5/
Als we de server open willen stellen op het internet dan moet hiervoor op de router portforwarding ingesteld worden.
Op de Mainserver zelf staan de poorten 80 en 443 al open.
2. Procedure voor alleen toegang tot de Fileserver voor bijvoorbeeld datarecovery.
Met deze procedure is geen manipulatie van router nodig, de Mainserver wordt gewoon via DHCP aan het nieuwe netwerk gehangen.
Pas op: Alle apparaten in het thuisnetwerk kunnen na deze procedure inloggen op de Samba shares, dus ook bijvoorbeeld ongenode WiFi gasten.
Er is geen IP-reservering, dus is geen portforwarding voor de Webserver mogelijk.
Lokaal is de Webserver nog wel beschikbaar.
- Sluit de Mainserver aan op de router
- Start nu op de 'beheerders-PC' een SSH sessie op de Mainserver op adres 192.188.1.xx via poort 22 (bijvoorbeeld met de SSH-client puTTY voor Windows).
Check op de router welk IP via DHCP is toebedeeld aan de Mainserver
Log in met gebruikersnaam ‘beheerder’ (Zie LastPass voor accounts en wachtwoorden).
- Start op de command-line het script: 'server-ipupdate'.
Het script zoekt in de diverse Mainserver-configuratiebestanden naar alle oude "hardcoded" IP's 192.168.178.x en vervangt deze met het nieuwe IP 192.188.1.x .
- Start op de command-line het script: ‘server-smbopen’(Zie de volgende sectie hieronder voor de uitleg van dit script).
Het script past de Samba configuratie aan door de ‘Trusted-IP’ restrictie te verwijderen.
Alle apparaten op het thuisnetwerk krijgen nu toegang tot de Fileserver
Herstart de Mainserver.
- Met stappen 3 en 4 is de Mainserver nu gekoppeld aan het nieuwe thuisnetwerk.
We kunnen nu in de browser van de ‘beheerders-PC’ bijv. de Mainserver Gebruikersinterface 'Webconfig' openen met URL: https://192.188.1.xx:81 (log in als root).
Check op de router welk IP via DHCP is toebedeeld aan de Mainserver
- Op een Windows PC in het nieuwe thuisnetwerk kunnen we nu in de Verkenner de Samba Fileserver benaderen met het adres: \\192.188.1.xx\files of \\mainserver\files
Log in als één van de gebruikers van de gebruikersgroep 'lanshare' (zie Webconfig>System>Accounts>Users en/of Groups)
Bijvoorbeeld gebruiker 'beheerder'. Ga naar LastPass voor wachtwoord).
Zie on-line voor inloggen op Samba vanaf een Windows PC:
https://www.makkink.eu/exploringlinux/server7/html/samba.html#sambanetwerk
Of off-line op Desktop-PC van Ben met url:file:
///D:/Data/Documenten/Webdesign/webserver/exploringlinux/server7/html/samba.html#sambanetwerk
Of eerst website downloaden van STACK:
www/exploringlinux/server7/
- De Webserver is lokaal in de browser te openen met de url: https://192.188.1.xx/
De webserver kan niet zondermeer opengesteld worden naar het internet omdat deze geen vast IP heeft. Hiervoor moet eerst in de router een IP voor de Mainserver gereserveerd worden waarna vervolgens portforwarding ingesteld kan worden.
Script 'server-smbopen' voor verwijderen Samba's Trusted-IP restrictie
De Mainserver Samba-configuratie voorziet in een Trusted-IP restrictie op apparaten in het locale netwerk.
Alleen de door de beheerder geselecteerde apparaten worden in de router voorzien van een IP-reservering.
Met de tweede procedure hierboven zien we ervan af een router in een bestaand netwerk om te bouwen om dit te faciliteren.
Nu moeten we wel het Samba configuratie bestand aanpassen zodat alle netwerkapparaten toegang krijgen.
Procedure:
Maak een copie van /etc/samba/smb.conf en noemen deze /etc/samba/smb.conf.smbopen en editen dit bestand.
Markeer in dit bestand alle regels met hosts deny = ALL en hosts allow = 192... uit.
Bijvoorbeeld:
[files] comment = Gedeelde bestanden en mappen path = /home/files force user = files force group = lanshare read only = No create mode = 0644 directory mask = 0751 # Alle hosts in LAN krijgen toegang # hosts deny = ALL # hosts allow = 192.168.178.0/26 browsable = Yes
Zie hier het complete bestand /etc/samba/smb.conf.smbopen
Vervolgens vervangen we het originele smb.conf door dit aangepaste bestand met een kort script server-smbopen
cp -a /etc/samba/smb.conf.smbopen /etc/samba/smb.conf; systemctl restart smb;
Wordpress blog migreren naar nieuwe server
Zie ook WORDPRESS::Backup and Restore > Wordpress migreren met backup data
Voor het migreren van de Wordpress blog van de huidige on-line server naar een nieuwe on-line server kunnen we de Wordpress backup gebruiken zoals omschreven in Gebruikersinstructies
Kopiëer hiervoor van de huidige server met rsync de meest recente backupdata in /vault/wordpress naar de vault van de nieuwe server en volg de gebruikersinstructies.
Zodra de nieuwe server on-line genomen wordt in domein www.makkink.eu is nu de Wordpress blog geheel operationeel.
Als we de voormalige on-line server willen gaan gebruiken als een lokale testserver lopen we tegen het probleem aan dat bij Wordpress alle links permalinks zijn met het volledige pad en als root het domein www.makkink.eu
Het eerste probleem waar we tegen aan lopen begint al als we in willen loggen als beheerder om bijvoorbeeld al deze links te wijzigen.
De link voor het inloggen verwijst ook nog steeds naar www.makkink.eu, dus zelfs vanaf de testserver belanden we in de on-line webserver.
De settings voor o.a. in- en uitloggen kunnen we wijzigen in Wordpress > Dashboard > Instellingen > Algemeen, maar daar moeten we wel voor ingelogd zijn.
Edit Wordpress database met (phpMyAdmin) MySQL
De enige manier om hier een voet tussen de deur te krijgen is het in phpMyAdmin of aan de prompt bewerken van de databasetafel van wordpress.wp_options waarin de instellingen opgeslagen zijn.
Update wp_options URL's
Check in kolom option_value naar records met www.makkink.eu terwijl in kolom option_name: 'login_redirect_url','logout_redirect_url','home' of 'siteurl'
MariaDB [wordpress]> SELECT * FROM `wp_options` WHERE option_name IN ('login_redirect_url', 'logout_redirect_url','home','siteurl') AND option_value LIKE '%www.makkink.eu%'; +-----------+---------------------+-----------------------------+----------+ | option_id | option_name | option_value | autoload | +-----------+---------------------+-----------------------------+----------+ | 2 | home | https://www.makkink.eu/blog | yes | | 748 | login_redirect_url | https://www.makkink.eu/blog | yes | | 747 | logout_redirect_url | https://www.makkink.eu/blog | yes | | 1 | siteurl | https://www.makkink.eu/blog | yes | +-----------+---------------------+-----------------------------+----------+
Update in de de text in option_value van 'www.makkink.eu' naar '192.168.1.5'
MariaDB [wordpress]> UPDATE `wp_options` -> SET option_value=REPLACE(option_value,'www.makkink.eu','192.168.1.5') -> WHERE option_name IN ('login_redirect_url', 'logout_redirect_url','home','siteurl') -> AND option_value LIKE '%www.makkink.eu%'; Query OK, 4 rows affected (0.00 sec) Rows matched: 4 Changed: 4 Warnings: 0
Na deze update kunnen we weer inloggen op Wordpress op de testserver
Note:
Er zijn meer permalinks met www.makkink.eu in de tafel wp_options, maar deze zijn nested in arrays.
Deze kunnen we alleen updaten met Wordpress > Dashboard > Weergave > Customizer door de layout geheel opnieuw op te bouwen.
Voor de testserver is dat niet nodig, te veel werk voor niets. Slechts enkele afbeeldingen zullen door de browser van de domeinserver www.makkink.eu gehaald worden.
Update wp_options records met e-mailadres erica@makkink.eu naar ben@makkink.eu
MariaDB [wordpress]> UPDATE `wp_options` SET option_value=REPLACE(option_value,'erica@makkink.eu','ben@makkink.eu') WHERE option_value LIKE '%erica@makkink.eu%'
Alle POSTS met permalinks
Posts met foto's bevatten alle permalinks en in ons geval opnieuw allemaal naar https://www.makkink.eu/. Ten tijde van dit schrijven praten we over zo'n 1650 permalinks die bewerkt moeten worden.
Dit gaat het beste met het editen met MySQL van de tafel wp_posts.
De permalink met 'www.makkink.eu' kan voorkomen in 2 kolommen zijnde wp_posts.post_content en/of wp_posts.guid
We voeren de volgende updates uit:
MariaDB [wordpress]> UPDATE `wp_posts` -> SET post_content=REPLACE(post_content,'www.makkink.eu','192.168.1.5') -> WHERE post_content LIKE '%www.makkink.eu%'; Query OK, 367 rows affected (0.06 sec) Rows matched: 367 Changed: 367 Warnings: 0 MariaDB [wordpress]> UPDATE `wp_posts` -> SET guid=REPLACE(guid,'www.makkink.eu','192.168.1.5') -> WHERE guid LIKE '%www.makkink.eu%'; Query OK, 1279 rows affected (0.01 sec) Rows matched: 1279 Changed: 1279 Warnings: 0
Verwijder onnodige adressen uit Email Subscriber
- table wp_es_emaillist: alleen admin behouden met adres ben@makkink.eu
- table wp_es_pluginconfig: alle voorkomens van erica@makkink.eu wijzigen naar ben@makkink.eu
- table wp_ig_campaigns: alle voorkomens van erica@makkink.eu wijzigen naar ben@makkink.eu
- table wp_ig_contacts: alle voorkomens van erica@makkink.eu wijzigen naar ben@makkink.eu
- table wp_users: alle voorkomens van erica@makkink.eu wijzigen naar ben@makkink.eu
Anacron Logrotate error tracen
Als met de logrotate procedure iets fout gaat wordt een e-mail met een waarschuwing gestuurd naar de Admin (root@mainserver.makkink.eu) met bijvoorbeeld volgende vermelding:
/etc/cron.daily/logrotate:
gzip: stdin: file size changed while zipping
Het enige wat we hieruit op kunnen maken dat er iets fout gegaan is met het roteren van een log van één van de vele processen die gelogd worden.
Als de volgende dag geen waarschuwing ontvangen wordt is het en incidentele fout als bijvoorbeeld geprobeerd wordt een logbestand te roteren terwijl deze gelockt is.
In dat geval is verder onderzoek niet nodig.
Als echter dagelijks een waarschuwing blijft komen moeten we dit onderzoeken.
Hiervoor maken we het 'logrotate-proces' verbose, met als resultaat dat het hele proces van alle logrotaties voluit in een e-mail gestuurd wordt.
Edit /etc/cron.daily/logrotate
Voeg aan het einde van de commandoregel toe: --verbose
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf --verbose
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
De resulterende dagelijkse e-mail ziet er uit bijvoorbeedl uit als volgt:
/etc/cron.daily/logrotate: reading config file /etc/logrotate.conf including /etc/logrotate.d reading config file BackupPC reading config file bootlog reading config file chrony reading config file clamd reading config file compliance reading config file dnsmasq .... etc. Allocating hash table for state file, size 15360 B Handling 28 logs rotating pattern: /var/log/boot.log after 1 days (7 rotations) empty log files are not rotated, old logs are removed considering log /var/log/boot.log log does not need rotating (log is empty) rotating pattern: /var/log/chrony/*.log weekly (10 rotations) empty log files are rotated, old logs are removed considering log /var/log/chrony/*.log log /var/log/chrony/*.log does not exist -- skipping not running postrotate script, since no logs were rotated .... etc.
/TMP Service Private mappen verwijderen
Eigen privé TMP voor elke service
Zie ook systemd for Administrators en Auto-update werkte niet
Service Private /tmp
Het root /tmp bestand is bedoeld als gedeelde ruimte voor alle locale services en gebruikers. Tijdenlang is dit een belangrijke bron van beveiligingsproblemen voor diverse services geweest. Symlink aanvallen en DoS kwetsbaarheden vanwege te raden tijdelijke /tmp bestanden was eenvoudig.
Door het /tmp bestand van een service te isoleren van de rest van de host worden zulke kwetsbaarheden verwaarloosbaar.
Met het inschakelen van zo'n Service-Private /tmp wordt de /tmp map die een service te zien krijgt privé en geisoleerd van de host /tmp map.
Elke service krijgt hierdoor tevens geen toegang meer tot de host (root) /tmp of /tmp mappen van andere services.
De Service Private /tmp wordt elke keer bij het opstarten van een service in de root /tmp aangemaakt.
Op de Mainserver zijn bijvoorbeeld op 17-aug-2024 de volgende Service Private /tmp mappen actief:
[root@mainserver ~]# ls -l /tmp drwxr-xr-x 2 serviio serviio 18 Aug 11 09:20 hsperfdata_serviio drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-arpwatch@enp34s0.service-znFtxN drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-chronyd.service-lwuXGT drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-clamd.service-f6gpTC drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-httpd.service-HPfh3u drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-php80-php-fpm.service-VmJwwg drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-php82-php-fpm.service-3CQb11 drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-php83-php-fpm.service-14vEMS drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-rh-mariadb105-mariadb.service-hTJHgE drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-rh-php73-php-fpm.service-9Gu4Lp drwx------ 3 root root 17 Aug 11 09:19 systemd-private-baea3de8fef1471cb363ebf37079ded8-system-mariadb.service-Xu0Jk7
Oude /TMP Service Private mappen verwijderen
Bij elke (her)start van een service of een (re)boot van de server wordt een nieuwe /tmp/systemd-private* folder aangemaakt.
Normaal gesproken worden tevens de oude
/tmp/systemd-private* folders verwijderd.
Het is enkele malen voorgekomen dat de oude bestanden niet verwijderd werden en de /tmp folder dus volloopt. Op zich geen probleem want de /tmp/systemd-private* folders zijn leeg en nemen dus nauwelijks ruimte in..
Handmatig verwijderen
Om de overbodige folders toch te verwijderen is de veiligste methode als volgt:
- Reboot de server en stel vast dat er nwe /tmp/systemd-private* folders aangemaakt zijn (timestamp)
- Run commando: # find /tmp/* -type d -mmin +1440 -delete (verwijdert alle folders van 1 dag en ouder.
- Reboot de server en stel vast dat er nwe /tmp/systemd-private* folders aangemaakt zijn en dat de oude, gemaakt onder 1, verwijderd zijn.