Tag Archives: Linux

Εντοπισμός documentation της βιβλιοθήκης libcrypt της OpenSSL για υπάρχουσες μεθόδους σε διανομές GNU/Linux.

Στο master thesis μου έπρεπε να κάνω ένα demo που να υλοποιεί ένα group key agreement. Μετά από πολύ ψάξιμο κατέληξα στην OpenSSL λόγο ότι έχει low level apis για να αναπτύσσεις ΚΑΙ δικό σου κρυπτογραφικό πρωτόκολλο.

Παρόλα αυτά υπήρχε δύσκολο-προς-εντοπισμό documentation έτσι το παρόν άρθρο το χρησιμοποιώ σαν index για το τι πρέπει να δώσω στην εντολή man ή που να πάω προκειμένου να μπορέσω να βρω πως χρησιμοποιείτε οι functions της βιβλιοθήκης.

  1. Getting Started βασική χρήση: Σύνδεσμος
  2. Diffie Hellman: Μεταβείτε σε αυτήν την σελίδα κάντε copy το όνομα μιας μεθόδου και σε τερματικό δώστε:
    man ^paste_την_function_που_κάνατε_copy_εδώ^
  3. BigNum για αριθμητική αριθμών για που λαμβάνουν μεγάλο χώρο στην μνήμη πχ.1024 ή 2048 bit ακεραίων:
    1. Όλες oι functions καταλογραφημένες είναι στο αποτέλεσμα της εντολής:
      man bn
    2. Για εκάστοτε function αναζητήστε:
      man ^όνομα_function_προηγούμενου_βήματος^
  4. Επίσημο Documentation για όλες της μεθόδους εδώ. Για εντοπισμό εγκατεστημένης έκδοσης δίνετε στο τερματικό:
    openssl version
Advertisements

Περιβάλλον Unix σε Microsoft Windows 10 μέσω MingW και Git-bash

Ουκ ολίγες φορές θέλουμε ένα περιβάλλον gnu/linux το MingW αποτελεί μια λύση που προσφέρει βασικούς compilers για χτίσιμο εφαρμογών μέσω περιβάλλοντος GNU/Linux. Για αρχή θα χρειαστείτε να εγκαταστήσετε τα λογισμικάό git, αργότερα μπορείτε να το κατεβάσετε μέσω sourceforge από αυτό το link το mingw. Η διαδικασία είναι Next-Next-next, έτσι δεν χρειάζεται επιπλέων εξήγηση. (Σημείωση επιλέγουμε το nano σαν default editor κατά την εγκατάσταση του git.)

Εφόσον τα εγκαταστήσαμε πρέπει να ορίσουμε τρόπο αναζήτησης των πακέτων που προέρχονται από το mingw, προτού γίνει όμως αυτό θα πρέπει να ορίσουμε το πρόγραμμα mingw-get στην μεταβλητή συστήματος PATH προκειμένου να γίνει αυτό θα πρέπει να ακολουθήσουμε τα παρακάτω βήματα:

  1. Είτε πατώντας τον συνδυασμό των πλήκτρων Windows+ Pause break είτε κάνοντας κλικ στο κουμπί αναζήτησης και αναζητούμε «System Settings» το αποτέλεσμα είναι η παρακάτω εικόνα
  2. Στην παραπάνω εικόνα κάνουμε κλικ στο «Αλλαγή Ρυθμίσεων» και μετά στο «Μεταβλητές Περιβάλλοντος» όπως δείχνει η παρακάτω εικόνα με τις κατάλληλες επισημάνσεις:
  3. Στο παράθυρο που μα ανοίγει επιλέγουμε την μεταβλητή «Path» και κάνουμε κλίκ στο κουμπί «Επεξεργασία»
  4. Μετά στο παράθυρο που μας ανοίγει προσθέτουμε από κάτω τις υπάρχουσες τιμές την τιμή C:\\MinGW\bin
  5. Ανοίγουμε το λογισμικό Git-Bash και δίνουμε την εντολή:
    mingw-install --help
  6. Εαν εμφανίζει οποιαδήποτε έξοδο τότε η εγκατάσταση έχει επιτευχθεί.

Πλέον μπορούμε να αναζητήσουμε με την εντολή:

mingw-get list ^όνομα πακέτου^

 

Ακόμη σε περίπτωση που αναπτύσσετε η κάνετε build λογισμικό τρίτων γραμμένο σε c ή c++ πρέπει να εγκαταστήσετε τα παρακάτω:

mingw-get install mingw32-make g++ gcc autoconf

μετά τρέχετε την εντολή:

nano ~/.bashrc

Και προσθέτετε το εξής:

alias make="mingw32-make"

Και με Ctrl+O, Enter και Ctrl+X βγαίνετε και το αποθηκεύετε. Μετά κλείνετε και ανοίγετε το git-bash και δίνοντας την εντολή:

make --help

Επιβεβαιώνετε ότι παίζει το make.

Πλέον έχετε ένα περιβάλλον GNU/Linux-Unix σε Microsoft Windows!!!!

layout of a network having ubuntu as gateway

Ρύθμιση Ubuntu 16.04 σαν πύλη (gateway) δίκτυου.

Ας υποθέσουμε ότι έχουμε το εξής σενάριο έχουμε ένα μηχάνημα που τρέχει ubuntu 16.04 LTS server edition και θέλουμε αυτό να αποτελεί πύλη δικτύου για ένα τοπικό δίκτυο. Ουσιαστικά θέλουμε να πετύχουμε το εξής:

layout of a network having ubuntu as gateway

Όπως βλέπετε στην εικόνα θέλουμε όλη η κίνηση του δικτύου να περνά από ένα μηχάνημα το οποίο θα λειτουργεί σαν πύλη δρομολόγησης δικτύου. Για να επιτευχθεί αυτό θα πρέπει να κάνουμε τα εξής βήματα:

    1. Θα πρέπει να ορίζουμε ip δικτύου για την κάρτα μας η οποία αντιστοιχεί στο τοπικό δίκτυο, για να γίνει αυτό θα πρέπει να δώσουμε την εντολή:
      sudo nano /etc/network/interfaces
      

      Και να ορίσουμε μια στατική διεύθυνση για την κάρτα μας προσθέτοντας γραμμές σαν:

      auto enp0s8
      iface enp0s8 inet static
      address 10.0.6.1
      netmask 255.255.255.0
      broadcast 10.0.6.255
      dns-nameservers 8.8.8.8
      

      Η παραπάνω ρύθμιση αποτελεί ενδεικτική και θυμηθείτε να ορίσετε το κατάλληλο εύρος ip. Στην δικιά μας περίπτωση θα στήσουμε ένα ΝΑΤ δίκτυο έτσι θα έχουμε 255 διευθύνσεις με χρήσιμο εύρος 10.0.6.1 – 10.0.6.254. Ορίστε τις κατάλληλες ρυθμίσεις ανάλογα με τις ανάγκες σας.
      Μπορείτε να δείτε τα διαθέσιμα interface δικτύου με την εντολή:

      ifconfig -a 
    2. Μετά θα πρέπει να ενεργοποιήσουμε την προώθηση ipv4 που θα γίνει με την εντολή:
      sudo nano /etc/sysctl.conf

      Και να κάνουμε uncomment την γραμμή (αφαιρώντας το #):

      net.ipv4.ip_forward=1

      Μετά πρέπει να δώσουμε την εντολές:

      sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
    3. Μετά μένει να ενεργοποιήσουμε την κάρτα δικτύου δίνοντας τις εντολές (1 προς 1):
      sudo ifdown enp0s8
      sudo ifup enp0s8
      sudo service networking restart
    4. Μετά θα πρέπει να ορίσουμε στο firewall να ανακατευθύνει σωστά την κίνηση (δίνοντας μια προς μια τις εντολές):
      EXT=enp0s3
      INT=enp0s8
      sudo iptables -t nat -A POSTROUTING -o $EXT -j MASQUERADE
      sudo iptables -A FORWARD -i $EXT -o $INT -m state --state RELATED,ESTABLISHED -j ACCEPT
      sudo iptables -A FORWARD -i $INT -o $EXT -j ACCEPT
      

      Ουσιαστικά ορίσαμε 2 enviromental variables:

      • EXT που εμπεριέχει την διεπαφή που κοιτά το διαδίκτυο
      • INT που εμπεριέχει την διεπαφή του εσωτερικού μας δικτύου

      Και βάση με αυτών ορίσαμε την προώθηση των πακέτων στο ενσωματωμένο firewall του GNU/Linux iptables.

    5. Τώρα μένει να αποθηκεύσουμε τις ρυθμίσεις του firewall με τις εντολές:
      sudo apt-get install iptables-persistent
      /etc/init.d/iptables-persistent save
      

Ακόμη εφόσον ορίσαμε το gateway μας θέλουμε να μπορούμε να διευθυνσιοδοτούμε αυτόματα μέσω dhcp έτσι θα εγκαταστήσουμε και θα ρυθμίσουμε το πρόγραμμα dnsmasq ο οποίος θα αποτελεί ο dhcp server μας. Για την εφκατάστασή του δίνουμε:

sudo apt-get install dnsmasq

Μετά μένει να τον ρυθμίσουμε, για να το κάνουμε θα πρέπει να δώσουμε την εντολή:

sudo nano /etc/dnsmasq.conf

Και να ορίσουμε τις παρακάτω ρυθμίσεις (σημείωση ότι έχουν προσαρμοστεί στην περίπτωσή μου):

interface=enp0s8
dhcp-range=10.0.6.2,10.0.6.254,12h

Σε περίπτωση άλλων ip ορίστε διαφορετικά ranges εξαιρώντας την/τις ip του gateway και του μηχανήματος. Για επανεκκίνηση του δαίμονα δώστε:

sudo service dnsmasq restart

Σημείωση

Σε περίπτωση που παίζετε με εικονικές μηχανές Virtualbox παρακαλώ ΑΠΕΝΕΡΓΟΠΟΙΕΙΣΤΕ τον dchp server του VIRTUALBOX.

Στήσιμο Lamp (Linux Apache Mysql/MariaDB) Stack σε Debian και Ubuntu

Ο συνδιασμός του Apache http server της php και της mysql είναι αρκετά δημοφιλής συνδιασμός για webserver από εδώ και υπερβολικά αρκετό καιρό στο web, αυτός ο συνδιασμός είναι γνωστός και σαν LAMP stack. Έτσι θα σας δούμε βήμα – βήμα πως να στήσετε έναν webserver απλά και ωραία σε Debian/Ubuntu.

Σημείωση: παρακαλώ εάν το μηχάνημα σας δεν έχει sudo παρακαλώ να το εγκαταστήσετε.

Κατ’ αρχάς θα εγκαταστήσουμε την βάση δεδομένων μας με την εντολή:

sudo apt-get install mysql-server

Σε Ubuntu 14.04 και νεότερη μπορείτε να δώσετε την εντολή (Δεν υπάρχει σε Ubuntu 16.04):

sudo apt-get install mariadb-server-5.5

Για την εγκατάσταση της Mariadb που είναι ο αντικαταστάτης της Mysql.

Ακόμη υπάρχει και η Mariadb 10 που είναι η νεότερη έκδοση της Mariadb και μπορείτε να δείτε οδηγίες στο https://downloads.mariadb.org/mariadb/repositories ανάλογα με την διανομή και την έκδοση της διανομής σας, καθώς και οδηγίες για το πως να εγκαταστήσετε την Mariadb 5 (της προηγούμενης έκδοσης) όσο σε Ubuntu 12.04 LTS και σε Debian, και όχι μόνο σε αυτές τις διανομές. Η έκδοση 10 είναι προεπιλογή σε ubuntu 16.04 κα εγκαθιστάτε με την εντολή:

sudo apt-get install mariadb-server-10.0

Μετά εγκαθιστούμε ον apache webserver και την υποστήριξη της php:

  • Για ubuntu 14.04 και νεώτερες εκδόσεις:
    sudo apt-get install apache2 php5 libapache2-mod-php5
  • Για ubuntu 16.04 και νεώτερες εκδόσεις:
    sudo apt-get install apache2 libapache2-mod-php
    sudo a2enmod php7.0
    sudo a2dismod mpm_event
    sudo a2enmod mpm_prefork
    sudo service apache2 restart
    

Και την υποστήριξη της php με την mysql:
Για εκδόσεις 14.0 και παλαιότερες:

  • Για MariaDB και ενδεικνυόμενος τρόπος
    sudo apt-get install php5-mysqlnd
  • Εναλλακτικός τρόπος:
    sudo apt-get install php5-mysql

Σε Ubuntu 16.04:

sudo apt-get install php-mysql

Και εγκαθιστούμε και μερικά php modules που ζητούν τα περισσότερα cms (drupal, wordpress, joomla) και πλατφόρμες όπως phpBB3 και όχι μόνο κλπ κλπ.

  • Για ubuntu 14.04 και παλαιότερες
    sudo apt-get install php5-imagick php5-gd php5-curl php5-imap php5-mcrypt
  • Για ubuntu 16.04:
    sudo apt-get install php-imagick php-gd php-curl php-imap php-mcrypt

Για δοκιμή δημιουργούμε ένα αρχείο .php:

sudo bash `echo "<?php phpinfo();?> " > /var/www/html/phptest.php`

Και επισκεπτόμαστε http://localhost/phptest.php στον browser μας αν κάνουμε δοκιμές στο δικό μας μηχάνημα ή http://^διεύθυνση μηχανήματος^/phptest.php αν τρέχουμε σε απομακρυσμένο μηχάνημα ή σε εικονικό μηχάνημά με να είναι η ip η το domain name του μηχανήματός μας.

Ο Apache και η mysql (ή η mariadb αντίστοιχα) σταματάνε με τις αντίστοιχες εντολές:

sudo service apache2 stop
sudo service mysql stop

Και εκκινούν με τις αντίστοιχες εντολές:

sudo service apache2 start
sudo service mysql start

Αν δεν θέλεται να ξεκινάνε αυτόματα με την εκκίνηση δίνουμε:

  • Για την mysql/mariadb
    echo "manual" | sudo tee /etc/init/mysql.override
  • Για τον apache webserver
    sudo update-rc.d -f apache2 remove

Τέλος το περιεχόμενο που θα σερβίρει είναι στον φάκελο: /var/www. Αλλά υπάρχει η δυνατότητα να σερβίρει διαφορετικό περιεχόμενο ανάλογα με το url έτσι να φιλοξενεί περισσότερες σελίδες. Αυτό θα το δούμε σε ένα διαφορετικό άρθρο.

Μεταγλώτηση κώδικα που χρησιμοποιεί MPI σε Ubuntu Linux για το εργαστήριο των Κατανεμημένων

Επικαιροποιω συχνά το άρθρο να είναι up-to-date παρακαλώ αφήστε σχόλια από κάτω για όποιο πρόβλημα

Σε ubuntu Linux ανοίγουμε ένα τερματικό και δίνουμε την εξής εντολή:

sudo apt-get install -y libopenmpi-dev openmpi-bin

Μετά για compile δίνουμε πάλι σε τερματικό:

mpicc -o ^binary_file^ ^source_code_file^ 

Για ευκολότερο debugging δοκιμάστε compile με:

mpicc -g -o ^binary_file^ ^source_code_file^ 

Σε segfaults θα λαμβάνετε καλύτερα τα errors ;).

Μετά μπορείτε να εκτελείτε το  εκτελέσιμο πρόγραμμα μέσω:

mpirun -np ^cluster_size^ ^binary_file^ 

Όπου ^cluster_size^ κάποιος αριθμός  (όχι και 1000000). Στην ουσία θα έχουμε έναν cluster με ^cluster_size^ κόμβους.

Μπορείτε με τον παρακάτω κώδικα να δοκιμάσετε τις εντολές:

#include "mpi.h"
#include %lt; stdio.g %gt;
int main( int argc,char *argv[] )
{
int rank, size;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( "Cluster size: %d\nTerminal ID: %d\n",size,rank );
MPI_Finalize();
return 0;
}

Δοκιμάστηκε τελευταία φορά σε Ubuntu 16.04 LTS στις 11/11/2018. Ακόμη ο κώδικας είναι διαθέσιμος στο εξής github repository: https://github.com/pc-magas/mpi-sample (ΜΗΝ κάνετε copy paste από πάνω.)

PS: Ένα tip για να μην παιδεύεστε με το output σε 1 τερματικό μπορείτε να τρέξετε το πρόγραμμα κάπως έτσι:

mpirun -np ^cluster_size^ xterm -hold -e ^binary_file^ & 

Με το παραπάνω θα τρέχετε κάθε node του cluster σε ξεχωριστό τερματικό. Εάν δεν έχετε εγκατεστημένο το xterm μπορείτε να χρησιμοποιήσετε τον terminal emulator που έρχεται με την διανομή σας παρόλα αυτά με το xterm θα μπορείτε να τρέχετε το πρόγραμμάσας χωρίς να κλείνει το τερματικό με το πέρας αυτού.