Я пытаюсь заставить Ubuntu 20.04 загружаться без диска на Raspberry PI, чтобы иметь возможность запустить Ubuntu на кластере.
На данный момент я переместил образы из загрузочного раздела на установленном RPi4b с установленной Ubuntu на сервер dnsmasq/TFTP под , /srv/tftpboot/<serial>/
который является сервером по умолчанию для Raspberry Pi, я обновил загрузчик и PI загрузился.
Журнал dnsmasq показывает файлы, загружаемые при загрузке:
/var/log/dnsmasq.log
==> /var/log/dnsmasq.log <==
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 available DHCP subnet: 192.168.254.254/255.255.255.0
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 vendor class: PXEClient:Arch:00000:UNDI:002001
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 PXE(eth0) dc:a6:32:b4:48:4f proxy
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 tags: eth0
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 broadcast response
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 1 option: 53 message-type 2
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 4 option: 54 server-identifier 192.168.254.254
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 9 option: 60 vendor-class 50:58:45:43:6c:69:65:6e:74
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 17 option: 97 client-machine-id 00:52:50:69:34:14:31:d0:00:32:b4:48:4f:f6...
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 sent size: 32 option: 43 vendor-encap 06:01:03:0a:04:00:50:58:45:09:14:00:00:11...
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 available DHCP subnet: 192.168.254.254/255.255.255.0
Sep 6 14:25:03 dnsmasq-dhcp[4799]: 1527100745 vendor class: PXEClient:Arch:00000:UNDI:002001
Sep 6 14:25:03 dnsmasq-tftp[4799]: error 0 Early terminate received from 192.168.254.253
Sep 6 14:25:03 dnsmasq-tftp[4799]: failed sending /srv/tftpboot/6b0bb1f6/start4.elf to 192.168.254.253
Sep 6 14:25:03 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep 6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/pieeprom.sig not found
Sep 6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recover4.elf not found
Sep 6 14:25:03 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep 6 14:25:04 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/start4.elf to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/fixup4.dat to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/dt-blob.bin to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/recovery.elf not found
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep 6 14:25:05 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/bootcfg.txt not found
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/bcm2711-rpi-4-b.dtb to 192.168.254.253
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/overlays/overlay_map.dtb to 192.168.254.253
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/config.txt to 192.168.254.253
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/syscfg.txt to 192.168.254.253
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/usercfg.txt to 192.168.254.253
Sep 6 14:25:06 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/cmdline.txt to 192.168.254.253
Sep 6 14:25:08 dnsmasq-tftp[4799]: file /srv/tftpboot/6b0bb1f6/armstub8-gic.bin not found
Sep 6 14:25:08 dnsmasq-tftp[4799]: error 0 Early terminate received from 192.168.254.253
Sep 6 14:25:08 dnsmasq-tftp[4799]: failed sending /srv/tftpboot/6b0bb1f6/uboot_rpi_4.bin to 192.168.254.253
Sep 6 14:25:08 dnsmasq-tftp[4799]: sent /srv/tftpboot/6b0bb1f6/uboot_rpi_4.bin to 192.168.254.253
Обычно вы используете сервер NFS и обновляете файл cmdline.txt, чтобы он содержал расположение корневой файловой системы, чтобы после загрузки initrd вы могли использовать корневую файловую систему, хранящуюся в сети.
Я не смог найти достаточно информации о параметрах, необходимых для Ubuntu, поэтому взял ее непосредственно из документации ядра по адресу:https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
Поэтому я обновил свой cmdline.txt на TFTP-сервере следующим образом:
cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 nfsrootdebug elevator=deadline rootwait fixrtc init=initrd.img ip=dhcp rootfstype=nfs4 root=/dev/nfs nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 rw
Я добрался только до консоли U-Boot. Образ vmlinuz не загружался, поэтому я распаковал свой vmlinuz-5.4.0-1016-raspi в vmlinux на моем установленном pi, запущенном с sdcard:
zcat /boot/vmlinuz-5.4.0-1016-raspi > vmlinux
и поместил это на TFTP-сервер, а затем обновил свой config.txt в разделе [all], чтобы использовать распакованный образ.
config.txt
[all]
arm_64bit=1
device_tree_address=0x03000000
enable_uart=1
cmdline=cmdline.txt
include syscfg.txt
include usercfg.txt
kernel=vmlinux
initramfs initrd.img followkernel
Мне удалось дойти до загрузки initrd, а скрипты монтирования NFS не монтируют общий ресурс NFS...
nfsmount: need a path
Begin: Retrying nfs mount ...
Извлечение initrd:
mkdir /root/initrd-expanded
cd /root/initrd-expanded
lz4 -cd /boot/initrd.img-5.4.0-1016-raspi | cpio -id
и заглянем внутрь скрипта nfs:
# NFS root mounting
nfs_mount_root()
{
nfs_top
# For DHCP
modprobe af_packet
wait_for_udev 10
# Default delay is around 180s
delay=${ROOTDELAY:-180}
# loop until nfsmount succeeds
nfs_mount_root_impl
ret=$?
nfs_retry_count=0
while [ ${nfs_retry_count} -lt "${delay}" ] \
&& [ $ret -ne 0 ] ; do
[ "$quiet" != "y" ] && log_begin_msg "Retrying nfs mount"
sleep 1
nfs_mount_root_impl
ret=$?
nfs_retry_count=$(( nfs_retry_count + 1 ))
[ "$quiet" != "y" ] && log_end_msg
done
}
На сервер NFS ничего не попадало, tcpdump port nfs
а также добавлялось ведение журнала отладки:
/etc/default/nfs-kernel-server
RPCMOUNTDOPTS="--manage-gids --debug all"
Похоже, что путь, передаваемый в nfsroot, неверен... вот тут-то все и начинает немного сбивать с толку.
Обработка nfsroot= при установке базового образа
nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 -> works
nfsroot=192.168.254.254:/srv/nfs/6b0bb1f6 -> fails
Если вы выполняете установку с установленной SDCard после выполнения apt-обновления:
nfsroot=192.168.254.254/srv/nfs/6b0bb1f6 -> fails
nfsroot=192.168.254.254:/srv/nfs/6b0bb1f6 -> works
Это заняло у меня 5 часов вырывания волос.
Вы не можете (или, по крайней мере, я не смог) создать загрузочную систему с установленной NFS из образов, предоставляемых Ubuntu для Raspberry PI. Вот так! Если вы попытаетесь это сделать, вы получите всевозможные ошибки о том, что службы не запускаются.
Итак, я отвечу на свой собственный вопрос.
решение1
Создание полностью бездисковой системы на Ubuntu 20.04.1 на Raspberry PI 4b
1)Установите RaspberryPi Lite на SD-карту
2)Загрузите Rpi4 с помощью SD-карты Raspberry OS, войдите в систему и выполните следующую команду, чтобы включить ssh:
cd /boot
touch ssh
reboot
3)Обновите загрузчик с другой машины. Если вы знаете IP-адрес PI и включили ssh (выше), этот скрипт установит код загрузки на 0xf12, что означает, что он будет пробовать сеть, sdcard, перезагрузку в этом порядке снова и снова. Вы можете захотеть убедиться в версии прошивки, если этот пост устареет. Он также даст вам env-файл, содержащий серийный номер и mac-адрес, что удобно, сохраненный в <uuid>.rpi.env
файле
./update-bootloader.sh <ip-address-of-the-pi> <ip-address-of-your-nfs-server>
например
./update-bootloader.sh 192.168.0.254 192.169.0.254
#!/usr/bin/env bash
# update-bootloader.sh - update the boot loader for Rpi4
RPI_IP=$1
KICKSTART_IP=$2
RPI_DEFAULT_PASS="raspberry"
PI_EEPROM_DATE="2020-07-31"
PI_EEPROM_VERSION="pieeprom-${PI_EEPROM_DATE}"
PI_EEPROM_FILE="${PI_EEPROM_VERSION}.bin"
PI_EEPROM_LINK="https://github.com/raspberrypi/rpi-eeprom/raw/master/firmware/stable/${PI_EEPROM_FILE}"
UBUNTU_IMAGE_NAME="ubuntu-20.04.1-preinstalled-server-arm64+raspi.img"
UBUNTU_IMAGE_FILE="${UBUNTU_IMAGE_NAME}.xz"
UUID=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)
ssh-keygen -R ${RPI_IP}
ssh-keyscan -H ${RPI_IP} >> ~/.ssh/known_hosts
sshpass -p "${RPI_DEFAULT_PASS}" ssh pi@${RPI_IP} << EOF
if [[ -f ${PI_EEPROM_FILE} ]];then
rm ${PI_EEPROM_FILE}
echo 'removed eeprom file'
fi
rm *.rpi.env
echo 'removed old env'
rm bootconf.txt
echo 'removed bootconf.txt'
if [[ ! -f ${PI_EEPROM_FILE} ]];then
wget ${PI_EEPROM_LINK}
fi
echo "extracting boot config from eeprom"
sudo rpi-eeprom-config ${PI_EEPROM_FILE} > bootconf.txt
echo "updating bootconfig"
sed -i 's/BOOT_ORDER=.*/BOOT_ORDER=0xf12/g' bootconf.txt
echo "MAX_RESTARTS=5" | sudo tee -a bootconf.txt
echo "writing eeprom"
sudo rpi-eeprom-config --out ${PI_EEPROM_VERSION}-netboot.bin --config bootconf.txt ${PI_EEPROM_FILE}
echo "updating eeprom on rpi"
sudo rpi-eeprom-update -d -f ./${PI_EEPROM_VERSION}-netboot.bin
echo "getting serial and mac"
cat /proc/cpuinfo | grep Serial | awk -F ': ' '{print \$2}' | tail -c 9 | awk '{print "RPI_SERIAL="\$1}' > ${UUID}.rpi.env
ip addr show eth0 | grep ether | awk '{print \$2}' | awk '{print "RPI_MAC="\$1}' >> ${UUID}.rpi.env
EOF
# copy the pi env back to get the serial and mac
sshpass -p "${RPI_DEFAULT_PASS}" scp -r pi@${RPI_IP}:~/${UUID}.rpi.env ~/${UUID}.rpi.env
sshpass -p "${RPI_DEFAULT_PASS}" ssh pi@${RPI_IP} << EOF
sudo reboot
EOF
cat ~/${UUID}.rpi.env
Теперь ваш Pi перезагрузится и будет отправлять запросы на вашу сеть для получения ответа DHCP.
4)Установите Ubuntu 20.04.1 на SD-карту с помощью PI Imager
5)Подключите SD-карту к вашему Pi и загрузите его.
6)Сделайте
apt update -y; apt upgrade -y
настройте свой пароль, установите несколько пакетов, поместите туда vim (очевидно, кто вообще пользуется emacs или nano??)
7)выключить пи
halt -p
На вашем сервере
8)Возьмите SD-карту с установленной Ubuntu 20.04.1, подключите ее к серверу, смонтируйте диск, скопируйте файлы ОС из раздела 2 в папку nfs для совместного использования корня с PI, вероятно, /srv/nfs/<serial>/
# find the partition where your CD card is (mine was sda on a rpi)
fdisk -l
# mount the sdcard - copy the second partition off (should contain the boot files, you can ignore the boot partition, we can use the files off the root partition)
mkdir /root/p2
mount /dev/sda2 /root/p2
# cp using using -ax will give you a correct copy, man cp if needed
cp -vax /root/p2/. /srv/nfs/<serial>/.
# clean up
umount /root/p2
rm -rf /root/p2
9)Смонтируйте загрузочную папку файлов RPI (хранящихся в общем ресурсе NFS) в местоположение TFTP, чтобы ваш TFTP мог обслуживать загрузочные файлы; я использую PI для обслуживания других PI, поэтому при необходимости отредактируйте.
#/etc/fstab
LABEL=writable / ext4 defaults 0 0
LABEL=system-boot /boot/firmware vfat defaults 0 1
/srv/nfs/<serial>/boot /srv/tftpboot/<serial> none defaults,bind 0 0
Затем смонтируйте новое местоположение.
mount -a
10)Извлеките vmlinuz из загрузочной папки вашего общего ресурса nfs в vmlinux, так как pi не распакует ядро vmlinuz
zcat /srv/nfs/<serial>/boot/vmlinuz-5.4.0-1016-raspi > /src/nfs/<serial>/boot/vmlinux-5.4.0-1016-raspi
11)Создайте символические ссылки внутри раздела /srv/nfs/<serial>/boot, чтобы они указывали на файлы bcm2711-rpi-4-b.dtb, start4.elf, fixup4.dat, отсутствующие в папке boot, чтобы TFTP мог найти их в папках dtb и firmware.
Необязательно — очистите весь ненужный мусор — посмотрите на мой ls -al
вывод, чтобы увидеть, что там должно быть, а что я удалил.
lrwxrwxrwx 1 root root 41 Sep 7 08:19 bcm2711-rpi-4-b.dtb -> dtbs/5.4.0-1016-raspi/bcm2711-rpi-4-b.dtb
-rw-r--r-- 1 root root 216 Sep 7 08:23 cmdline.txt
-rw-r--r-- 1 root root 220286 Aug 13 15:09 config-5.4.0-1016-raspi
-rw-r--r-- 1 root root 231 Sep 7 08:45 config.txt
lrwxrwxrwx 1 root root 43 Sep 6 20:34 dtb -> dtbs/5.4.0-1016-raspi/./bcm2711-rpi-4-b.dtb
lrwxrwxrwx 1 root root 43 Sep 6 20:34 dtb-5.4.0-1016-raspi -> dtbs/5.4.0-1016-raspi/./bcm2711-rpi-4-b.dtb
drwxr-xr-x 3 root root 4096 Sep 7 07:27 dtbs
drwxr-xr-x 2 root root 4096 Sep 7 07:56 firmware
lrwxrwxrwx 1 root root 19 Sep 7 08:15 fixup4.dat -> firmware/fixup4.dat
lrwxrwxrwx 1 root root 27 Sep 6 20:32 initrd.img -> initrd.img-5.4.0-1016-raspi
-rw-r--r-- 1 root root 29579888 Sep 6 20:34 initrd.img-5.4.0-1016-raspi
lrwxrwxrwx 1 root root 19 Sep 7 07:26 start4.elf -> firmware/start4.elf
-rw-r--r-- 1 root root 327 Sep 7 08:04 syscfg.txt
-rw-r--r-- 1 root root 4162247 Aug 13 15:09 System.map-5.4.0-1016-raspi
-rw-r--r-- 1 root root 200 Sep 7 08:04 usercfg.txt
-rw-r--r-- 1 root root 25907712 Sep 7 08:13 vmlinux-5.4.0-1016-raspi
lrwxrwxrwx 1 root root 24 Sep 6 20:32 vmlinuz -> vmlinuz-5.4.0-1016-raspi
-rw-r--r-- 1 root root 8420251 Aug 13 15:09 vmlinuz-5.4.0-1016-raspi
12)обновить некоторые конфигурации в /srv/nfs/<serial>/boot
разделе
#/srv/nfs/<serial>/boot/config.txt
[pi4]
max_framebuffers=2
[all]
arm_64bit=1
device_tree_address=0x03000000
enable_uart=1
cmdline=cmdline.txt
include syscfg.txt
include usercfg.txt
kernel=vmlinux-5.4.0-1016-raspi
initramfs initrd.img-5.4.0-1016-raspi followkernel
#/srv/nfs/<serial>/boot/cmdline.txt
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 nfsrootdebug elevator=deadline rootwait fixrtc init=initrd.img ip=dhcp rootfstype=nfs4 root=/dev/nfs nfsroot=<nfs ip>:/srv/nfs/<serial> rw
13)Обновите fstab — это fstab, который отправляется на pi
#/srv/nfs/<serial>/etc/fstab
proc /proc proc defaults 0 0
<nfs ip>:/srv/nfs/<serial> / nfs4 defaults,rw,nolock 0 0 # data to be shared to server
<nfs ip>:/srv/nfs/<serial>/boot/firmware /boot/firmware nfs4 defaults,rw,nolock 0 1 # data to be shared to server
none /tmp tmpfs defaults 0 0
none /var/run tmpfs defaults 0 0
none /var/lock tmpfs defaults 0 0
none /var/tmp tmpfs defaults 0 0
14)Установите NFS-сервер (погуглите это) для обслуживания Pi
#/etc/exports
/srv/nfs/<serial> *(insecure,rw,async,no_root_squash)
exportfs -ra
15)Установите сервер DNSmasq (Google — ваш друг) для обслуживания параметров DHCP и загрузки образов TFTP.
#/etc/dnsmasq.conf
dhcp-range=<your network subnet>,proxy # e.g. 192.168.254.254,proxy
log-dhcp
enable-tftp
tftp-root=/srv/tftpboot
pxe-service=0,"Raspberry Pi Boot"
log-facility=/var/log/dnsmasq.log
16)Кластеры? У вас больше одного Pi? Вы можете использовать монтирование overlayfs на своем сервере, чтобы предоставить нескольким Pi их операционную систему, используя единую базовую корневую файловую систему, а затем использовать оверлеи, чтобы предоставить каждому Pi его собственное пространство для хранения и модификаций FS.
Если вы дошли до этого места, то это должно быть легко:
На вашем собственном сервере - не на ПИ
17)Создайте монтирования для монтирований на основе оверлейной файловой системы, чтобы мы могли использовать корневую файловую систему в качестве нижнего каталога (google overlayfs)
#/etc/fstab
overlay /srv/nfs/6b0bb1f6 overlay defaults,lowerdir=/srv/nfs/ubuntu-rpi4-lower,upperdir=/srv/nfs/6b0bb1f6-upper,workdir=/srv/nfs/6b0bb1f6-work,nfs_export=on,index=on 0 0
overlay /srv/nfs/68e71308 overlay defaults,lowerdir=/srv/nfs/ubuntu-rpi4-lower,upperdir=/srv/nfs/68e71308-upper,workdir=/srv/nfs/68e71308-work,nfs_export=on,index=on 0 0
18)Создайте систему FS для поддержки оверлеев, моя выглядит так для 3 пи.
# this is inside /srv/nfs
drwxr-xr-x 1 root root 4096 Sep 7 12:47 68e71308
drwxr-xr-x 3 root root 4096 Sep 7 12:47 68e71308-upper
drwxr-xr-x 3 root root 4096 Sep 7 13:25 68e71308-work
drwxr-xr-x 1 root root 4096 Sep 7 12:13 6b0bb1f6
drwxr-xr-x 2 root root 4096 Sep 7 12:13 6b0bb1f6-upper
drwxr-xr-x 4 root root 4096 Sep 7 13:25 6b0bb1f6-work
drwxr-xr-x 1 root root 4096 Sep 7 12:47 917c9833
drwxr-xr-x 2 root root 4096 Sep 7 11:49 917c9833-upper
drwxr-xr-x 2 root root 4096 Sep 7 11:34 917c9833-work
drwxr-xr-x 21 root root 4096 Sep 6 19:58 ubuntu-rpi4-lower
19)Вам нужно поместить /etc/fstab
внутрь объединенной папки для монтирования (не в верхний или рабочий каталог, а просто в серийный каталог), который переопределит предоставленные ubuntu-rpi4-lower. Погуглите fusefs или overlayfs для получения дополнительной информации (так работают контейнеры docker, разве вы не знаете :)
20)Создайте файл cmdline.txt внутри каждой объединенной папки внутри /srv/nfs/<serial>/boot/cmdline.txt
21)Экспортируем объединенные папки через nfs, чтобы наши pi могли использовать их, как и прежде:
#/etc/exports
/srv/nfs/6b0bb1f6 *(rw,sync,no_subtree_check,no_root_squash,fsid=1)
/srv/nfs/917c9833 *(rw,sync,no_subtree_check,no_root_squash,fsid=2)
/srv/nfs/68e71308 *(rw,sync,no_subtree_check,no_root_squash,fsid=3)
exportfs -ra
22)Добавление нового числа Пи — это всего лишь случай:
22.0)Обновите загрузчик
22.1Создание трех пустых папок на сервере
mkdir /srv/nfs/<serial>
mkdir /srv/nfs/<serial>-work
mkdir /srv/nfs/<serial>-upper
22.2)Добавление fstab с параметрами монтирования для нового последовательного и верхнего/рабочего каталогов
22.3)Добавление cmdline.txt с правильным расположением NFS
23)Автоматизация Uber Если хотите, можете создать скрипт-хук внутри initrd вашей SD-карты RaspberryPi, который обновит загрузчик для вас и отправит пинг на веб-сервер с его серийным номером, который затем добавит монтирования к тому времени, как Pi перезагрузится, он уже загружается из сети. Я предоставлю это в какой-то момент.
решение2
Спасибо за руководство. Я бы добавил несколько вещей. Новые версии, firmwares
похоже, нормально справляются с распаковкой ядра. (проверено на 5.8 и выше). vmlinuz
Однако у меня возникли проблемы с правами доступа к файлу.
Кроме того, это портит snap. Я думаю, что многие люди против этого, но если вам это нужно. Вы можете добавить
network inet,
network inet6,
в/etc/apparmor.d/usr.lib.snapd.snap-confine.real