Yandex Cloud utils
September 3, 2022

Установка NFS сервера

NFS - это обычная файловая помойка. Работает в среде Linux. Бывает полезна для обмена информацией между ВМ в небольших сетях. Создадим такой сервер в тестовых целях.

Поехали!

SA у нас уже готов: https://teletype.in/@cameda/w93lPMPQWS4
Выберем зону доступности А: https://teletype.in/@cameda/S34zdiTcbUM
Сеть и подсети создали ранее: https://teletype.in/@cameda/ZbTkF70KWK9
SG будем использовать со стандартными открытыми портами: https://teletype.in/@cameda/WIoqKmpMNLM

export SG=$(yc vpc sg get cam-default --format=json | jq -r '.id')
export FOLDER_ID=$(yc config get folder-id)
export ZONE=ru-central1-a
export SUBNET_ID=$(yc vpc subnet get subnet-a --format json | jq -r '.id')
export SA=$(yc iam service-account get cam-instance-sa --format json | jq -r '.id')

Создадим скрипт для cloud-init:

#cloud-config
  version: v1
  package_update: true
  package_upgrade: true
  write_files:
   - encoding: b64
     content: VGVzc3R0dC4uLg==
     owner: root:root
     path: /opt/test
     permissions: '0644'
  packages:
  - git
  - htop
  - mc
  - tree
  - make
  - iftop
  - iotop
  - dstat
  - gcc
  - gdb
  datasource:
   Ec2:
    strict_id: false
  users:
  - default
  - name: cameda
    gecos: Alexey Volkov
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    lock_passwd: false
    passwd: $6$rounds=4096$WhW2cxlj/QX90$Jic1yPwlpiWV98oX8akplpOX4e7pgJlWHCfKAyPiMf7xP1AqI7iocN/gjWQNX9WuIUf14LVgxJluajfOInk.u.
    ssh_authorized_keys:
      - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDI98mJDBN9cnp6HOdBYTQILeAhUSDvDfoqA9iLmVPDyPLFRWs7tE4BjCAcFD6a3M50QIboCaohfa7h+PWksYibab7I3QHOR7y9pCW8FGonGRw2ACvt906qlaWHFj7jWOxuihFoiRROKqLCW5YE/Yc4XFIvW1gu3JQdvQ1wemWvujsI8EHE6PI1pEg7/41y6kn3IhNHIr8WRLe4dPyPGjwc4LpBCcaRSJiX4YjVXynSIHNk365UrL+nGv8ix7bW5FNCgGqSgfUTVCfMYLzQ/gYHPVQrcIvCeHjkwluH8Z3gXeN3OliejBjpLi+IWIzd9K6UADSUNU8oL+9941tDidp8APoe7RbB4h3bY6k8Bhy0yxohgQS2OWSYd1mjeEx8Ba5wzJKqfpUgmcPdrBJnBwLgLMFQyEfYG6vTPkYWAKEvkkJ6ZiA4tdoQvCb+B0xJV/ivHyLtoi3LFE59mbQFDUy8O51vX9JjBDLwzyTEeslWp7uOP66Ti5Q5ucNXbs5yXTU= cameda@cameda-osx"

Резервируем IP:

yc vpc address create \
   --folder-id $FOLDER_ID \
   --name nfs-ip \
   --description "NFS IP" \
   --external-ipv4 zone=$ZONE \
   --labels test=nfs \
   --async

Создадим ВМ с Ubuntu 20.04:

export IP=$(yc vpc address get nfs-ip --format=json | jq -r ".external_ipv4_address" | jq -r ".address")
yc compute instance create \
--folder-id $FOLDER_ID \
--name cam-nfs \
--description "NFS" \
--hostname cam-nfs \
--zone $ZONE \
--labels test=nfs \
--platform standard-v3 \
--create-boot-disk image-family=ubuntu-2004-lts,size=60,type=network-ssd,block-size=8K \
--image-folder-id standard-images \
--memory 4 \
--cores 2 \
--core-fraction 100 \
--network-settings type=standard \
--network-interface subnet-id=$SUBNET_ID,nat-ip-version=ipv4,address=10.128.0.3,nat-address=$IP,security-group-ids=$SG \
--metadata serial-port-enable=1 \
--metadata-from-file='user-data=cloud-init.yaml' \
--service-account-id $SA \
--async
login: cameda
password: Pa$w0rd

Обновим нашу дефолтную SG, добавив во входящие порт 2049.

yc vpc sg update --name cam-default \
"--rule" "description=access all egress port,direction=egress,from-port=1,to-port=65535,protocol=any,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 22 port,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 53 port,direction=ingress,port=53,protocol=any,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 80 port,direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 443 port,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access 8080 port,direction=ingress,port=8080,protocol=any,v4-cidrs=[0.0.0.0/0]" \
"--rule" "description=access nfs port,direction=ingress,port=2049,protocol=any,v4-cidrs=[0.0.0.0/0]" \
--description "Default access" --folder-id $FOLDER_ID --async

Подключимся к ВМ:

ssh cameda@$IP
sudo -i
ping ya.ru - проверим что корректно работает DNS.
apt -y update && apt -y upgrade
hostnamectl - проверим, что версия ОС и имя ВМ корректны.

Установка nfs-server:

apt -y install nfs-kernel-server

Создаем каталог и настраиваем права:

mkdir /mnt/nfs
chmod -R 777 /mnt/nfs
vi /etc/exports - добавляем сюда информацию о предоставляемой шаре
/mnt/nfs 10.128.0.0/24(rw,sync,no_root_squash,no_all_squash,no_subtree_check)
systemctl enable nfs-kernel-server --now

Проверяем:

rpcinfo -p | grep nfs - Проверяем для каких версий NFS способен принимать подключения наш NFS-сервер
exportfs -r - перечитываем конфигурацию
exportfs - убеждаемся, что ресурс опубликован
cat /proc/filesystems | grep nfs - проверяем поддержку на уровне ядра
modprobe nfs - если не работает в ядре то включаем поддержку
systemctl status nfs-server


ОПЦИИ МОНТИРОВАНИЯ:
rw - разрешить чтение и запись в этой папке;
ro - разрешить только чтение;
sync - отвечать на следующие запросы только тогда, когда данные будут сохранены на диск (по умолчанию);
async - не блокировать подключения пока данные записываются на диск;
secure - использовать для соединения только порты ниже 1024;
insecure - использовать любые порты;
nohide - не скрывать поддиректории при, открытии доступа к нескольким директориям;
root_squash - подменять запросы от root на анонимные, используется по умолчанию;
no_root_squash - не подменять запросы от root на анонимные;
all_squash - превращать все запросы в анонимные;
subtree_check - проверять не пытается ли пользователь выйти за пределы экспортированной папки;
no_subtree_check - отключить проверку обращения к экспортированной папке, улучшает производительность, но снижает безопасность, можно использовать когда экспортируется раздел диска;
anonuid и anongid - указывает uid и gid для анонимного пользователя.

Установка nfs-client:

apt -y install nfs-common
systemctl enable rpcbind --now
mkdir /mnt/nfs

Постоянное монтирование. Добавляем в vi /etc/fstab:

10.128.0.3:/nfs/ /mnt/nfs/ nfs defaults 0 0
mount -a
df -hT | grep nfs4

Монтируем до перезагрузки:

mount -t nfs 10.128.0.3:/mnt/nfs/ /mnt/nfs/