Skip to content

Instantly share code, notes, and snippets.

@s3rgeym
Last active April 5, 2024 10:30
Show Gist options
  • Save s3rgeym/45aba25b4111f8b2c30b883722ec3964 to your computer and use it in GitHub Desktop.
Save s3rgeym/45aba25b4111f8b2c30b883722ec3964 to your computer and use it in GitHub Desktop.
Домашний файловый сервер на Ubuntu

Домашний файловый сервер на Ubuntu

Установка и настройка Ubuntu

Качаем образ Ubuntu Server и записываем его на флешку:

$ sudo dd if=/home/sergey/Downloads/ubuntu-21.04-live-server-amd64.iso of=/dev/sda conv=fdatasync status=progress

Далее потребуются ненужный системный блок, монитор, мышка и клавиатура.

Ставим Ubuntu, в качестве имени хоста указываем, например, ubuntu-server, не забываем отметить Install OpenSSH Server, так как для управления сервером мы будем использовать ssh. После успешной установки перегружаемся.

Ставим на сервере Avahi Daemon, который делает машину доступной в локальной сети по имени хоста как <имя-хоста>.local.

$ sudo apt install avahi-daemon

Проверяем запущен ли сервис:

$ systemctl status avahi-daemon.service

В Ubuntu особой настройки Avahi не требуется.

Делаем файлопомойку. У меня, например, есть несколько HDD, которые я объеденил в RAID-0 массив. Данные в RAID-0 записываются поочередно на два и более устройств, что увеличивает скорости чтения и записи. Недостатком является утеря данных при выходе одного из дисков, но для файлопоймойки это не принципиально.

# по-очередно размечаем диски
$ sudo cfdisk /dev/sdb
$ sudo cfdisk /dev/sdc

# на каждом диске я создал по одному разделу, затем объеденил их в RAID-0
$ sudo mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb1 /dev/sdc1

# создал файловую систему на raid-устройстве
$ sudo mkfs.xfs /dev/md0

# чтобы RAID-массив монтировался при запуске
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=ubuntu:0 UUID=57ff66e8:a0268e82:3d39b7c2:c6c37bf9

# создаем точку монтирования для raid-массива
$ sudo mkdir /mnt/data

# редактируем /etc/fstab, добавляя строчку в конец
$ sudo nano /etc/fstab
/dev/md0        /mnt/data           xfs    defaults          0       0

# монтируемся
$ sudo mount -a

# создаем каталог, который будем шарить
$ sudo mkdir /mnt/data/share

# меняем пользователя и права

# клиенты samba владельцем файла обычно выставляют nobody:nogroup
$ sudo chown nobody:nogroup /mnt/data/share

# все файлы созданные в данном каталоге будут наследовать его группу, т.о. анонимный пользователь Samba сможет с ними работать
# 
# Пример:
#   $ sudo mkdir foo
#   $ ls -l
#   total 4
#   drwxrwxrwx 6 nobody nogroup 4096 Jun 21 19:52 dist
#   drwxr-sr-x 2 root   nogroup    6 Jun 21 19:57 foo

$ sudo chmod 2777 /mnt/data/share

Для общего доступа к файлам юудет использоваться NFS. Альтернативой NFS является Samba, которая сложна в настройке и без тонкой конфигурации показывает довольно низкую скорость передачи данных 7-11 MiB/s.

$ sudo apt install nfs-kernel-server
$ sudo systemctl enable nfs-server

В /etc/exports добавляем строку:

/mnt/data/share 192.168.0.0/24(rw,sync,no_subtree_check)

# где: 65534 ‒ это id пользователя nobody, а 65534 ‒ группа nogroup 
/mnt/data/share 192.168.0.0/24(rw,all_squash,sync,no_subtree_check,anonuid=65534,anongid=65534,insecure)

И чтобы применить изменения вызываем:

$ sudo exportfs -a
$ sudo apt-get install transmission-cli transmission-common transmission-daemon
...
$ sudo usermod -a -G debian-transmission $USER
$ sudo mkdir -p 2755 /mnt/data/share/Downloads
$ sudo chown -R debian-transmission:debian-transmission /mnt/data/share/Downloads
$ sudo vim /etc/transmission-daemon/settings.json
    "download-dir": "/mnt/data/share/Downloads",
    ...
    "rpc-password": "your-password",
    ...
    "speed-limit-up": 100,
    "speed-limit-up-enabled": true,

$ sudo systemctl reload transmission-daemon

Lines below this comment will be discarded

Подключение к серверу

Linux

Настройка Avahi

Avahi нужен для того чтобы заработало подключение к хосту по имени (этот шаг можно пропустить и в дальнейшем подключаться по IP).

$ yay -S avahi nss-mdns

Так же нужно отредактировать /etc/nsswitch.conf, строчку hosts, добавив mdns_minimal [NOTFOUND=return] до resolve:

hosts: ... mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns ...

Запускаем Avahi демона:

$ sudo systemctl enable --now avahi-daemon

Проверяем:

$ ping -c 3 ubuntu-server.local
PING ubuntu-server.local(ubuntu-server.local (fe80::264b:feff:fe89:ed8f%wlan0)) 56 data bytes
64 bytes from ubuntu-server.local (fe80::264b:feff:fe89:ed8f%wlan0): icmp_seq=1 ttl=64 time=91.8 ms
64 bytes from ubuntu-server.local (fe80::264b:feff:fe89:ed8f%wlan0): icmp_seq=2 ttl=64 time=4.73 ms
64 bytes from ubuntu-server.local (fe80::264b:feff:fe89:ed8f%wlan0): icmp_seq=3 ttl=64 time=1.60 ms

--- ubuntu-server.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 1.601/32.701/91.771/41.787 ms

Подлючение по SSH

Генерируем пару RSA-ключей для подключения по SSH (если требуется):

$ ssh-keygen

Чтобы не вводить постоянно пароль, добавляем пуьличный ключ на сервер:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

Подкоючаемся к серверу:

NFS

$ yay -S nfs-utils
$ sudo mount ubuntu-server.local:/srv/nfs /mnt/nfs

Windows

Способы подключения по SSH

Устанавливаем Chocolatey.

Запускаем PowerShell от имени администратора и ставим Putty:

> choco install -y putty

image

Если у вас установлен WSL, то одключение к серверу ничем не будет отличаться от способа для Linux.

image

Доступ к расшаренным данным

image image

Баг моей версии Windows: если при подключении сетевого диска указать имя хоста, то в проводнике он будет отображаться как Disconnected Network Drive.

image

Управление торрентами

image

Полезные команды

# информация об ip адресе
$ ip a

# выключение сервера
$ sudo poweroff

# перезагрузка, например после обновления
$ sudo reboot

# обновление системы
$ sudo apt update && sudo apt upgrade
@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

Запускаем PowerShell и генерируем секретный и публичный ключи:

PS C:\Users\Sergey> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Sergey/.ssh/id_rsa):
Created directory 'C:\Users\Sergey/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\Sergey/.ssh/id_rsa.
Your public key has been saved in C:\Users\Sergey/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:2xfZ8MRHTuuPm+Wk169rsoED9pl0a62eUJ2yp/nX4VY sergey@DESKTOP-C9U01OP
The key's randomart image is:
+---[RSA 3072]----+
|                o|
|             . +.|
|            . o.o|
|             B.o |
|        S . * =. |
|       . * * * oE|
|        . O * = O|
|           =.B.X=|
|           .B=O=+|
+----[SHA256]-----+

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

Сначла необходимо настройть WSL чтобы можно было менять права файлам в папке пользователя Windows:

$ sudoedit /etc/wsl.conf
[automount]
enabled = true
options = "metadata"

Чтобы изменения заработали нужно перезапустить дистрибутив:

> wsl --shutdown
c/Users/Sergey
❯ ln -s /mnt/c/Users/Sergey/.ssh ~/.ssh

c/Users/Sergey
❯ chmod 600 ~/.ssh/id_rsa*

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

c/Users/Sergey
❯ ssh-copy-id -i /mnt/c/Users/Sergey/.ssh/id_rsa.pub [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/mnt/c/Users/Sergey/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

c/Users/Sergey took 55s
❯ ssh [email protected]
Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-18-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sun Jun 20 10:08:20 PM UTC 2021

  System load:    0.0       Memory usage: 1%   Processes:       256
  Usage of /home: unknown   Swap usage:   0%   Users logged in: 0

  => There were exceptions while processing one or more plugins. See
     /var/log/landscape/sysinfo.log for more information.

 * Super-optimized for small spaces - read how we shrank the memory
   footprint of MicroK8s to make it the smallest full K8s around.

   https://ubuntu.com/blog/microk8s-memory-optimisation

34 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable


Last login: Sun Jun 20 21:38:52 2021 from 192.168.0.106
sergey@ubuntu:~$
c/Users/Sergey took 5s
❯ sudo apt install sshfs
[sudo] password for sergey:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  sshfs
0 upgraded, 1 newly installed, 0 to remove and 212 not upgraded.
Need to get 43.5 kB of archives.
After this operation, 123 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 sshfs amd64 3.6.0+repack+really2.10-0ubuntu1 [43.5 kB]
Fetched 43.5 kB in 0s (244 kB/s)
Selecting previously unselected package sshfs.
(Reading database ... 40517 files and directories currently installed.)
Preparing to unpack .../sshfs_3.6.0+repack+really2.10-0ubuntu1_amd64.deb ...
Unpacking sshfs (3.6.0+repack+really2.10-0ubuntu1) ...
Setting up sshfs (3.6.0+repack+really2.10-0ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...

c/Users/Sergey took 8s
❯ sudo mkdir /mnt/storage

c/Users/Sergey
❯ sudoedit /etc/fstab

c/Users/Sergey took 38s
❯ cat /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults        0 0
sshfs#[email protected]:/mnt/storage /mnt/storage fuse defaults,allow_other,IdentityFile=/home/sergey/.ssh/id_rsa 0 0

SSHFS автоматически не монтируется! Баг WSL?

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

❯ ls /mnt/storage
'$RECYCLE.BIN'   Bitcoin     Downloads    Games   Programs                     Videos
 Backups         Documents  'GOG Games'   Music  'System Volume Information'   msdownld.tmp

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 20, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

RAID-0 из двух дисков с XFS:

sergey@ubuntu:~/Storage$ dd if=/dev/zero of=test bs=64k count=128k conv=fdatasync
131072+0 records in
131072+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 36.1772 s, 237 MB/s

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

Samba

$ sudo apt install samba
$ sudo vi /etc/samba/smb.conf

Добавить в конец:

[share]
    comment = Ubuntu File Server Share
    path = /srv/samba/share
    browsable = yes
    guest ok = yes
    read only = no
    create mask = 0755
$ sudo mkdir -p /srv/samba/share
$ sudo chown nobody:nogroup /srv/samba/share/
$ sudo systemctl restart smbd.service nmbd.service

В Windows нужно открыть в проводнике открыть \\192.168.0.103\share

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

sergey@ubuntu:~$ sudo vi /etc/samba/smb.conf
sergey@ubuntu:~$ sudo mkdir /media/storage
mkdir: cannot create directory ‘/media/storage’: File exists
sergey@ubuntu:~$ sudo chown nobody:nogroup /media/storage
sergey@ubuntu:~$ cat /etc/samba/smb.conf
[global]
  workgroup = WORKGROUP
  security = user
  map to guest = bad user

#
# Пользователей нужно создавать вручную:
#
#   $ smbpasswd -a alex
#

# [private]
#   path = /path/to/private
#   browseable = yes
#   writebale = yes
#   guest ok = no
#   valid users = alex john
#

[share]
  path = /media/storage
  browseable = yes
  writeable = yes
  read only = no
  guest ok = yes

@s3rgeym
Copy link
Author

s3rgeym commented Jun 21, 2021

Недостатки WSL:

не читает /etc/fstab
не умеет работать с дисками напрямую

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 21, 2021

image

@s3rgeym
Copy link
Author

s3rgeym commented Jun 21, 2021

устанавливаем samba

$ sudo apt install samba

хорошим тоном считается хранение данных в /srv

добавляем ссылку на каталог в /srv/samba

$ sudo mkdir /srv/samba
$ sudo ln -s /mnt/data/share /srv/samba


Теперь отредактируем конфиг:

```bash
$ sudo nano /etc/samba/smb.conf

Все данные в этом файле можно стереть.

Минимальная секция global должна выглядеть так:

[global]
  workgroup = WORKGROUP
  security = user
  map to guest = Bad User
  socket options=SO_RCVBUF=131072 SO_SNDBUF=131072 TCP_NODELAY
  min receivefile size = 16384 
  use sendfile = true
  aio read size = 16384
  aio write size = 16384
  aio write behind = true
  dns proxy = no

Если нужен доступ к расшаренному каталогк без пароля, то добавляем секцию share (можно указать любое имя):

[share]
  path = /srv/samba/share
  browseable = yes
  writeable = yes
  read only = no
  guest ok = yes
  create mode = 0777
  directory mode = 0777

Для доступа по паролю, указываем пользователей:

[share]
  ...
  guest ok = no
  valid users = sergey

Для Samba нужно завести отдельного пользователя и задать ему пароль (не нужно пытаться ввести пароль пользователя Linux):

$ smbpasswd -a sergey

Чтобы применить настройки перезапускаем smbd.service:

$ sudo systemctl restart smbd

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

Запускаем PowerShell от имени администратора:

> Enable-WindowsOptionalFeature -FeatureName ServicesForNFS-ClientOnly, ClientForNFS-Infrastructure -Online -NoRestart

Control Panel > Turn Windows features on or off > Services for NFS

image

image

image

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

Запуск ps файлов двойным кликом:

New-PSDrive HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

Я применял эти настройки:

# по-умолчанию 600 (минут)
net config server /autodisconnect:65535

# сброс настроек сетевого диска каждый раз
net use /persistent:no

net use /persistent:yes

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

Баг моей версии Windows: если при подключении сетевого диска указать имя хоста, то в проводнике он будет отображаться как Disconnected Network Drive.

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

image

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

sergey@ubuntu-server:~$ sudo mkdir -m 2777 /mnt/data/share
sergey@ubuntu-server:~$ sudo chown nobody:nogroup /mnt/data/share
sergey@ubuntu-server:~$ cd /mnt/data/share
sergey@ubuntu-server:/mnt/data/share$ mkdir foo
sergey@ubuntu-server:/mnt/data/share$ ls -l
total 4
drwxrwsr-x 2 sergey nogroup 4096 Jun 22 10:51 foo

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

$ sudo apt-get install transmission-cli transmission-common transmission-daemon
...
sergey@ubuntu-server:~$ cd /etc/transmission-daemon
sergey@ubuntu-server:/etc/transmission-daemon$ ls
README.json  settings.json
sergey@ubuntu-server:/etc/transmission-daemon$ sudoedit settings.json
    "download-dir": "/mnt/data/share/Downloads",
    ...
    "rpc-password": "your-password",
    ...
    "speed-limit-up": 100,
    "speed-limit-up-enabled": true,
sergey@ubuntu-server:/etc/transmission-daemon$ sudo systemctl reload transmission-daemon
sergey@ubuntu-server:/etc/transmission-daemon$

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

image

@wtfc0d3
Copy link

wtfc0d3 commented Jun 22, 2021

sergey@ubuntu-server:/mnt/data$ sudo dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.42873 s, 313 MB/s
sergey@ubuntu-server:/mnt/data$ cd /
sergey@ubuntu-server:/$ sudo dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.75528 s, 390 MB/s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment