Бездротової жорсткий диск за допомогою SSHFS і Raspberry Pi



Всім привіт!

Хочу поділитися з вами моїм досвідом створення бездротового жорсткого диска на Raspberry Pi. Моя стаття відмінно підійде тим, хто використовує лінукс в якості основної ОС, т. до. тут я активно використовую SSHFS.

Всіх зацікавлених прошу під кат.

Крок 0. Підготовка
Нам необхідно:
  • Raspberry Pi будь-якої моделі + SD картка пам'яті до 32 GB;
  • Жорсткий диск;
  • Якщо жорсткий диск без зовнішнього живлення, то, швидше за все, знадобиться хаб з можливістю підключення зовнішнього живлення;
  • Основний комп'ютер працює під лінуксом (статті я використовую Linux Mint 17);
  • Інтернет;
  • Прямі руки.


Крок 1. Установка
Для початку необхідно встановити на Raspberry Pi Raspbian або Arch Linux ARM.
В статті я буду використовувати Raspbian.
  1. Йдемо на сайті Raspberry Pi в розділ завантаження і завантажуємо образ Raspbian
  2. Розпаковуємо архів
  3. Відкриваємо термінал і переходимо в папку з образом
  4. Вставляємо картку пам'яті в комп'ютер
  5. В терміналі вводимо df-h і дивись на висновок. У висновку повинно бути /dev/mmcblk0p1 або /dev/sdd1. У моєму випадку це /dev/mmcblk0p1. p1 (або 1, якщо у вас картка відображається як /dev/sdd1) це номер розділу, якщо на картці кілька розділів, то у висновку ще буде /dev/mmcblk0p2 або /dev/sdd2. Кількість записів у висновку залежить від того скільки у вас розділів
  6. Отже, дізнавшись як ваша картка відображається в системі переходимо до запису образу.
    1. В терміналі запускаємо umount /dev/mmcblk0p1 (або umount /dev/sdd1). Якщо у вас кілька розділів, то необхідно від'єднувати все.
    2. Записувати на картку образ будемо з допомогою програми dcfldd. Програма dcfldd працює так само як dd, але періодично повідомляє про те скільки вже записано. Введіть в термінал наступну команду:

      $ sudo dcfldd bs=4M if=имя_вашего_образа_.img of=путь_к_вашей_карте
      

      В моєму випадку команда виглядає так:

      $ sudo dcfldd bs=4M if=2014-12-24-wheezy-raspbian.img of=/dev/mmcblk0
      

      Зверніть увагу, що у шляху до вашої карті не треба вказувати номер розділу (навіть якщо він один). Образ записується на всю карту.
      bs — block size — розмір одного блоку, записывающегося на карту. Якщо при встановлених 4M запис не працює, то необхідно поставити 1M, але це призведе до збільшення часу запису.
    3. Після того як образ буде записаний запустіть команду:

      $ sync 

      Це дозволить переконатися в тому, що всі дані були записані на картку і очистить буфер
  7. Все. Картки можна виймати і вставляти в Raspberry Pi.


Крок 2. Перше включення
  1. Вставляємо картку в Raspberry Pi;
  2. Підключаємо до Raspberry Pi інтернет, монітор і клавіатуру;
  3. Включаємо Raspberry Pi;
  4. Після завантаження системи у вас повинно з'явиться вікно Raspberry Pi Software Configuration Tool.
    1. Вибираємо пункт Expand Filesystem і натискаємо Enter. Це дозволить переконатися в тому, що весь обсяг картки доступний ОС
    2. Далі переходимо до пункту 2 — Change User Password і вводимо новий пароль;

    3. Переходимо до пункту 3 — Enable Boot to… і вибираємо Console Text console;
    4. Переходимо до пункту 4 — Internationalisation Options і потім переходимо до пункту Change Locale і шукаємо у списку uk_ua.UTF-8, UTF-8, помічаємо пробілом і натискаємо Enter. Далі система запитає яку локаль використовувати за промовчанням. Вибираємо російську і натискаємо Enter;
    5. Йдемо знову в Internationalisation Options і потім переходимо до пункту Change Timezone. Вибираємо Europe і шукаємо у списку своє місто. Потім натискаємо Enter;
    6. Переходимо до пункту 7 — Overclock (розженемо трохи нашу дівчинку) і вибираємо рівень Medium;
    7. Переходимо до пункту 8 — Advanced Options і переходимо до пункту A2 — Hostname. Вводимо ім'я під яким ми хочемо бачити нашу дівчинку в локальній мережі і тиснемо Enter;
    8. Йдемо знову в Advanced Options і переходимо до пункту A4 — SSH і вмикаємо SSH;
    9. На цьому наші пригоди в Raspberry Pi Software Configuration Tool закінчені. Натискаємо стрілку вправо і Finish.
  5. Якщо необхідно знову потрапити в цю програму, то потрібно ввести:

    $ sudo raspi-config
    
  6. Тепер потрібно перезавантажити систему. В консолі вводимо команду:

    $ sudo reboot
    
  7. Після того як система перезавантажиться заходимо в обліковий запис. Логін pi пароль той що ви ввели раніше;
  8. Тепер необхідно оновити ОС. Для цього вводимо:
    $ sudo rpi-update
    
    і після цього
    $ sudo apt-get update 
    
    та
    $ sudo apt-get upgrade 
    



Крок 3. Налаштування SSH
  1. Насамперед необхідно згенерувати ключі (якщо вони ще не згенеровані). Для цього на основній ОС:

    $ ssh-keygen-t rsa-C "[email protected]"
    
  2. Після чого ключі необхідно скопіювати на вашу Raspberry Pi.
    1. Для цього необхідно дізнатися під яким ваша ip малятко знаходиться в мережі. Це можна дізнатися зайшовши на роутер, наприклад.
      У мене ip 192.168.0.102.
    2. Тепер виконуємо команду на основній ОС:

      $ ssh-copy-id [email protected].0.102
      

      Вас попросять ввести згоду на продовження підключення. Потрібно ввести yes. Після чого вас попросять ввести пароль від облікового запису на Raspberry Pi. Вводимо і його.
  3. Тепер можна спробувати підключитися до вашої Raspberry Pi через ssh. Для цього на основний машині введіть:

    $ ssh [email protected]
    
  4. Якщо ви побачите повідомлення привітання, то, ура, ви увійшли
  5. Тепер можна відключити від Raspberry Pi монітор і клавіатуру. Всі подальші дії ми будемо проводити через SSH


Крок 4. Причісування Raspberry Pi
  1. По-перше, необхідно вказати пароль для root a т. к. за замовчуванням він відсутній. Для цього виконайте:
    $ sudo passwd root
    
    І введіть новий пароль для root a
  2. Встановлюємо редактор vim:
    $ sudo apt-get install vim
    
  3. Тепер я хочу змінити ім'я користувача. Для цього виходимо з допомогою команди exit. Знову логинимся через ssh, але вже під рутом.
    $ ssh [email protected]
    
    і виконуємо команду:
    $ usermod-l новое_имя-d /home/новое_имя-m pi
    
    Я використовую в якості нового імені inn0kenty, тобто в моєму випадку команда виглядає так:
    $ usermod-l inn0kenty-d /home/inn0kenty-m pi
    



Крок 5. Статичний ip
У мене працює DHCP, тому при кожному підключенні Raspberry Pi до домашньої мережі їй буде видаватися новий ip-адресу, що мене звичайно не влаштовує. Для того щоб зробити ip статичним необхідно виконати:
  1. Введіть в терміналі
    $ sudo vim /etc/network/interfaces
    
    У відкритому файлі міняємо
    iface eth0 inet dhcp
    
    на
    iface eth0 inet static
    address 192.168.0.98 
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255
    шлюз 192.168.0.1
    
    Вказавши при цьому параметри вашої мережі. Netmask і broadcast можна дізнатися за допомогою команди sudo ifconfig, а gateway з допомогою sudo route-nee.
  2. Після чого перезавантажуємо Raspberry Pi командою sudo reboot
  3. Тепер для того, щоб підключитися до Raspberry Pi за shh необхідно ввести
    $ ssh [email protected]
    

Крок 6. Причісуємо SSH
На цьому кроці я покажу як спростити підключення по ssh і зробити його більш безпечним.
  1. Насамперед відкриємо файл конфігурації ssh з допомогою команди:
    $ sudo vim /etc/ssh/sshd_config
    
    І встановлюємо у ньому заборона входити по ssh користувачеві root і відключаємо аутентифікацію по паролю:
    PasswordAuthentication no
    PermitRootLogin no
    
    А також міняємо порт
    Port 22226 (наприклад)
    
  2. Після чого перезавантажуємо Raspberry Pi
    $ sudo reboot
    
  3. Тепер для підключення до Raspberry Pi необхідно вказувати порт 22226
    $ ssh-p 22226 [email protected]
    
    Але настільки довгу команду можна спростити і звести до мінімуму. Для цього на вашій основній ОС відредагуємо файл config. В домашній директорії, виконайте:
    $ vim .ssh/config 
    
    і вставити туди наступні рядки:
    Host 192.168.0.98
    Hostname 192.168.0.98
    User inn0kenty
    Port 22226
    

    Після цього для підключення до вашої Raspberry Pi необхідно буде набрати тільки
    $ ssh 192.168.0.98 
    



Крок 7. Підключення до Raspberry Pi ззовні.
У цьому розділі я хочу розповісти як підключатися по ssh до Raspberry Pi не тільки з локальної мережі, але і ззовні.
Якщо у вас зовнішній статичний ip, то, ура, можна особливо не перейматися. Досить зробити переадресацію з зовнішнього ip на внутрішній.
Але якщо у вас, як і у мене, зовнішній ip динамічний, то на допомогу нам прийде dynamic dns.
Особисто я користуюся noip.com т. к. він безкоштовний, хоча і вимагає періодично заходити на сайт і підтверджувати, що ви ще користуєтеся адресою, що вони вам дали.
Отже, реєструйтеся там і переходите у Add a Host.
  1. hostname введіть адресу, яку хочете використовувати для підключення ззовні і натисніть на кнопку Add Host нічого більше не змінюючи
  2. Тепер необхідно щоб noip знав коли у вас змінюється ip. Тут є два шляхи. Перший, якщо ваш роутер підтримує функцію динамічної системи доменних імен (DDNS), то достатньо в налаштуваннях роутера ввести дані облікового запису та доменне ім'я. Після чого роутер буде повідомляти noip про зміни ip адреси. Другий, необхідно поставити програму на ваш основний комп'ютер. У noip це Dynamic DNS Update Client. Взяти її можна звідси
  3. Наступний крок: необхідно зробити переадресацію з зовнішнього ip на ваш локальний.
    Для цього в моєму роутері необхідно перейти в Переадресація -> Віртуальні сервери і додати туди таку запис:
    Порт сервісу: 22226
    Внутрішній порт: 22226
    IP-адреса: 192.168.0.98
    Протокол:
  4. Тепер необхідно додати в конфігураційний файл ssh на вашій основній ОС дані для входу ззовні.
    Відкриваємо файл config
    $ vim .ssh/config
    
    І додаємо туди
    Host доменное_ім'я
    Hostname доменное_ім'я
    User inn0kenty
    Port 22226
    
    Зберігаємо.
  5. Все. Тепер ви можете підключатися до Raspberry Pi не тільки з дому


Крок 8. Підключення HDD
  1. Для початку необхідно на вашій Raspberry Pi створити папку, у яку буде монтуватися ваш HDD
    $ mkdir hdd
    
  2. Тепер підключимо жорсткий диск до Raspberry Pi і введемо команду
    $ sudo blkid
    
    У висновку повинно бути щось типу такого:
    /dev/mmcblk0p1: SEC_TYPE="msdos" LABEL="boot" UUID="936C-7154" TYPE="vfat" 
    /dev/mmcblk0p2: UUID="c1398422-7a7c-4863-8a8f-45a1db26b4f2" TYPE="ext4" 
    /dev/sda1: LABEL="Seagate Expansion Drive" UUID="7CD8E7DCD8E792A6" TYPE="ntfs"
    
    Остання строчка як раз те, що нам потрібно. Запам'ятовуємо UUID.
  3. Тепер необхідно встановити підтримку файлової системи
    $ sudo apt-get install ntfs-3g
    
  4. Відкриваємо файл fstab
    $ sudo vim /etc/fstab
    
  5. Додаємо туди ось таку строчку:
    UUID=".*" ** ntfs-3g rw,force,exec,users 0 0
    де * - це ваш UUID (у мене 7CD8E7DCD8E792A6)
    а ** - це шлях до папки монтування (у мене /home/inn0kenty/hdd)
    
  6. Сохраняемся і перезавантажуємо Raspberry Pi
  7. Після перезавантаження в папці hdd повинні з'явитися всі файли і папки з жорсткого диска


Крок 9. SSHFS
  1. Встановлюємо на вашу основну ОС sshfs
    $ sudo apt-get install sshfs
    
  2. Створюємо в домашній директорії папку, в яку буде монтуватися Raspberry Pi.
    $ mkdir pi
    
  3. Монтуємо Raspberry Pi в цю папку:
    $ sshfs 192.168.0.98:/home/inn0kenty/hdd pi
    
    Все. Всі наші файли з жорсткого диска виявилися в папці pi на вашій основній машині
  4. Для того щоб розмонтувати Raspberry Pi потрібно ввести команду
    $ sudo umount pi
    
    або
    $ fusermount-u pi
    
  5. Для того щоб зробити теж саме ззовні досить трохи змінити команду.
    $ sshfs доменное_ім'я:/home/inn0kenty/hdd pi
    
  6. Ці команди можна прописати в fstab на вашій основній машині, щоб монтування виконувалося кожен раз, коли ви вмикаєте комп'ютер, але для мене це не підходящий варіант т. к. основний комп'ютер у мене ноутбук та інтернет при включенні є не завжди. Тому я пропоную скористатися невеликим скриптом, який легко примонтрует вашу Raspberry Pi з допомогою однієї короткою командою.
    #!/bin/bash
    ABSOLUTE_FILENAME=`readlink-e "$0"` #ім'я файлу
    #ім'я директорії, в якій знаходиться файл
    DIRECTORY=`dirname "$ABSOLUTE_FILENAME"` 
    if [ "x$1" = "x-nh" ] || [ "x$1" = "x-nothome" ] ; then
    sshfs-o nonempty доменное_ім'я:/home/inn0kenty/hdd $DIRECTORY 
    # -o nonempty говорить sshfs про те, що директорія в яку
    # монтують не порожня 
    else
    sshfs-o nonempty 192.168.0.98:/home/inn0kenty/hdd $DIRECTORY
    fi
    
    1. Збережемо цей скрипт в файл mount.sh і зробимо його виконуваним
      $ chmod +x mount.sh
      
    2. І помістимо його в папку pi
      $ mv mount.sh pi/
      
    3. Після чого додамо аліас, щоб запускати скрипт однією командою. Відкрийте bashrc (якщо його немає, створіть).
      $ vim .bashrc
      
      І додайте туди рядок
      alias pimount='/home/inn0kenty/pi/mount.sh'
      
      Зрозуміло підставивши ваші дані.
      Збережіть і перезавантажте bash.
      Тепер можна монтувати вашу Raspberry Pi однією командою
      $ pimount
      
      Причому якщо вказати ключ-nh або-nothome, то ваша Raspberry Pi примонтируется через доменне ім'я тобто можна використовувати вашу Raspberry Pi по повній навіть не перебуваючи в одній локальній мережі з нею.
      $ pimount-nh
      
      або
      $ pimount-nothome
      


Крок 10. Deluge
Останній крок — установка торрент-качалки. Я віддаю перевагу Deluge.
  1. Вводимо по черзі команди:
    $ sudo apt-get install deluged
    $ sudo apt-get install python-mako
    $ sudo apt-get install deluge-web
    
  2. Після чого виконуємо
    $ sudo vim /etc/default/deluge-daemon
    
    і вводимо туди наступне:
    # Configuration for /etc/init.d/deluge-daemon
    
    # The init.d script will only run if this variable non-empty.
    DELUGED_USER="ваше_имя_пользователя" # !!!CHANGE THIS!!!!
    
    # Should we run at startup?
    RUN_AT_STARTUP="ТАК"
    
    Потім зберігаємо і закриваємо
  3. І виконуємо:
    $ sudo vim /etc/init.d/deluge-daemon
    
    і вводимо туди наступне:
    Великий скрипт
    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: deluge-daemon
    # Required-Start: $local_fs $remote_fs
    # Required-Stop: $local_fs $remote_fs
    # Should-Start: $network
    # Should-Stop: $network
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short Description: Daemonized version of deluge and webui.
    # Description: Starts the deluge daemon with the specified in user
    # /etc/default/deluge-daemon.
    ### END INIT INFO
    
    # Author: Adolfo R. Brandes 
    # Updated by: Jean-Philippe "Orax" Roemer
    
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    DESC="Deluge Daemon"
    NAME1="deluged"
    NAME2="deluge"
    DAEMON1=/usr/bin/deluged
    DAEMON1_ARGS="-d" # Consult `man deluged` for more options
    DAEMON2=/usr/bin/deluge-web
    DAEMON2_ARGS="" # Consult `man deluge-web` for more options
    PIDFILE1=/var/run/$NAME1.pid
    PIDFILE2=/var/run/$NAME2.pid
    UMASK=022 # Change this to 0 if running deluged as its own user
    PKGNAME=deluge-daemon
    SCRIPTNAME=/etc/init.d/$PKGNAME
    
    # Exit if the package is not installed
    [ -x "$DAEMON1" -a-x "$DAEMON2" ] || exit 0
    
    # Read configuration variable file if it is present
    [ -r /etc/default/$PKGNAME ] && . /etc/default/$PKGNAME
    
    # Load the VERBOSE setting and other rcS variables
    [ -f /etc/default/rcS ] && . /etc/default/rcS
    
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
    
    if [ -z "$RUN_AT_STARTUP" -o "$RUN_AT_STARTUP" != "ТАК" ]
    then
    log_warning_msg "Not starting $PKGNAME, edit /etc/default/$PKGNAME to start it."
    exit 0
    fi
    
    if [ -z "$DELUGED_USER" ]
    then
    log_warning_msg "Not starting $PKGNAME, DELUGED_USER not set in /etc/default/$PKGNAME."
    exit 0
    fi
    
    #
    # Function to verify if a pid is alive
    #
    is_alive()
    {
    pid=`cat $1` > /dev/null 2 > &1
    kill -0 $pid > /dev/null 2 > &1
    return $?
    }
    
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
    # Return
    # 0 if daemon has been started
    # 1 if daemon was already running
    # 2 if daemon could not be started
    
    is_alive $PIDFILE1
    RETVAL1="$?"
    
    if [ $RETVAL1 != 0 ]; then
    rm-f $PIDFILE1
    start-stop-daemon --start --background --quiet --pidfile $PIDFILE1 --make-pidfile \
    --exec $DAEMON1 --chuid $DELUGED_USER --user $DELUGED_USER --umask $UMASK -- $DAEMON1_ARGS
    RETVAL1="$?"
    else
    is_alive $PIDFILE2
    RETVAL2="$?"
    [ "$RETVAL2" = "0" -a "$RETVAL1" = "0" ] && return 1
    fi
    
    is_alive $PIDFILE2
    RETVAL2="$?"
    
    if [ $RETVAL2 != 0 ]; then
    sleep 2
    rm-f $PIDFILE2
    start-stop-daemon --start --background --quiet --pidfile $PIDFILE2 --make-pidfile \
    --exec $DAEMON2 --chuid $DELUGED_USER --user $DELUGED_USER --umask $UMASK -- $DAEMON2_ARGS
    RETVAL2="$?"
    fi
    [ "$RETVAL1" = "0" -a "$RETVAL2" = "0" ] || return 2
    }
    
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
    # Return
    # 0 if daemon has been stopped
    # 1 if daemon was already stopped
    # 2 if daemon could not be stopped
    # other if a failure occurred
    
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --user $DELUGED_USER --pidfile $PIDFILE2
    RETVAL2="$?"
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --user $DELUGED_USER --pidfile $PIDFILE1
    RETVAL1="$?"
    [ "$RETVAL1" = "2" -o "$RETVAL2" = "2" ] && return 2
    
    rm-f $PIDFILE1 $PIDFILE2
    
    [ "$RETVAL1" = "0" -a "$RETVAL2" = "0" ] && return 0 || return 1
    }
    
    case "$1" in
    start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME1"
    do_start
    case "$?" in
    0/1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
    stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME1"
    do_stop
    case "$?" in
    0/1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
    restart|force-reload)
    log_daemon_msg "Restarting $DESC" "$NAME1"
    do_stop
    case "$?" in
    0/1)
    do_start
    case "$?" in
    0) log_end_msg 0 ;;
    1) log_end_msg 1 ;; # Old process is still running
    *) log_end_msg 1 ;; # Failed to start
    esac
    ;;
    *)
    # Failed to stop
    log_end_msg 1
    ;;
    esac
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
    exit 3
    ;;
    esac
    
    :
    

  4. Даємо права на виконання цього скрипта:
    $ sudo chmod 755 /etc/init.d/deluge-daemon
    
  5. Додаємо його в автозавантаження:
    $ sudo update-rc.d deluge-daemon defaults
    
  6. І запускаємо:
    $ sudo invoke-rc.d deluge-daemon start
    
  7. Після чого перезавантажуємося.
    Тепер якщо зайти на 192.168.0.98:8112, то можна потрапити в web ui торрент-качалки.
  8. Відкриємо доступ ззовні для нашого web ui. Для цього повернемося в наш роутер в Переадрессация -> Віртуальні сервери і додамо ще один запис:
    Порт сервісу: 80
    Внутрішній порт: 8112
    IP-адреса: 192.168.0.98
    Протокол:

    Після збереження можна буде потрапити на web ui просто вбивши ваше доменне ім'я в адресний рядок браузера.


Висновок
Я сподіваюся, що моя стаття хоч комусь виявиться корисною. Дякуємо за приділену увагу і витрачений час.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.