Δρομολογητής Banana Pi R64 - Debian, Wireguard, RKN

Το Banana Pi 64 είναι ένας υπολογιστής μονής πλακέτας παρόμοιος με τον Raspberry Pi, αλλά με πολλές θύρες Ethernet, γεγονός που καθιστά δυνατή τη μετατροπή του σε δρομολογητή που βασίζεται σε διανομή Linux γενικής χρήσης.

Δρομολογητής Banana Pi R64 - Debian, Wireguard, RKN

Ναι, υπάρχει ήδη το Openwrt, αλλά έχει τα δικά του προβλήματα, το GUI και το CLI του. Υπάρχει το Mikrotik, αλλά πάλι έχει δικό του GUI/CLI, και το Wireguard δεν βγαίνει από το κουτί... Γενικά θέλω ρούτερ με ευέλικτες ρυθμίσεις, παραμένοντας στα πλαίσια του τυπικού Linux που δουλεύεις. με κάθε μέρα.

Στο άρθρο με τα ονόματα BPI, R64, single-board, θα εννοώ το ίδιο πράγμα - το ίδιο το Banana Pi R64 single-board.

Επιλογή εικόνας. Λήψη μέσω eMMC

Η πρώτη δεξιότητα που πρέπει να αποκτήσετε όταν εργάζεστε SBC γενικά, και με το R64 ειδικότερα, αυτό σημαίνει να μάθετε πώς να φορτώνετε ένα λειτουργικό σύστημα σε αυτό και να μπορείτε να αλληλεπιδράσετε μαζί του, επειδή το R64 δεν διαθέτει θύρα για οθόνη (HDMI, για παράδειγμα). Όταν όλα έπεσαν - Wifi, Ethernet, Bluetooth, USB κ.λπ. σταμάτησαν να λειτουργούν. Υπάρχει ένα UART, μέσω της διεπαφής του οποίου μπορείτε πάντα να δείτε τι πήγε στραβά και επίσης να εκτελέσετε μερικές εντολές από την κονσόλα, εάν είναι απαραίτητο.

Αλγόριθμος για σύνδεση στο R64 μέσω USB-UART:

  • τρέχουμε στο κατάστημα ανταλλακτικών ραδιοφώνου για ένα καλώδιο USB-UART (PL2303, Serial-to-USB)
  • συνδέστε το ένα άκρο USB στον υπολογιστή και το άλλο, UART, στο R64, με τρία καλώδια στα τέσσερα, όπως στην παρακάτω εικόνα
  • εκτελείται στην κονσόλα του υπολογιστή sudo minicom

Μετά από αυτό, στις περισσότερες περιπτώσεις θα εμφανιστεί η κονσόλα μιας πλακέτας = επιτυχία.
Μπορείτε να δείτε περισσότερες λεπτομέρειες εδώ.

Δρομολογητής Banana Pi R64 - Debian, Wireguard, RKN

Στη συνέχεια, ο ευκολότερος τρόπος είναι να φορτώσετε το λειτουργικό σύστημα από μια κάρτα SD: λήψη από σύνδεσμος εικόνα και συμπληρώστε την:

unzip -p 2019-08-23-ubuntu-16.04-lite-preview-bpi-r64-sd-emmc.img.zip | pv | sudo dd of=/dev/mmcblk0 bs=10M status=noxfer

Εισάγουμε την κάρτα στην υποδοχή R64 SD, την ενεργοποιούμε και παρατηρούμε τη φόρτωση της συνδεδεμένης κονσόλας πρώτα uboot και μετά τυπική φόρτωση Linux.

Μια εναλλακτική επιλογή εκκίνησης είναι η χρήση μιας κάρτας 64 Gb που είναι ήδη ενσωματωμένη στο R8, που ονομάζεται eMMC. Σύμφωνα με τις οδηγίες στο wiki, αντιγράφουμε την εικόνα στη συσκευή
/dev/mmcblk0 σε BPI, επανεκκινήστε, αφαιρέστε την κάρτα SD, ενεργοποιήστε ξανά το BPI... και δεν λειτουργεί. Πώς να πηγαίνεις πέρα ​​δώθε Boot select μην ασχολείσαι.

Το γεγονός είναι ότι τουλάχιστον για το BPI πρέπει να ορίσετε μια ειδική σημαία για να μπορείτε να εκκινήσετε από μια εσωτερική μονάδα flash:

root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x48]

Στη συνέχεια, πρέπει να γράψετε το πρόγραμμα προφόρτωσης σε ένα ειδικό διαμέρισμα εκκίνησης

root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro 
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0

Ο κατασκευαστής R64 (Κίνα) δημοσίευσε αυτό το δυαδικό αρχείο εδώ. Τι κάνει είναι άγνωστο (δεν υπάρχουν πηγαίοι κώδικες), αλλά δεν θα λειτουργήσει ούτε χωρίς αυτό.

Γενικά, μετά από αυτό, οι εικόνες αρχίζουν να φορτώνονται από το eMMC. Αν θέλετε να το καταλάβετε και να δημιουργήσετε εικόνες από την αρχή, τότε και για τις δύο περιπτώσεις (SD/eMMC) θα πρέπει να γράψετε πολλά ακόμα αρχεία (προφόρτωση για κάρτα SD, ATF, u-boot) μόνο για να φτάσετε στη φόρτωση του πυρήνα. Αυτό το θέμα είναι ακόμα αναπτύσσεται, αλλά για εμάς το βασικό είναι ότι λειτουργεί και εντάξει.

Τώρα κατεβάζω μέσω eMMC, για να είμαι ειλικρινής, δεν το χρησιμοποιώ, μια κάρτα SD είναι αρκετή, αλλά ξόδεψα πολύ χρόνο για να λειτουργήσει, οπότε αφήστε το να είναι στο άρθρο.

Επιλογή λειτουργικού συστήματος. Αρμπιάν

Η πρώτη εργασία εφαρμογής είναι η εκκίνηση ενός VPN, φυσικά Wireguard. Αμέσως ανακαλύφθηκε ότι στην πλευρά του πυρήνα δεν ήταν συναρμολογημένο και δεν υπήρχαν κεφαλίδες. Έφτιαξα ξανά τον πυρήνα και, όπως συνηθίζω με το x86, συναρμολόγησα τη μονάδα πυρήνα χρησιμοποιώντας το DKMS. Ωστόσο, η ταχύτητα κατασκευής ακόμη και μικρών βοηθητικών προγραμμάτων στο arm64 με εξέπληξε δυσάρεστα. Και τότε χρειάστηκε μια άλλη μονάδα πυρήνα, κ.λπ. Σε γενικές γραμμές, αποδεικνύεται ότι όλα όσα σχετίζονται με τον πυρήνα συναρμολογούνται καλύτερα σε ένα ζεστό φορητό υπολογιστή x86, στη συνέχεια μεταφέρονται στο R64 με απλή αντιγραφή, επανεκκίνηση και δοκιμή.

Ένα άλλο πράγμα είναι το κομμάτι του userspace. Στην περίπτωσή μου να επιλέξω το Debian, τα πάντα για την αρχιτεκτονική του arm64 βρίσκονται ήδη στο packages.debian.org και δεν χρειάζεται να ξαναχτίσω τίποτα.

Για να μην βγάλω άλλο ποδήλατο, Ι μεταφερόμενος Αρμπιάν στο BPI R64.
Ή μάλλον, αυτό: το τμήμα userpace είναι Armbian και ο πυρήνας λαμβάνεται από το αποθετήριο Ειλικρινής-ΕΝΑ. Μπορείτε να κατεβάσετε την πιο πρόσφατη εικόνα εδώ.

Όλες οι δραστηριότητες για την ανάπτυξη του τμήματος λογισμικού του R64 διεξάγονται στις φόρουμ. Σε γενικές γραμμές, ο ίδιος ο κατασκευαστής προσπαθεί να διαδώσει τον δρομολογητή για το Openwrt, αλλά χάρη στη δραστηριότητα του προγραμματιστή Frank από τη Γερμανία, όλα τα χαρακτηριστικά καταλήγουν γρήγορα στον πυρήνα του Debian. Παραδόξως, ο Frank είναι ενεργός σε κάθε νήμα του φόρουμ.

Οργάνωση χώρου εργασίας: καλώδια

Ξεχωριστά, θα ήθελα να σας πω πώς, κατά την ανάπτυξη/δοκιμή, τοποθετείτε ένα SBC (όχι μόνο ένα BPI) σε ένα τραπέζι, ώστε να μην περνάει ένα καλώδιο Ethernet σε αυτό από μια πηγή Internet σε ολόκληρο το δωμάτιο/γραφείο. Το γεγονός είναι ότι, αφενός, πρέπει να παρέχετε ένα κομμάτι υλικού με Διαδίκτυο, αλλά από την άλλη, τα πάντα σε αυτό το κομμάτι υλικού μπορεί να χαλάσουν, και πρώτα απ 'όλα το Wi-Fi.

Πρώτα, αποφάσισα να αγοράσω ένα φτηνό "σφύριγμα" USB-Wifi, να το συνδέσω στη μοναδική θύρα του BPI και να ξεχάσω τα καλώδια. Για να το κάνω αυτό, αγόρασα ένα φθηνό TP-LINK TL-WN725N USB 2.0, αλλά πολύ σύντομα έγινε σαφές ότι δεν θα απογειωνόταν: για να λειτουργήσει το σφύριγμα, χρειάζεστε ένα πρόγραμμα οδήγησης πυρήνα, το οποίο, φυσικά, δεν υπήρχε (αργότερα συναρμολόγησα το απαραίτητο πρόγραμμα οδήγησης RTL8XXXU, αλλά δεν είναι ακόμα πρακτικό). Και το καλώδιο Ethernet χάλασε την εμφάνιση του δωματίου για λίγο.

Ως αποτέλεσμα, κατάφερα να απαλλαγώ από το καλώδιο με τη βοήθεια του Tenda MW3 (σύστημα πλέγματος Wifi): Απλώς τοποθέτησα έναν κύβο κάτω από το τραπέζι και συνέδεσα το BPI στη θύρα LAN του τελευταίου με ένα καλώδιο Ethernet μήκους ενός μέτρου. Επιτυχία.

Wireguard, RKN, Bird

Ένα από τα πράγματα για τα οποία θέλω να χρησιμοποιήσω το Banana PI είναι να έχω δωρεάν πρόσβαση σε ιστότοπους που έχουν αποκλειστεί από το RKN, ιδίως, έτσι ώστε οι κλήσεις Telegram και Slack να μπορούν να λειτουργούν. Άρθρα για το Habré έχουν ήδη προταθεί για αυτό το θέμα: ώρα, два, τρία.

Ανέπτυξα ακριβώς αυτήν τη λύση χρησιμοποιώντας το Ansible: σύνδεσμος.

Το VPS υποτίθεται ότι εκτελεί το Ubuntu 18.04. Έλεγξα τη λειτουργικότητα σε δύο hosters στην Ευρώπη: Amazon και Digital Ocean.

Έτσι, εγκαταστήσαμε το παραπάνω Armbian στο R64, είναι προσβάσιμο μέσω ssh με το όνομα hm-bananapi-1 και έχει πρόσβαση στο internet. Αναπτύσσουμε με συνέπεια Ansible, σενάρια αυτοματισμού και εκκινούμε την ίδια την εγκατάσταση στο R64:

# зависимости для Debian-based дистрибутивов
$ sudo apt install --no-install-recommends python3-pip python3-setuptools python3-wheel git
$ which pip3
/usr/bin/pip3

# ansible с pybook, скриптование на Python
$ pip3 install https://github.com/muravjov/ansible/archive/ansible-2.10.0.dev0-pybook2019.tar.gz

$ export PATH=~/.local/bin:$PATH
$ which ansible-playbook
/home/sa/.local/bin/ansible-playbook

$ git clone https://github.com/muravjov/ansible-bpi-r64.git
$ cd ansible-bpi-r64

$ git submodule update --init

# убеждаемся в доступности hm-bananapi-1
$ ssh hm-bananapi-1 which python3
/usr/bin/python3

# собственно установка
$ ansible-playbook ./router.py -l hm-bananapi-1

Στη συνέχεια, πρέπει να αναπτύξετε το VPN μας στο VPS με τον ίδιο τρόπο:

ansible-playbook ./router.py -l current-vpn

Εδώ το όρισμα είναι πάντα τρέχον-vpn και το πραγματικό όνομα VPS διαμορφώνεται σε μια μεταβλητή (σε αυτήν την περίπτωση είναι paris-vpn-aws-t2-micro-1):

$ grep current_vpn group_vars/all 
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-1

Ω ναι, πριν από όλες αυτές τις λειτουργίες πρέπει να δημιουργήσετε μυστικά (ιδίως κλειδιά Wireguard) στο φάκελο ./secrets, ο κατάλογος θα πρέπει να μοιάζει έτσι.

Ansible Automation σε Python

Μπορεί να παρατηρήσετε ότι αντί να είναι σε μορφή YAML, οι εντολές Ansible κωδικοποιούνται σε σενάρια Python. Για σύγκριση, πώς να ενεργοποιήσετε τον δαίμονα πουλιών με τον συνηθισμένο τρόπο:

- name: start bird
  systemd:
    name: bird
    state: started
    enabled: yes

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

with mapping:
    append("name", "start bird")
    with mapping("systemd"):
        append("name",  "bird")
        append("state", "started")
        append("enabled", "yes")

Η εγγραφή εντολών Ansible στην Python σάς επιτρέπει να επαναχρησιμοποιήσετε τον κώδικα και γενικά ανοίγει όλες τις δυνατότητες της γλώσσας γενικού σκοπού. Για παράδειγμα, εγκατάσταση πουλιού σε R64 και VPS:

install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")

δείτε τον κωδικό λειτουργίας install_bird().

Αυτό το χαρακτηριστικό καλείται pybook εφαρμόστηκε εδώ. Δεν υπάρχει ακόμα τεκμηρίωση για το pybook, αλλά θα διορθώσω αυτό το ζήτημα αργότερα.

Τι πιστεύει αντίθετα στο ρεύμα σ'αυτή την περίπτωση.

Παρακολούθηση. Προμηθέας

Σύνολο: το telegram λειτουργεί, το linkedin και το pornhub επίσης, γενικά η εμπειρία χρήστη είναι εντάξει. Αλλά όλα μπορούν να σπάσουν, συμπεριλαμβανομένου του κινεζικού υλικού.

Οι ενημερώσεις του πυρήνα μπορεί επίσης να είναι ενδιαφέρουσες: για παράδειγμα, ήθελα να ενημερώσω τον πυρήνα 5.4 => 5.6, λοιπόν, το Wireguard είναι εκεί έξω από το κουτί, δεν χρειάζεται να επιδιορθωθεί... Όχι νωρίτερα: Μετέφερα με κόπο τις ενημερώσεις κώδικα από την 5.4 στο 5.6, ο πυρήνας ξεκίνησε, η σήραγγα προς το VPS έγινε ping, αλλά το πουλί δεν μπορεί να συνδεθεί με το σφάλμα "BGP Error" ... "Ξεκίνησα με φρίκη" (c) στο 5.4. Η μετάβαση στο 5.6 αναβλήθηκε στο TODO.

Επομένως, εκτός από την εγκατάσταση του δρομολογητή και του VPS, πρόσθεσα παρακολούθηση (στο x86 Ubuntu 18.04), η οποία είναι εγκατεστημένη σε ξεχωριστό κεντρικό υπολογιστή με τα ακόλουθα στοιχεία:

  • prometheus, alertmanager, blackbox_exporter - όλα στο docker
  • Οι ειδοποιήσεις αποστέλλονται στο κανάλι τηλεγραφήματος χρησιμοποιώντας το bot metalmatze/alertmanager-bot - επίσης στο Docker
  • tor για το bot, έτσι ώστε το bot να μπορεί να ειδοποιεί καταστάσεις όταν υπάρχει Διαδίκτυο, αλλά το Telegram εξακολουθεί να μην λειτουργεί και το ίδιο το ρομπότ δεν μπορεί να συνδεθεί
  • εφαρμοσμένος ειδοποιήσεις: NodeVPNTroubles (χωρίς ping σε VPS), BirdVPNTroubles (χωρίς περίοδο λειτουργίας Bird), AntifilterDownloadTroubles (σφάλμα κατά τη φόρτωση αποκλεισμένων διευθύνσεων IP), SiteTroubles (το κακόμοιρο τηλεγράφημα δεν είναι διαθέσιμο)
  • ειδοποιήσεις συστήματος, για παράδειγμα, HostGrowingDiskReadLatency (η φθηνή κάρτα SD γίνεται δυσανάγνωστη)

Παράδειγμα εγκατάστασης παρακολούθησης:

ansible-playbook ./monitoring.py -l monitoring-preprod

Το Auto Discovery for Prometheus έχει ρυθμιστεί στο φάκελο /etc/prometheus/auto_http, ένα παράδειγμα προσθήκης κεντρικού υπολογιστή στην παρακολούθηση (οι κεντρικοί υπολογιστές δεν παρακολουθούνται από προεπιλογή):

bash << 'EOF'
HOSTNAME=hm-bananapi-1
IP_ADDRESS=`ssh -G $HOSTNAME | awk '/^hostname / { print $2 }'`

ssh monitoring-preprod sudo sponge /etc/prometheus/auto_http/$HOSTNAME.json << EOF2
[
  {
    "targets": ["$IP_ADDRESS:9100"],
    "labels": {
      "env": "prod",
      "hostname": "$HOSTNAME"
    }
  }
]
EOF2
EOF

TODO: 2 πάροχοι, 2 BPI, anycast failover

Εκτός από όλα, σχεδίαζα να συνδεθώ σε δύο παρόχους, ώστε το Διαδίκτυο να συνεχίσει να λειτουργεί, ακόμα κι αν ένας πάροχος είχε προβλήματα με το δίκτυο ή ξέχασε να πληρώσει για το Διαδίκτυο κ.λπ., και άλλους ανθρώπινους παράγοντες.

Περιγράφεται η πιο προηγμένη εμπειρία χρήστη στο θέμα του multi-wan εδώ για το σύστημα Mwan3 στο Openwrt. Αυτή η λύση έχει πλούσια λειτουργικότητα, αλλά η ρύθμιση και η λειτουργία της γενικά για multi-wan είναι αρκετά ενοχλητική. Μόνο ένα παράδειγμα: εάν έρθετε σε ορισμένους ιστότοπους από δύο διευθύνσεις IP ταυτόχρονα, μπορεί να μην τους αρέσει, θα σταματήσουν να λειτουργούν => "το Διαδίκτυο δεν λειτουργεί."

Λαμβάνοντας υπόψη αυτή την εμπειρία, αποφάσισα ότι η πολυκατοικία δεν είναι ακόμα προτεραιότητα, μόνο η αποτυχία. Αν και, φαίνεται ότι στις πιο πρόσφατες εκδόσεις του Linux όλα θα πρέπει να λειτουργούν με μία εντολή όπως:

ip route add default 
    nexthop via 192.168.1.1 weight 10 
    nexthop via 192.168.2.1 weight 5

Έτσι, για να αποφύγουμε ένα μόνο σημείο αστοχίας, παίρνουμε 2 BPI, συνδέουμε το καθένα με έναν πάροχο, τα συνδέουμε μεταξύ τους και κάνουμε τη σύνδεση μεταξύ τους δυναμική δρομολόγηση μέσω bird/OSPF.

Στη συνέχεια, διαφημίζουμε την ίδια διεύθυνση IP σε καθεμία εάν η υπηρεσία είναι διαθέσιμη (Internet, DNS). Δηλαδή, δεν θα ορίσουμε μόνοι μας την προεπιλεγμένη διαδρομή, αλλά μέσω bird. Κατάσκοπα τη λύση εδώ .

Αυτή η λειτουργία δεν έχει ακόμη εφαρμοστεί, ο ύπουλος κορωνοϊός έπαιξε ένα κόλπο εδώ (δεν έφτασαν όλα από το Aliexpress· ένα άλλο ηλεκτρονικό κατάστημα, το Layta, υποσχέθηκε να παραδώσει σε μια εβδομάδα, αλλά πέρασε περισσότερο από ένας μήνας· ο δεύτερος πάροχος δεν είχε χρόνο για να επεκτείνει το καλώδιο πριν από την καραντίνα, κατάφερε μόνο να ανοίξει μια τρύπα στο τρυπάνι στον τοίχο για το καλώδιο).

Πώς να παραγγείλετε το R64

Ο ίδιος ο πίνακας βρίσκεται στο επίσημο κατάστημα SinoVoip.
Είναι επίσης καλύτερο να παραγγείλετε αμέσως:

  • τροφή + ενημερώστε το πρότυπο βύσματος ΕΕ ή ΗΠΑ
  • ψύκτρα: καλοριφέρ/ανεμιστήρες. επειδή τόσο η CPU όσο και το τσιπ διακόπτη θερμαίνονται
  • κεραία wifi, για παράδειγμα

Υπάρχει μια απόχρωση - η τιμή παράδοσης έχει γίνει ανεπαρκώς υψηλή στο επίσημο κατάστημα εδώ και αρκετό καιρό. Ο διευθυντής Judy Huang με έπεισε ότι δεν υπήρχε σφάλμα και μπορούσατε να επιλέξετε το ePacket για 5 $, αλλά είδα ότι για τη Ρωσία υπάρχει μόνο EMS για >33 $. Δυσάρεστο, αλλά όχι επικριτικό. Επιπλέον, εάν επιλέξετε οποιαδήποτε άλλη χώρα για παράδοση (πέρασα από όλες τις ηπείρους), η παράδοση θα κοστίσει ~5$. Ρωσόφοβοι;.. Αλλά μετά διαπίστωσα ότι για Γαλλία η τιμή παράδοσης είναι επίσης ~30$ και ηρέμησα.

Ως αποτέλεσμα, η Judy προσφέρθηκε να κάνει μια παραγγελία, αλλά όχι να πληρώσει (υπαινιγμός: βάλτε λιγότερα στην κάρτα για να μην πραγματοποιηθεί η αυτόματη πληρωμή). γράψε της και θα μειώσει την τιμή παράδοσης στο κανονικό. Επιτυχία.

Θέματα

Δεν λειτουργούν όλα τέλεια ακόμα.

Παραγωγικότητα

Ansible=Οι εντολές Python εκτελούνται αργά, ακόμα και οι αδρανείς, για 20-30 δευτερόλεπτα. μια τάξη μεγέθους μεγαλύτερη από ό,τι σε φορητό υπολογιστή x86. Επιπλέον, στην αρχή εκτελούνται αρκετά γρήγορα, ~3 δευτερόλεπτα, μετά επιβραδύνουν απότομα. Αυτό μπορεί να οφείλεται στη θέρμανση της CPU (σταγματισμός). Ο κώδικας Go χρειάζεται επίσης πολύ χρόνο για να λειτουργήσει:

# запрос метрик для прометея из node_exporter на Go
$ time curl -s http://172.30.1.1:9100/metrics > /dev/null

real    0m6,118s
user    0m0,005s
sys     0m0,009s

# однако температура 51 градус, не так и много
sa@bananapir64:~$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
51700

Wi-Fi

Το Wifi λειτουργεί, αλλά στο Armbian σταματά μετά από περίπου μια μέρα, γράφει:

sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Message 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Message 50 (seq 4) timeout
...

Μόνο μια επανεκκίνηση βοηθάει. Πρέπει να προχωρήσουμε ξεδιαλύνω.

Ethernet

Το Ethernet λειτουργεί, αλλά μετά από ~64 ώρες τα πακέτα (DHCP) από το RXNUMX σταματούν να φτάνουν.
Η επανεκκίνηση της διεπαφής βοηθά:

ifdown br0; sleep 30; ifup br0

Το πρόγραμμα οδήγησης είναι νέο, δεν έχει γίνει δεκτό στον πυρήνα ακόμα, ελπίζω να είναι κινέζικο Landen Chao το τελειώνει.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο