Кодерская мастерская
Установка Ubuntu через интернет В этом гайде рассмотрен процесс установки ОС Ubuntu через интернет, подразумевается, что для повторения ниже описанного вы должны что-то понимать в линуксе и устройстве интернета. Для чего это нужно? Во-первых, в серверной…
Часть первая: самый простой и тривиальный кейс установки.
Имеется некая headless машина, на которую нужно установить серверную убунту, машина подключена к маршрутизатору патчкордом, ей выдаётся статический адрес.
Статика не обязательна, но лучше, когда она есть, в таком случае мы знаем и ip, и порт, а следовательно можем сразу тыкаться туда, когда запустим это дело, и понимать, живая ли система.
В случае же, когда dhcp отдаёт динамический адрес, сначала нужно будет искать новую аренду в роутере, что немного усложнит задачу.
Для начала качаем релиз убунты, я тестил 20, 22 и 24, с 18 в теории должно сработать, но мне за эти гайды никто не платит, и вообще у неё основная поддержка закончилась, поэтому нафиг надо.
Удобно можно скачать с releases.ubuntu.com, там нужно выбрать релиз, а затем лайв-сервер, например
Файл раскатываем на флешку, после чего нужно добавить конфиг.
В корне флешки создайте директорию
В директории
Рядом с ним ещё один файл:
Не удаляйте комментарий
Уже не вспомню, почему именно такой набор параметров, ибо вопросом этим задавался ещё пару лет назад, читал много разных статей на разных ресурсах, но будто бы с таким конфигом всё работает.
Общий смысл такой, этим конфигом включается ssh и задаётся пароль от него.
Конфиг положили, теперь нужно отредактировать файл boot/grub/grub.cfg
В нём нужно найти строчку с ядром и его параметрами, она задаётся командой linux.
Выглядит примерно так:
Для того, чтобы nocloud понял, откуда ему читать конфиг, нужно указать его параметром ядра.
Есть и другие способы, но этот для нашей задачи самый простой.
Параметр такой: ds=nocloud\;s=/cdrom/nocloud/
Бэкслэш перед точкой с запятой нужен для её экранирования, т.к. grub воспринимает её по-своему.
Таким образом строка принимает вид:
Почему там иногда 2 пробела, и зачем 3 дефиса в конце я фиг его знает, но на всякий случай ничего не трогал.
В файле grub.cfg от 20 ubuntu есть параметр quite, и почему-то, когда он есть, cloudinit некорректно инициализируется (ssh поднимается, но пароль не подходит), если будете ставить и столкнётесь с этим, просто удалите quite из cmdline.
А также я отчётливо помню, что пару лет назад система не ставилась, ругаясь на несовпадение контрольных сумм.
Воспроизвести мне это не удалось, но если у вас возникнет такая ошибка, то пересчитайте md5 для grub.cfg, и обновите её в файле md5sum.txt.
А на этом неожиданно всё, можно сохранять файл, загружать машину с флешки (у вас должен быть какой-то способ это сделать), и запускать систему.
После запуска в течение нескольких минут должен подняться ssh сервер, зайдя на который под юзером installer можно будет выполнить установку в псевдографическом интерфейсе subiquity.
Пример:
Про работу в этом интерфейсе со скринридером я расскажу в конце поста, но заранее предупреждаю, что он достаточно блевотный, и по-хорошему по нему надо аудиогайд писать.
Имеется некая headless машина, на которую нужно установить серверную убунту, машина подключена к маршрутизатору патчкордом, ей выдаётся статический адрес.
Статика не обязательна, но лучше, когда она есть, в таком случае мы знаем и ip, и порт, а следовательно можем сразу тыкаться туда, когда запустим это дело, и понимать, живая ли система.
В случае же, когда dhcp отдаёт динамический адрес, сначала нужно будет искать новую аренду в роутере, что немного усложнит задачу.
Для начала качаем релиз убунты, я тестил 20, 22 и 24, с 18 в теории должно сработать, но мне за эти гайды никто не платит, и вообще у неё основная поддержка закончилась, поэтому нафиг надо.
Удобно можно скачать с releases.ubuntu.com, там нужно выбрать релиз, а затем лайв-сервер, например
ubuntu-24.04.2-live-server-amd64.iso.Файл раскатываем на флешку, после чего нужно добавить конфиг.
В корне флешки создайте директорию
nocloud.В директории
nocloud создайте пустой файл meta-dataРядом с ним ещё один файл:
user-data, в него нужно прописать конфиг:#cloud-config
password: rkbfc3465
ssh_pwauth: true
chpasswd:
expire: False
Не удаляйте комментарий
#cloud-config! Без него не взлетит!Уже не вспомню, почему именно такой набор параметров, ибо вопросом этим задавался ещё пару лет назад, читал много разных статей на разных ресурсах, но будто бы с таким конфигом всё работает.
Общий смысл такой, этим конфигом включается ssh и задаётся пароль от него.
Конфиг положили, теперь нужно отредактировать файл boot/grub/grub.cfg
В нём нужно найти строчку с ядром и его параметрами, она задаётся командой linux.
Выглядит примерно так:
linux /casper/vmlinuz ---Для того, чтобы nocloud понял, откуда ему читать конфиг, нужно указать его параметром ядра.
Есть и другие способы, но этот для нашей задачи самый простой.
Параметр такой: ds=nocloud\;s=/cdrom/nocloud/
Бэкслэш перед точкой с запятой нужен для её экранирования, т.к. grub воспринимает её по-своему.
Таким образом строка принимает вид:
linux /casper/vmlinuz ds=nocloud\;s=/cdrom/nocloud/ ---Почему там иногда 2 пробела, и зачем 3 дефиса в конце я фиг его знает, но на всякий случай ничего не трогал.
В файле grub.cfg от 20 ubuntu есть параметр quite, и почему-то, когда он есть, cloudinit некорректно инициализируется (ssh поднимается, но пароль не подходит), если будете ставить и столкнётесь с этим, просто удалите quite из cmdline.
А также я отчётливо помню, что пару лет назад система не ставилась, ругаясь на несовпадение контрольных сумм.
Воспроизвести мне это не удалось, но если у вас возникнет такая ошибка, то пересчитайте md5 для grub.cfg, и обновите её в файле md5sum.txt.
А на этом неожиданно всё, можно сохранять файл, загружать машину с флешки (у вас должен быть какой-то способ это сделать), и запускать систему.
После запуска в течение нескольких минут должен подняться ssh сервер, зайдя на который под юзером installer можно будет выполнить установку в псевдографическом интерфейсе subiquity.
Пример:
ssh installer@192.168.0.123Про работу в этом интерфейсе со скринридером я расскажу в конце поста, но заранее предупреждаю, что он достаточно блевотный, и по-хорошему по нему надо аудиогайд писать.
Кодерская мастерская
Часть первая: самый простой и тривиальный кейс установки. Имеется некая headless машина, на которую нужно установить серверную убунту, машина подключена к маршрутизатору патчкордом, ей выдаётся статический адрес. Статика не обязательна, но лучше, когда она…
Часть вторая: установка на сервер.
Бывают редкие ситуации, когда нет доступа к серверной панели, или после переустановки пароль хостер высылает на почту, к которой нет доступа.
Также сервер может быть не арендованным, а стоять в каком-то офисе, физический доступ к нему в моменте может отсутствовать, а систему нужно переставить вот прям уже вчера.
В таком случае можно переустановить систему в обход панели управления, пользуясь тем, что установлено на борту сейчас.
Конечно если система уже мёртвая, сделать с этим ничего не получится, но если сервер функционирует, провернуть нижеописанное вполне возможно.
Чтобы загрузиться в установщик нужно, чтобы у вашей системы было собственное ядро, т.е. OpenVz пролетает.
Запустить установку на сервере в чём-то даже проще, чем на собственной headless машине, ибо сеть там уже настроена, и скорее всего заработает из коробки.
Сложность только в том, что флешку в сервер не воткнуть, и нужно как-то модифицировать iso-файл.
Раскурив с пяток статей я понял, что задача перепаковки iso достаточно муторная и не самая тривиальная, так как человечество изобрело слишком много видов загрузчиков, и если что-то не учесть, можно получить нерабочий iso-файл.
Или же на вашей машине с UEFI он загрузится, а на другой, с легаси, не полетит.
Все тесты, кстати, я проводил именно с UEFI машинами, если будете повторять это на старом железе, возможно вылезут неучтённые мной нюансы, желаю вам хорошенько повеселиться с их решением.
И так пересобирать iso не очень хочется, но когда он станет загружаться, по-любому в какой-то момент будет загружено ядро, и в него совершенно точно можно передать какие-то параметры.
Cloudinit умеет считывать конфигурацию из параметров ядра, но будто бы это не относится к user-data.
Всё, что удалось найти в документации: "On the kernel command line, anything found between cc: and end_cc will be interpreted as cloud-config user-data."
В каком формате должна быть user-data, какие ограничения или особенности абсолютно непонятно, и нет ни единого примера.
Но в процессе гугления я нашёл исходник cloudinit парсера командной строки ядра, и в нём как раз разбирается конфиг между cc и end_cc.
Оказалось, что содержимое user-data нужно закодировать в percent-encoding, и поместить между токенами cc и end_cc.
Окей, мы можем передать user-data с настройками ssh, но как же это сделать?
Для загрузки iso-образа можно воспользоваться grub, в котором нужно создать новую menu entry.
И не забывайте о том, что вы ставитесь не с флешки, то есть образ нужно положить на тот раздел, который не будет затронут в процессе установки.
Если в сервере один диск, и он полностью отдан под систему, можно уменьшить файловую систему и под iso-файл сделать маленький раздел, после переустановки его можно будет удалить, и расширить системный раздел обратно.
Допустим вы скачали iso-файл установщика ubuntu и положили его на отдельный раздел, теперь нужно создать menuentry.
Для этого существует файл /etc/grub.d/40_custom, в который нужно добавить примерно следующее:
Вместо abc123 вам нужно задать идентификатор файловой системы в которой лежит iso, его можно получить с помощью dumpe2fs или blkid.
grub сам найдёт раздел, в котором лежит fs, и будет использовать её как root.
Также нужно поменять путь до iso-файла, затем сохранить файл и выполнить
Бывают редкие ситуации, когда нет доступа к серверной панели, или после переустановки пароль хостер высылает на почту, к которой нет доступа.
Также сервер может быть не арендованным, а стоять в каком-то офисе, физический доступ к нему в моменте может отсутствовать, а систему нужно переставить вот прям уже вчера.
В таком случае можно переустановить систему в обход панели управления, пользуясь тем, что установлено на борту сейчас.
Конечно если система уже мёртвая, сделать с этим ничего не получится, но если сервер функционирует, провернуть нижеописанное вполне возможно.
Чтобы загрузиться в установщик нужно, чтобы у вашей системы было собственное ядро, т.е. OpenVz пролетает.
Запустить установку на сервере в чём-то даже проще, чем на собственной headless машине, ибо сеть там уже настроена, и скорее всего заработает из коробки.
Сложность только в том, что флешку в сервер не воткнуть, и нужно как-то модифицировать iso-файл.
Раскурив с пяток статей я понял, что задача перепаковки iso достаточно муторная и не самая тривиальная, так как человечество изобрело слишком много видов загрузчиков, и если что-то не учесть, можно получить нерабочий iso-файл.
Или же на вашей машине с UEFI он загрузится, а на другой, с легаси, не полетит.
Все тесты, кстати, я проводил именно с UEFI машинами, если будете повторять это на старом железе, возможно вылезут неучтённые мной нюансы, желаю вам хорошенько повеселиться с их решением.
И так пересобирать iso не очень хочется, но когда он станет загружаться, по-любому в какой-то момент будет загружено ядро, и в него совершенно точно можно передать какие-то параметры.
Cloudinit умеет считывать конфигурацию из параметров ядра, но будто бы это не относится к user-data.
Всё, что удалось найти в документации: "On the kernel command line, anything found between cc: and end_cc will be interpreted as cloud-config user-data."
В каком формате должна быть user-data, какие ограничения или особенности абсолютно непонятно, и нет ни единого примера.
Но в процессе гугления я нашёл исходник cloudinit парсера командной строки ядра, и в нём как раз разбирается конфиг между cc и end_cc.
Оказалось, что содержимое user-data нужно закодировать в percent-encoding, и поместить между токенами cc и end_cc.
Окей, мы можем передать user-data с настройками ssh, но как же это сделать?
Для загрузки iso-образа можно воспользоваться grub, в котором нужно создать новую menu entry.
И не забывайте о том, что вы ставитесь не с флешки, то есть образ нужно положить на тот раздел, который не будет затронут в процессе установки.
Если в сервере один диск, и он полностью отдан под систему, можно уменьшить файловую систему и под iso-файл сделать маленький раздел, после переустановки его можно будет удалить, и расширить системный раздел обратно.
Допустим вы скачали iso-файл установщика ubuntu и положили его на отдельный раздел, теперь нужно создать menuentry.
Для этого существует файл /etc/grub.d/40_custom, в который нужно добавить примерно следующее:
menuentry 'ubuntuInstaller' {
insmod part_gpt
search --no-floppy --fs-uuid --set=root abc123
set isofile="/root/ubuntu-24.04.2-live-server-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz iso-scan/filename=${isofile} ds=nocloud cc: %23cloud-config%0Apassword%3A%20rkbfc3465%0Assh_pwauth%3A%20true%0Achpasswd%3A%0A%20%20expire%3A%20False%0A end_cc ---
initrd (loop)/casper/initrd
}
Вместо abc123 вам нужно задать идентификатор файловой системы в которой лежит iso, его можно получить с помощью dumpe2fs или blkid.
grub сам найдёт раздел, в котором лежит fs, и будет использовать её как root.
Также нужно поменять путь до iso-файла, затем сохранить файл и выполнить
update-grub.
Кодерская мастерская
Часть вторая: установка на сервер. Бывают редкие ситуации, когда нет доступа к серверной панели, или после переустановки пароль хостер высылает на почту, к которой нет доступа. Также сервер может быть не арендованным, а стоять в каком-то офисе, физический…
Теперь нужно перезагрузить сервер в установщик, и если там вдруг не UEFI, вероятно ничего не получится, и потребуется физический доступ.
Однако 2025 год на дворе, и UEFI достаточно давно и достаточно много где, как минимум на арендуемых серваках.
Поэтому выполняем grub-reboot ubuntuInstaller, и надеемся, что всё будет ок.
Команда произведёт некие магические модификации в UEFI env vars, но перезагрузку сама не выполнит, поэтому нужно ручками сделать reboot.
В мануале написано, что grub-reboot загружается в заданную entry только один раз, и при следующей загрузке снова загрузится дефолт, но в некоторых случаях выбранная entry может застрять, учитывайте это.
После ребута периодически тыкаемся ssh в 22 порт (он кстати должен быть открыть в фаерволе хостера), в какой-то момент должен подняться subiquity.
Часть третья: телефон как модем.
Допустим у вас есть телефон на android и headless машинка, к которой не подключено ничего кроме питания, и вы очень сильно хотите поставить на неё ubuntu.
Сделать нужно следующее:
1. Подготовить флешку по первой части.
2. Подключить телефон к машине usb-кабелем.
3. Начать загрузку с флешки, сразу же начать раздачу интернета с телефона.
4. Включить точку доступа на телефоне.
5. Подключиться к точке доступа телефона, через неё пролезть в ssh-сервер subiquity.
Вышеописанное сработает, если ваш телефон умеет одновременно подключаться к Wi-Fi и раздавать его же, иначе придётся использовать мобильные данные, так как при установке требуется интернет.
Имейте в виду, что все телефоны разные, и у вас маршрутизация может быть устроена иначе, я опишу мой вариант.
А расклад достаточно неприятный, при раздаче по проводу, я попадаю в подсеть 192.168.198.0/24, а при раздаче по Wi-Fi - 192.168.173.0/24.
Подсети меняются со временем, но суть в том, что они разные, и из одной в другую пролезть извне не получится.
Извне нельзя, но если в сам телефон залезть, то у нас будет доступ к обоим подсетям.
Включаем adb, переводим в tcp mode.
При подключении к телефону через его hotspot можно подключиться по adb сходив на шлюз и порт 5555, кстати шлюзом легко может быть адрес по типу 192.168.173.151, т.е. не ожидайте, что последним октетом будет единичка.
И так мы раздали Wi-Fi с телефона, подключились к нему и попали в shell телефона.
Теперь можно подключать телефон проводом, и у нас даже будет доступ в подсеть для usb-раздачи, но есть ещё один нюанс.
Я так и не нашёл свежесобранного ssh-клиента под android, а также я не уверен, что весь псевдографический мусор будет корректно передан через adb.
Поэтому проще пробросить порты на нашу машину, и работать полноценным клиентом через полноценный shell.
О пробросе портов через adb я вспомнил слишком поздно, сейчас уже нет возможности проверить, поэтому опишу способ без adb forward, а в будущем обновлю пост.
UPD из 2025-10-31, adb не умеет пробрасывать на произвольные адреса, так что оставляю всё как есть.
Единственный софт, который сработал - это тяжёленькая приложуха на go, весит около 20 мегабайт, умеет следующее:
Сейчас вам возможно покажется, что вы попали на aliexpress: The GoProxy is a high-performance http proxy, https proxy, socks5 proxy, ss proxy, websocket proxies, tcp proxies, udp proxies, game shield, game proxies. Support forward proxies, reverse proxy, transparent proxy, internet nat proxies, https proxy load balancing, http proxy load balancing , socks5 proxies load balancing, socket proxy load balancing, ss proxy load balancing, TCP / UDP port mapping, SSH transit, TLS encrypted transmission, protocol conversion, anti-pollution DNS proxy, API authentication, speed limit, limit connection.
Ну как, захотелось купить? Штука и правда имеет коммерческую версию, но нам она не понадобится.
Качаем билд под вашу архитектуру android со страницы релизов: https://github.com/snail007/goproxy/releases
Далее закидываем на телефон, причём просто на карточку класть смысла нет, оттуда запустить не получится.
Без рута доступна директория /data/local/tmp, в ней флаг executable не запрещён.
Поэтому пушим бинарник в /data/local/tmp,
Однако 2025 год на дворе, и UEFI достаточно давно и достаточно много где, как минимум на арендуемых серваках.
Поэтому выполняем grub-reboot ubuntuInstaller, и надеемся, что всё будет ок.
Команда произведёт некие магические модификации в UEFI env vars, но перезагрузку сама не выполнит, поэтому нужно ручками сделать reboot.
В мануале написано, что grub-reboot загружается в заданную entry только один раз, и при следующей загрузке снова загрузится дефолт, но в некоторых случаях выбранная entry может застрять, учитывайте это.
После ребута периодически тыкаемся ssh в 22 порт (он кстати должен быть открыть в фаерволе хостера), в какой-то момент должен подняться subiquity.
Часть третья: телефон как модем.
Допустим у вас есть телефон на android и headless машинка, к которой не подключено ничего кроме питания, и вы очень сильно хотите поставить на неё ubuntu.
Сделать нужно следующее:
1. Подготовить флешку по первой части.
2. Подключить телефон к машине usb-кабелем.
3. Начать загрузку с флешки, сразу же начать раздачу интернета с телефона.
4. Включить точку доступа на телефоне.
5. Подключиться к точке доступа телефона, через неё пролезть в ssh-сервер subiquity.
Вышеописанное сработает, если ваш телефон умеет одновременно подключаться к Wi-Fi и раздавать его же, иначе придётся использовать мобильные данные, так как при установке требуется интернет.
Имейте в виду, что все телефоны разные, и у вас маршрутизация может быть устроена иначе, я опишу мой вариант.
А расклад достаточно неприятный, при раздаче по проводу, я попадаю в подсеть 192.168.198.0/24, а при раздаче по Wi-Fi - 192.168.173.0/24.
Подсети меняются со временем, но суть в том, что они разные, и из одной в другую пролезть извне не получится.
Извне нельзя, но если в сам телефон залезть, то у нас будет доступ к обоим подсетям.
Включаем adb, переводим в tcp mode.
При подключении к телефону через его hotspot можно подключиться по adb сходив на шлюз и порт 5555, кстати шлюзом легко может быть адрес по типу 192.168.173.151, т.е. не ожидайте, что последним октетом будет единичка.
И так мы раздали Wi-Fi с телефона, подключились к нему и попали в shell телефона.
Теперь можно подключать телефон проводом, и у нас даже будет доступ в подсеть для usb-раздачи, но есть ещё один нюанс.
Я так и не нашёл свежесобранного ssh-клиента под android, а также я не уверен, что весь псевдографический мусор будет корректно передан через adb.
Поэтому проще пробросить порты на нашу машину, и работать полноценным клиентом через полноценный shell.
О пробросе портов через adb я вспомнил слишком поздно, сейчас уже нет возможности проверить, поэтому опишу способ без adb forward, а в будущем обновлю пост.
UPD из 2025-10-31, adb не умеет пробрасывать на произвольные адреса, так что оставляю всё как есть.
Единственный софт, который сработал - это тяжёленькая приложуха на go, весит около 20 мегабайт, умеет следующее:
Сейчас вам возможно покажется, что вы попали на aliexpress: The GoProxy is a high-performance http proxy, https proxy, socks5 proxy, ss proxy, websocket proxies, tcp proxies, udp proxies, game shield, game proxies. Support forward proxies, reverse proxy, transparent proxy, internet nat proxies, https proxy load balancing, http proxy load balancing , socks5 proxies load balancing, socket proxy load balancing, ss proxy load balancing, TCP / UDP port mapping, SSH transit, TLS encrypted transmission, protocol conversion, anti-pollution DNS proxy, API authentication, speed limit, limit connection.
Ну как, захотелось купить? Штука и правда имеет коммерческую версию, но нам она не понадобится.
Качаем билд под вашу архитектуру android со страницы релизов: https://github.com/snail007/goproxy/releases
Далее закидываем на телефон, причём просто на карточку класть смысла нет, оттуда запустить не получится.
Без рута доступна директория /data/local/tmp, в ней флаг executable не запрещён.
Поэтому пушим бинарник в /data/local/tmp,
chmod +x, и готовимся к установке.GitHub
Releases · snail007/goproxy
🔥 Proxy is a high performance HTTP(S) proxies, SOCKS5 proxies,WEBSOCKET, TCP, UDP proxy server implemented by golang. Now, it supports chain-style proxies,nat forwarding in different lan,TCP/UDP p...
Кодерская мастерская
Теперь нужно перезагрузить сервер в установщик, и если там вдруг не UEFI, вероятно ничего не получится, и потребуется физический доступ. Однако 2025 год на дворе, и UEFI достаточно давно и достаточно много где, как минимум на арендуемых серваках. Поэтому выполняем…
Если планируете ставить ubuntu ниже 24, или просто для перестраховки, можно добавить network-config для usb-устройства, иначе cloudinit проигнорирует сетевой интерфейс.
Почему-то из файла он загружать его не захотел, но загрузил из параметра ядра, выглядит это так:
network-config в данном случае - это конфиг в yaml формате, пожатый с помощью gzip и закодированный в base64, исходный конфиг такой:
Нейминг странный, конфиг расширял на основе примера из доки, не знаю, для чего добавлять zz в начало, будто бы имя секции может быть любым.
С таким конфигом раздача завелась на 20 и 22 ubuntu, другие не пробовал.
Подключаем телефон проводом к компьютеру, на котором будем ставить систему, загружаемся с флешки, сразу включаем раздачу по usb.
В процессе загрузки телефон может периодически решать, что устройство отключилось, и раздача может прекратиться, поэтому первые секунд 20 следите за ней, и включайте заново.
Если включить её потом, cloudinit может проигнорировать новый интерфейс, поэтому лучше включать как можно раньше.
Также подключаемся к hotspot-у телефона, заходим в shell через adb.
Теперь мониторим файл /proc/net/arp
Содержимое достаточно читаемое, представляет собой arp таблицу, в ней вы в какой-то момент должны увидеть новое устройство в подсети usb-tethering-а, это и есть наша ubuntu.
Далее запускаем proxy:
Подставьте в качестве целевого ip адрес вашей машины.
Прога поднимется, должны побежать логи.
Открываем второй терминал, в нём подключаемся по ssh, используя адрес вашего телефона и порт 1234, и да здравствует subiquity!
Теперь, главное, чтобы этот шайтан-мост не развалился в середине установки, и удачи, если решитесь повторить.
Немного о subiquity:
Буду краток, это достаточно мутная псевдографическая срань, в любой непонятной ситуации используйте горячку для просмотра текущей строки, в nvda это nvda+up, а также имейте в виду, что некоторые подменю разварачиваются как бы справа от главного меню, что добавляет немного веселья и безумия в скучный и унылый процесс установки.
Как подменю, например, открывается конфигурация разделов в конфигураторе дисков, и nvda одновременно видит куски из обоих интерфейсов, очень удобненько, всем рекомендую.
Почему-то из файла он загружать его не захотел, но загрузил из параметра ядра, выглядит это так:
ds=nocloud\;s=/cdrom/nocloud/ network-config=H4sIAIxzLGgC/5XLOwqAMBAE0F7IHaYOpBGr3CbGgRV0lWS18PSKWthazuftLHVcNKJ1DU1YlFaja4DjCGmaAvVOwCB57SKsbHyKOVmWdwQ0zYyg+q81+YVNvnqr/R993f0JKz7GMs4AAAA=
network-config в данном случае - это конфиг в yaml формате, пожатый с помощью gzip и закодированный в base64, исходный конфиг такой:
version: 2
ethernets:
zz-all-en:
dhcp4: true
match:
name: en*
zz-all-eth:
dhcp4: true
match:
name: eth*
zz-all-usb:
dhcp4: true
match:
name: usb*
Нейминг странный, конфиг расширял на основе примера из доки, не знаю, для чего добавлять zz в начало, будто бы имя секции может быть любым.
С таким конфигом раздача завелась на 20 и 22 ubuntu, другие не пробовал.
Подключаем телефон проводом к компьютеру, на котором будем ставить систему, загружаемся с флешки, сразу включаем раздачу по usb.
В процессе загрузки телефон может периодически решать, что устройство отключилось, и раздача может прекратиться, поэтому первые секунд 20 следите за ней, и включайте заново.
Если включить её потом, cloudinit может проигнорировать новый интерфейс, поэтому лучше включать как можно раньше.
Также подключаемся к hotspot-у телефона, заходим в shell через adb.
Теперь мониторим файл /proc/net/arp
Содержимое достаточно читаемое, представляет собой arp таблицу, в ней вы в какой-то момент должны увидеть новое устройство в подсети usb-tethering-а, это и есть наша ubuntu.
Далее запускаем proxy:
/data/local/tmp/proxy tcp -p ":1234" -T tcp -P "192.168.191.188:22"
Подставьте в качестве целевого ip адрес вашей машины.
Прога поднимется, должны побежать логи.
Открываем второй терминал, в нём подключаемся по ssh, используя адрес вашего телефона и порт 1234, и да здравствует subiquity!
Теперь, главное, чтобы этот шайтан-мост не развалился в середине установки, и удачи, если решитесь повторить.
Немного о subiquity:
Буду краток, это достаточно мутная псевдографическая срань, в любой непонятной ситуации используйте горячку для просмотра текущей строки, в nvda это nvda+up, а также имейте в виду, что некоторые подменю разварачиваются как бы справа от главного меню, что добавляет немного веселья и безумия в скучный и унылый процесс установки.
Как подменю, например, открывается конфигурация разделов в конфигураторе дисков, и nvda одновременно видит куски из обоих интерфейсов, очень удобненько, всем рекомендую.
Правый и левый каналы поменялись местами в моих беспроводных наушниках.
Я не менял никаких настроек в винде, просто в какой-то момент заметил, что они поменялись, ещё 3 часа назад всё было нормально, а 5 минут назад - уже нет.
Как же я это исправил?
Выключил и включил наушники, т.е. проблема случилась где-то между usb-свистком и самими наушниками, а винда тут, скорее всего, не виновата.
#ОноСломалось
Я не менял никаких настроек в винде, просто в какой-то момент заметил, что они поменялись, ещё 3 часа назад всё было нормально, а 5 минут назад - уже нет.
Как же я это исправил?
Выключил и включил наушники, т.е. проблема случилась где-то между usb-свистком и самими наушниками, а винда тут, скорее всего, не виновата.
#ОноСломалось
После обновления до 24h2 раз в несколько дней от проводника приходит следующее уведомление:
"При получении трассировки произошла ошибка."
Никаких проблем будто бы больше нет, но вот сегодня я решил от нефиг делать запустить стандартный механизм проверки и восстановления целостности системных файлов, он сказал, что чего-то там восстановил, и теперь у меня пропал поиск в меню пуск, а перезагружаться лень.
#ОноСломалось
"При получении трассировки произошла ошибка."
Никаких проблем будто бы больше нет, но вот сегодня я решил от нефиг делать запустить стандартный механизм проверки и восстановления целостности системных файлов, он сказал, что чего-то там восстановил, и теперь у меня пропал поиск в меню пуск, а перезагружаться лень.
#ОноСломалось
👍1
Кодерская мастерская
После обновления до 24h2 раз в несколько дней от проводника приходит следующее уведомление: "При получении трассировки произошла ошибка." Никаких проблем будто бы больше нет, но вот сегодня я решил от нефиг делать запустить стандартный механизм проверки и…
Я починил пуск, было достаточно перезапустить проводник!
А потом ещё раз перезапустить.
И ещё раз.
И после трёх перезапусков проводника поиск в пуске появился.
Точно цитату не помню, но смысл примерно такой: "Безумие - это многократное повторение одного и того же действия с одним и тем же результатом, в надежде получить что-то новое".
Но в случае с виндой выходит, что клин клином вышибать приходится.
А потом ещё раз перезапустить.
И ещё раз.
И после трёх перезапусков проводника поиск в пуске появился.
Точно цитату не помню, но смысл примерно такой: "Безумие - это многократное повторение одного и того же действия с одним и тем же результатом, в надежде получить что-то новое".
Но в случае с виндой выходит, что клин клином вышибать приходится.
👍1
Каждый раз, когда я ставлю незнакомый софт, я на сто раз проверяю, точно ли я устанавливаю не поддельную версию. Если это приложение в google play, смотрю на кол-во оценок и скачиваний (у фейка не будет высокого рейтинга и миллионов загрузок), если ставлю пакет из пакетного менеджера, несколько раз перепроверю написание, если ставлю что-то малоизвестное, до последнего буду пытаться найти официальный сайт продукта и т.п.
Например однажды минуты на 3 залип при установке яндекс музыки, когда увидел, что её выложил не яндекс, а какой-то Direct Cursus Computer Systems Trading LLC.
До этого момента думал, что моя паранойя чрезмерна, и я просто трачу время на фигню, но сейчас посмотрел видео, в котором как раз повествуется о том, как люди подобным образом подцепили поддельные бинарники сомнительного происхождения в свой арч-линукс.
Более мне добавить нечего, рекомендую и вам следить за тем, что и откуда вы ставите.
Видос на англ:
https://www.youtube.com/watch?v=rUzzBY-P3HE
Например однажды минуты на 3 залип при установке яндекс музыки, когда увидел, что её выложил не яндекс, а какой-то Direct Cursus Computer Systems Trading LLC.
До этого момента думал, что моя паранойя чрезмерна, и я просто трачу время на фигню, но сейчас посмотрел видео, в котором как раз повествуется о том, как люди подобным образом подцепили поддельные бинарники сомнительного происхождения в свой арч-линукс.
Более мне добавить нечего, рекомендую и вам следить за тем, что и откуда вы ставите.
Видос на англ:
https://www.youtube.com/watch?v=rUzzBY-P3HE
YouTube
Arch Linux Is Under Attack...
Arch linux is great, but the AUR is sort of scary. In this video we talk about malicious packages found in the AUR last week.
https://www.reddit.com/r/linux/comments/1m3wodv/malware_found_in_the_aur/
Go secure yourself online with Multi Factor Authentication…
https://www.reddit.com/r/linux/comments/1m3wodv/malware_found_in_the_aur/
Go secure yourself online with Multi Factor Authentication…
👍2❤1
Юристы имеются среди подписчиков?
Заказал товар в dns с предоплатой, постомат сломался, сотрудник вскрыл ячейку вручную и выдал коробку, в системе заказ продолжает отображаться как ожидающий получения.
Если отменить, фокус сработает и деньги вернуться, то нарушу ли я закон таким образом?
Вопрос гипотетический, ибо цена эксперимента - косарь рублей, но интересно всё же.
Заказал товар в dns с предоплатой, постомат сломался, сотрудник вскрыл ячейку вручную и выдал коробку, в системе заказ продолжает отображаться как ожидающий получения.
Если отменить, фокус сработает и деньги вернуться, то нарушу ли я закон таким образом?
Вопрос гипотетический, ибо цена эксперимента - косарь рублей, но интересно всё же.
Зашёл на gitverse, и вижу в шапке следующее:
"В 22:00 МСК будет объявлен перерыв - 15 минут. Вы отдыхаете - мы обновляем!"
И вот с одной стороны о какой конкуренции можно говорить, если у них бывают даунтаймы в принципе, а с другой стороны - github, перед тем как прилечь на часок, когда вас предупреждал об этом, а?..
"В 22:00 МСК будет объявлен перерыв - 15 минут. Вы отдыхаете - мы обновляем!"
И вот с одной стороны о какой конкуренции можно говорить, если у них бывают даунтаймы в принципе, а с другой стороны - github, перед тем как прилечь на часок, когда вас предупреждал об этом, а?..
👍1
Как открыть чат в последней версии telegram для Android
Если вам сильно надо открыть чат с человеком в тг, и чата у вас с ним нет, для этого ранее использовалась кнопка в профиле.
В последней версии телеграмма доступность поломали, и кнопку скринридеры не видят.
Обходное решение следующее: в профиле открыть дополнительные действия (3 точки), там добавить ярлык чата на главный экран, выйти на главный экран и открыть чат пользуясь созданным ярлыком.
Когда что-то напишете, чат, как обычно, окажется в списке чатов, и ярлык можно будет удалить.
#A11yTricks
Если вам сильно надо открыть чат с человеком в тг, и чата у вас с ним нет, для этого ранее использовалась кнопка в профиле.
В последней версии телеграмма доступность поломали, и кнопку скринридеры не видят.
Обходное решение следующее: в профиле открыть дополнительные действия (3 точки), там добавить ярлык чата на главный экран, выйти на главный экран и открыть чат пользуясь созданным ярлыком.
Когда что-то напишете, чат, как обычно, окажется в списке чатов, и ярлык можно будет удалить.
#A11yTricks
👍1
Forwarded from Gozaltech blog (Beqa Gozalishvili)
What's new?
Close
5.69.1
September 31, 2025
We’ve launched a new Сoncerts section. Here you’ll find live shows' announcements from artists you might like. Dates, venues, and tickets — all in one place. Come in and choose where to go next
Closer to the stage,
Yandex Music team
Это я получил в качестве changelog-а после обновления Яndex музыки.
Close
5.69.1
September 31, 2025
We’ve launched a new Сoncerts section. Here you’ll find live shows' announcements from artists you might like. Dates, venues, and tickets — all in one place. Come in and choose where to go next
Closer to the stage,
Yandex Music team
Это я получил в качестве changelog-а после обновления Яndex музыки.
Youtube-канал Сергея Немчинского переходит исключительно на Украинский язык.
И с одной стороны, учитывая количество поступающего в мозг контента, плюс минус одна подписка ничего не решает, но с другой стороны, когда смотришь блогера долгие годы, и когда просмотр видосиков конкретного человека или команды продолжает быть интересным всё это время, обычные видосики становятся чем-то слегка большим, чем-то родным, привычным.
Конечно печально наблюдать как человек, с вроде бы похожим складом ума, вдруг решает прекратить использовать инструмент, просто потому, что его родина - родина неприятеля.
Можно конечно начать раскрывать тему и сказать, что язык нельзя сравнивать с молотком или автоматом, что язык - это культура, обычаи, образ мышления и тому подобные вещи. Но по сути своей, на околотехническом канале русский язык выполнял роль, в первую очередь, инструмента для коммуникации блогера с аудиторией, однако мнение автора, к сожалению, оказалось иным.
Учить целый язык из-за единственного блогера - точно не то, чем мне хочется заниматься в ближайшее время, а потому минус одна подписка, ни больше, ни меньше.
PS
В целом ситуация неоднозначная, мне лично кажется, что он сам может и не против, но кто-то сильно попросил, ибо человек не полностью самостоятельно блогерством занимается.
И с одной стороны, учитывая количество поступающего в мозг контента, плюс минус одна подписка ничего не решает, но с другой стороны, когда смотришь блогера долгие годы, и когда просмотр видосиков конкретного человека или команды продолжает быть интересным всё это время, обычные видосики становятся чем-то слегка большим, чем-то родным, привычным.
Конечно печально наблюдать как человек, с вроде бы похожим складом ума, вдруг решает прекратить использовать инструмент, просто потому, что его родина - родина неприятеля.
Можно конечно начать раскрывать тему и сказать, что язык нельзя сравнивать с молотком или автоматом, что язык - это культура, обычаи, образ мышления и тому подобные вещи. Но по сути своей, на околотехническом канале русский язык выполнял роль, в первую очередь, инструмента для коммуникации блогера с аудиторией, однако мнение автора, к сожалению, оказалось иным.
Учить целый язык из-за единственного блогера - точно не то, чем мне хочется заниматься в ближайшее время, а потому минус одна подписка, ни больше, ни меньше.
PS
В целом ситуация неоднозначная, мне лично кажется, что он сам может и не против, но кто-то сильно попросил, ибо человек не полностью самостоятельно блогерством занимается.
Отключение нового repl в python 3.13
Спустя пару месяцев страданий я совершенно неожиданно для себя нашёл решение за 30 секунд.
Обновившись до питона 3.13, я столкнулся с тем, что они переделали интерактивный режим.
Во-первых он теперь заставляет windows terminal на каждую введённую буковку выплёвывать весь промпт, таким образом при написании каждого символа кода в nvda попадает всё ранее написанное.
С этим я как-то вроде даже смирился, но потом оказалось, что ввод многострочного кода стал... странным. Хз даже как описать, если кратко, то за пару минут я с ним не разобрался и забил.
Пока я просто пишу код всё идёт хорошо, но как только хочу повторить ранее введённые строки, начинается какая-то дичь (они будто не вводятся и не исполняются, а если даже и вводятся, то интерпретатор застревает в каком-то странном режиме, из которого фиг пойми как выйти, кроме как по ctrl+c).
Наконец я решил попробовать загуглить, что же это такое они сделали и как теперь с этим жить, а оказалось, что можно сетнуть переменную PYTHON_BASIC_REPL, и новое поведение отключится.
#A11yTricks
Спустя пару месяцев страданий я совершенно неожиданно для себя нашёл решение за 30 секунд.
Обновившись до питона 3.13, я столкнулся с тем, что они переделали интерактивный режим.
Во-первых он теперь заставляет windows terminal на каждую введённую буковку выплёвывать весь промпт, таким образом при написании каждого символа кода в nvda попадает всё ранее написанное.
С этим я как-то вроде даже смирился, но потом оказалось, что ввод многострочного кода стал... странным. Хз даже как описать, если кратко, то за пару минут я с ним не разобрался и забил.
Пока я просто пишу код всё идёт хорошо, но как только хочу повторить ранее введённые строки, начинается какая-то дичь (они будто не вводятся и не исполняются, а если даже и вводятся, то интерпретатор застревает в каком-то странном режиме, из которого фиг пойми как выйти, кроме как по ctrl+c).
Наконец я решил попробовать загуглить, что же это такое они сделали и как теперь с этим жить, а оказалось, что можно сетнуть переменную PYTHON_BASIC_REPL, и новое поведение отключится.
#A11yTricks
Приколы доступности от сбера
Открыл гигачат, и вижу такое поле:
"clickable Опишите вашу edit multi line"
Т.е. это текстовое поле с меткой "Опишите вашу", а дальше, видимо, уже от фантазии пользователя зависит.
В процессе тыканья я выяснил, что в placeholder поля динамически дописываются слова, видимо побуквенно, процесс этот можно наблюдать открыв dev tools.
Однако nvda захватывает то, что там было при разворачивании вкладки, и таким образом, пока я это выяснял, мне попалось: "Опишите вашу зад".
По-моему с таким предложением они переплюнули даже Грока от Илона Маска.
Открыл гигачат, и вижу такое поле:
"clickable Опишите вашу edit multi line"
Т.е. это текстовое поле с меткой "Опишите вашу", а дальше, видимо, уже от фантазии пользователя зависит.
В процессе тыканья я выяснил, что в placeholder поля динамически дописываются слова, видимо побуквенно, процесс этот можно наблюдать открыв dev tools.
Однако nvda захватывает то, что там было при разворачивании вкладки, и таким образом, пока я это выяснял, мне попалось: "Опишите вашу зад".
По-моему с таким предложением они переплюнули даже Грока от Илона Маска.
😁3❤1
Сколько должно быть опыта в программировании, чтобы перестать допускать такие ошибки?
Кстати скоро выпущу переработанный и переделанный с нуля аддон audioTimer, можно добавлять несколько таймеров, настраивать кастомные звуки срабатывания, задавать количество повторений таймера, повторяющиеся уведомления после истечения таймера...
if self.timer.enabled:
self.enable_item = self._add_menu_item(_("Enable"), self.on_enable)
else:
self.disable_item = self._add_menu_item(_("Disable"), self.on_disable)
Кстати скоро выпущу переработанный и переделанный с нуля аддон audioTimer, можно добавлять несколько таймеров, настраивать кастомные звуки срабатывания, задавать количество повторений таймера, повторяющиеся уведомления после истечения таймера...
Начал использовать ИИ для программирования, и вдруг меня посетила глубокая мысль.
Сначала человечество придумало динамически типизированный язык, чтобы упростить себе жизнь.
Потом человечество придумало type hints для динамически типизированного языка, чтобы упростить себе жизнь.
А потом человечество придумало ии пишущего тайпхинты, чтобы упростить себе жизнь.
В какой же момент мы свернули не туда?..
Сначала человечество придумало динамически типизированный язык, чтобы упростить себе жизнь.
Потом человечество придумало type hints для динамически типизированного языка, чтобы упростить себе жизнь.
А потом человечество придумало ии пишущего тайпхинты, чтобы упростить себе жизнь.
В какой же момент мы свернули не туда?..
Читая логи nvda, порой можно найти интересные вещи, однажды я писал про "Разрушительный сбой", а сегодня делюсь вот таким:
Остаётся только догадываться, куда же все они делись...
FileNotFoundError: [WinError 18] Больше файлов не осталось.Остаётся только догадываться, куда же все они делись...
Исправляем pager в git
Вводные данные: вы используете windows terminal, git, и в качестве пейджера используется less.
Pager - это такая штука, через которую git, или любая другая программа выводит данные постранично.
Это всё хорошо и классно работает, Но проблема следующая, когда, допустим, просматриваем log, less вроде открывается, но для nvda по прежнему доступен весь буфер, и найти первую строку выведенной страницы достаточно сложно.
Раньше я думал, что это особенность nvda и/или less, но в какой-то момент заметил, что less, открытый вручную, ведёт себя как раз так, как нужно, он перекрывает старый буфер, и shift+numpad7 приводит курсор к первой строке на странице.
В результате гугления я выяснил, что git, по дефолту, запускает less с переменной окружения LESS, через которую передаёт в него параметры FRX.
И F, например, достаточно полезен, он заставляет less не входить в интерактивный режим, если выхлоп помещается на один экран, однако X, как оказалось, ломает нужное нам поведение, и из-за него во-первых nvda может убегать за границы страницы, а во-вторых после закрытия пейджера на экране остаётся огрызок текста.
Решения у проблемы два. Задать переменную LESS самостоятельно, или переопределить поведение less, заставив его выключить то, что было включено через environment.
Второе решение кажется мне наиболее удобным и правильным, т.к. мы точечно лечим исходную проблему less + git, не затрагивая другой софт, который тоже может выводить что-нибудь через less.
А сделать это можно одной простой командой:
Теперь логи, дифы и иные полезности будут выводиться без побочных эффектов, и с ними можно будет удобно взаимодействовать в windows terminal.
Кстати для удобного чтения дифов в терминале рекомендую дополнение dev box, ибо продуктивность, по крайней мере в моём случае, заметно выросла, и будто бы это гораздо удобнее, чем решение, предлагаемое в vscode, в прочем, это уже совсем другая история.
Вводные данные: вы используете windows terminal, git, и в качестве пейджера используется less.
Pager - это такая штука, через которую git, или любая другая программа выводит данные постранично.
Это всё хорошо и классно работает, Но проблема следующая, когда, допустим, просматриваем log, less вроде открывается, но для nvda по прежнему доступен весь буфер, и найти первую строку выведенной страницы достаточно сложно.
Раньше я думал, что это особенность nvda и/или less, но в какой-то момент заметил, что less, открытый вручную, ведёт себя как раз так, как нужно, он перекрывает старый буфер, и shift+numpad7 приводит курсор к первой строке на странице.
В результате гугления я выяснил, что git, по дефолту, запускает less с переменной окружения LESS, через которую передаёт в него параметры FRX.
И F, например, достаточно полезен, он заставляет less не входить в интерактивный режим, если выхлоп помещается на один экран, однако X, как оказалось, ломает нужное нам поведение, и из-за него во-первых nvda может убегать за границы страницы, а во-вторых после закрытия пейджера на экране остаётся огрызок текста.
Решения у проблемы два. Задать переменную LESS самостоятельно, или переопределить поведение less, заставив его выключить то, что было включено через environment.
Второе решение кажется мне наиболее удобным и правильным, т.к. мы точечно лечим исходную проблему less + git, не затрагивая другой софт, который тоже может выводить что-нибудь через less.
А сделать это можно одной простой командой:
git config --global core.pager "less -+X"
Теперь логи, дифы и иные полезности будут выводиться без побочных эффектов, и с ними можно будет удобно взаимодействовать в windows terminal.
Кстати для удобного чтения дифов в терминале рекомендую дополнение dev box, ибо продуктивность, по крайней мере в моём случае, заметно выросла, и будто бы это гораздо удобнее, чем решение, предлагаемое в vscode, в прочем, это уже совсем другая история.
Однажды проходил курсы на яндекс практикуме, с тех пор на github остались учебные репы.
И уже несколько лет, каждую неделю мне github присылает письма с уведомлениями о том, что то в одной, то в другой репе они автоматически нашли уязвимость.
А сегодня настал тот день, когда мне надоели эти письма, и я решил их выключить, ибо конкретно в этих репозиториях я ничего менять не планирую, и просто храню их для истории.
Так вот за все эти годы в одном из репозиториев, гитхаб нашёл, внимание... 135 уязвимостей!
Остаётся только надеяться, что ни один из десятков сервисов, которым мы ежедневно доверяем свои данные, не имеет такой выдающийся метрики.
И уже несколько лет, каждую неделю мне github присылает письма с уведомлениями о том, что то в одной, то в другой репе они автоматически нашли уязвимость.
А сегодня настал тот день, когда мне надоели эти письма, и я решил их выключить, ибо конкретно в этих репозиториях я ничего менять не планирую, и просто храню их для истории.
Так вот за все эти годы в одном из репозиториев, гитхаб нашёл, внимание... 135 уязвимостей!
Остаётся только надеяться, что ни один из десятков сервисов, которым мы ежедневно доверяем свои данные, не имеет такой выдающийся метрики.
🔥1😢1
Вхожу в сервис альфа-страхование через госуслуги, выдал все разрешения, жду редиректа.
Доолго жду, секунд 20.
И дождался:
#ОноСломалось
Доолго жду, секунд 20.
И дождался:
Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 41959424 bytes) in /var/www/alfastrah/htdocs/public/bitrix/modules/main/classes/mysql/database_mysqli.php on line 54
[ErrorException] E_ERROR
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 41959424 bytes) (0)
/var/www/alfastrah/htdocs/public/bitrix/modules/main/classes/mysql/database_mysqli.php:54
----------
#ОноСломалось