Простой скрипт, добавляющий текущий каталог в архив.

Задача

1. Добавить текущий каталог в архив со всеми подкаталогами и файлами.
Т.е., если вы находитесь в каталоге /home/user/directory, то скрипт должен добавить в архив сам каталог, и все содержимое.
2. Добавить только содержимое (т.е. в архиве присутствует только содержимое каталога, но не сам каталог).
3. Вывод справки об использовании скрипта по ключу -h или --help

Ход мысли (описание алгоритма)

Чтобы заархивировать текущий каталог разными способами, надо добавить параметр. Пусть скрипт, запущенный без параметров, архивирует текущий каталог вместе с ним самим, а скрипт, запущенный с параметром -nc (no catalog), архивирует только содержимое. Еще надо вывести помощь, а если подсунули какой-то другой параметр, то отругаться и вывести помощь.
Уточнение. Архив, из-за алгоритма работы архиватора, не сможет находиться в текущем каталоге, вне зависимости от того, с самим каталогом создается архив, или без. Архив надо создать в каталоге уровнем выше, а соответственно, предусмотреть ситуацию, когда пользователь вызывает скрипт из корневого каталога (выше него нет ничего).
Уточнение #2. Поскольку, про имя архива ничего не сказано, имя архива будет текущий_каталог.tar.gz

Решение

1. Поскольку, помощь будет вызываться в двух случаях, напишем отдельную функцию, чтоб вызывать помощь, когда нужно:

print_help()
{
    echo "Add current directory and subdirectories to tar.gz archive"
    echo "Use "`basename $0`" [-nc]"
    echo "[-nc] - add only content current directory (and subdirectories)."
    echo
    echo "Archive name == current directory name."
    echo "Archive will be created to up-directory."
    exit 1
}

2. Проверяем вызов помощи пользователем (в параметрах скрипта задано -h или --help):

if [[ "$1" == "-h" || "$1" == "--help" ]]; then
    print_help
fi

3. Проверяем, не запущен ли скрипт в корневом каталоге (/):

CURDIR=`pwd`

if [ "$CURDIR" == "/" ]; then
    echo "Oh, no! It's root directory!"
    exit 1
fi

Пояснение: `` обратные кавычки — те, которые, на клавише Ё, отправляют вывод работы команды в переменную. pwd выводит текущую директорию

4. Формируем имя архива и путь к нему и получаем имя текущего каталога

DIRNAME=`basename $CURDIR`
ARHNAME="../"$DIRNAME".tar.gz"

Пояснение: команда basename без дополнительных параметров, отрезает весь путь от имени файла, т.е. выводит на консоль только имя файла без относительного или абсолютного пути.

5. Если скрипту не заданы аргументы:

if [ $# -ne 1 ]; then

Пояснение: системная переменная $# хранит количество аргументов скрипта, заданных в командной строке.
запускаем архиватор, для создания архива вместе с текущим каталогом:

tar -czvf $ARHNAME "../"$DIRNAME

Пояснение: tar сам обрежет символы ../ и добавит, что надо.

6. Если параметр #1 скрипта присутствует, то проверяется, равен ли он -nc.

else
    if [ "$1" == "-nc" ]; then

7. Если да, вызывается архиватор, архивирующий содержимое текущего каталога (без самого каталога):

tar -czvf $ARHNAME "."

8. Иначе, выводится сообщение о недопустимом значении параметра и помощь по использованию скрипта:

else
	echo "Wrong parameter(s)!"
	echo
	print_help

Итог

Скрипт целиком на GitHub
На PasteBin

Дистрибутивы PXE

Это техническая страничка со списком дистрибутивов нашего PXE-сервера и ссылками на описание конкретных дистрибутивов. Страничка пополняется в зависимости от производственной необходимости, наличия оборудования, для которого понадобился тот или иной дистрибутив и времени.

Acronis utilities

— Acronis True Image 2011
— Acronis True Image 2015
— Acronis Disk Director 12
— Acronis Disk Director 10 (small DOS version)
— Acronis True Image Enterprise 8 (small DOS version)
Подробности об установке на сервер и меню PXELINUX (копия)

Hiren’s Boot CD 15.2 (копия) и бонус, разные утилиты для подбора паролей (копия)

System Rescue CD (копия)

Linux

— Puppy Slacko 5.5:
* Описание и скрипт для подготовки дистрибутива копия (запускать из Puppy, загрузившись с оригинального диска или на виртуальной машине)
* Оригинальный ISO.
* Мой мод оригинального ISO (добавлен mc, tcplay и скрипт в каталоге netboot)
* Готовый архив для PXE (добавлен mc, tcplay и скрипт в каталоге netboot)
* Пункт меню PXE сервера
INX 1.1 (Is Not X) (копия)
— Меню для всего раздела Linux: Mega.nz PasteBin

Примечание: Как в Puppy выйти из иксов, если они глючат (копия)

Windows

Windows XP PE (копия) с возможностью установки из нее Windows XP
— Windows XP PE Very Small (быстро загрузиться и посмотреть/подправить что-нибудь на жестком диске, можно скачать по ссылке выше)
Windows XP Unattended install (копия). Альтернативный способ установки Windows XP из специализированного Linux-окружения.
Windows 7 PE (копия). С возможностью установки из нее Windows 7 и выше.
Boot Windows from HDD (копия) — специальный ISO-образ с Grub4Dos для загрузки Windows XP/Vista/7/8/10 с жесткого диска
Boot Windows from HDD (DOS method) (копия) — альтернатива предыдущему пункту, только загрузчик вызывается из DOS-окружения.
— Меню всего раздела на Mega.nz PasteBin

Примечание: Альтернативный способ установки Windows 7/Vista/8/10.
Если не загрузилась Windows 7 PE или в ней что-то не работает.
1. Грузимся в какой-нибудь Linux, который видит сеть и умеет в Samba или FTP (FTP, естественно, надо поднять предварительно на сервере и скопировать в каталог, доступный через FTP, дистрибутив винды).
2. Делим диск и копируем винду на целевую машину, как это описано здесь (копия). Понятно, что вместо флешек с виндами используем FTP, Samba и возможности PXE-сервера.
3. Пользуемся Boot Windows from HDD или Boot Windows from HDD (DOS method) чтобы запустить установщик винды на целевой машине.
И ТЕЛЕМАРКЕТ!

Образы DOS (копия)

Старые ОС.

Сделано от нехрен делать и шутки для.

— Windows 1.03
— Windows 2.03
— Windows 3.11 with MS Office and other programs
— Windows 98

Некоторые есть здесь (копия)

Выход в чистую консоль в Puppy Slacko

Чтобы выйти из X (графического окружения) Puppy Slacko, и превратить его в полноценный консольный дистрибутив, например, если иксы глючат, достаточно нажать сочетание клавиш Ctrl+Alt+Backspace. Другой способ завершить иксы аварийно — переключиться в первую консоль (Ctrl+Alt+F1) и нажать Ctrl+C

Можно просто переключиться в консоль стандартным линуксовым способом, нажав Ctrl+Alt+F2 или Ctrl+Alt+F3 (это независимые консоли, кто не знает), тогда иксы останутся висеть в памяти, к ним можно вернуться, нажав Ctrl+Alt+F4.

Вводим логин root, пароль woofwoof и попадаем в голую консоль.

Запуск System Rescue CD по сети (PXE).

Преамбула

System Rescue CD — live CD, предназначенный для восстановления Linux-систем, основан на Gentoo, в комплекте довольно много полезностей. Можно использовать и как небольшой Live-дистрибутив Linux. Имеет графическую оболочку на Xfce (надо вызывать вручную командой startx, или через соответствующий параметр при загрузке). Решил добавить на наш PXE-сервер. Пока поставил не самую последнюю версию — 5.3.2, т.к. у этой версии есть возможность загружаться с 32 и 64-разрядным ядром (в более новых версиях поддержку x86 выпилили).

Подготовка дистрибутива и настройка NFS-сервера

1. Распаковываем ISO-образ
2. Создаем каталог на PXE-сервере, например /home/pxe/tftp/distrib/srcd/
3. Копируем в этот каталог файлы sysrcd.dat, sysrcd.md5 из корня, rescue32, rescue64 и initram.igz из каталога isolinux ISO-образа.
Примечание: sysrcd.dat — сжатый Squash FS образ файловой системы ОС, при запуске скрипт в initrd проверяет его целостность по контрольной сумме, хранящейся в sysrcd.md5.
4. Открываем каталог для доступа по NFS, добавляем в /etc/exports строчку:
/home/pxe/tftp/distrib/srcd/[пробел или табуляция]*(ro,no_subtree_check,all_squash,insecure)
5. Рестартируем NFS-сервер.

Настройка запуска

LABEL rescue32mem
menu label System Rescue CD x86 kernel (memory cache)
kernel distrib/srcd/rescue32
initrd distrib/srcd/initram.igz
append dodhcp nfsboot=10.10.0.120:/home/pxe/tftp/distrib/srcd/ nomodeset setkmap=us docache

dodhcp nfsboot=10.10.0.120:/home/pxe/tftp/distrib/srcd/ — указание получить IP от DHCP и NFS-каталог с соответствующего сервера.
nomodeset — не использовать графические драйверы ядра для загрузки в консоль. Загрузится в нормальную консоль 80×25
setkmap=us — установить английскую раскладку клавиатуры (иначе будет спрашивать при загрузке)
docache — подгрузить образ файловой системы (sysrcd.dat) в память. Требуется не менее 512 Мб оперативной памяти, но без этого параметра у меня System Rescue CD упорно не хотел грузиться (хотя, в итоговом меню оставил варианты и без docache с целью потом поэкспериментировать на других машинах).

Для запуска с 64-разрядным ядром меняем rescue32 на rescue64.

Под катом дополнительные утилиты и скриншоты

Скачать

System Rescue CD 5.3.2 (с официального сайта)
Архив для PXE
freedos.img
— Меню: с Mega.nz на PasteBin

Загрузка INX по сети (PXE)

Преамбула

INX (расшифровывается как Is Not X), небольшой консольный, как ясно из названия, Live-дистрибутив Linux, основанный на Ubuntu. Обычно для разных целей я пользуюсь Puppy Slacko, но, как выяснилось, иметь live-дистрибутив без иксов, тоже полезно 🙂 В Слаке иксы на одной из машин безбожно заглючили. Всяческие DSL и тем более Linux For Scratch (читай самодельный дистрибутив) мне не подходили, потому что с ними может оказаться еще больше возни, или «из коробки» заглючит что-нибудь другое, или того хуже — сам чего-нибудь забудешь и недоложишь. А этот вроде выглядел вполне неплохо. В комплекте много всего, даже браузеры и консольные игры, есть mc, да и по заверениям разработчиков, требует он менее 100 Мб оперативной памяти, если загружен в обычном режиме. Поддерживается и режим to RAM, но тогда, как я понял, весь сжатый Squash FS образ системы грузится в память, и надо уже как минимум 200 Мб.
С интернетом, правда, небольшой баг. Надо вручную подправлять /etc/resolv.conf, иначе не будет DNS.

sudo mcedit /etc/resolv.conf
и меняем непонятный DNS, например на 8.8.8.8

Секунда ворчания

Вот уж некоторые, блин, линуксоиды профессиональные админы. Пишут инструкции, иногда упуская мелкие, но важные детали, которые, особенно если первый раз сталкиваешься, могут доставить неудобств. К вопросу, почему я стараюсь все подробно расписывать, во всяком случае, те грабли, на которые сам наступил.

Подготовка дистрибутива

1. Распаковываем или монтируем ISO-образ. (скачать с официального сайта)
2. Создаем каталог для дистрибутива там, где хранятся дистрибутивы PXE-сервера, в моем случае /home/pxe/tftp/distrib/linux/inx/
3. Копируем из подкаталога casper ISO-образа в созданный каталог файлы vmlinuz initrd.gz
4. Создаем в /home/pxe/tftp/distrib/linux/inx/ подкаталог casper
5. Копируем в /home/pxe/tftp/distrib/linux/inx/casper из каталога casper ISO-образа файл filesystem.squashfs
Этот файл обязательно должен лежать в подкаталоге casper каталога, который будет указан как nfsroot, иначе ядро его не найдет, и загрузка не получится.
Да, это была причина секунды ворчания. Целый час проковырялся. Об NFS ниже.

NFS-сервер

Для загрузки INX, кстати, как и других убунтовых дистрибутивов, по сети потребуется NFS-сервер. Тут я оставлю подробности, т.к. устанавливается он в разных Линуксах немного по-своему, а в Slackware, которая у меня, он шел «из коробки». Надо было только поставить права на исполнение двум скриптам /etc/rc.d/rc.nfsd и /etc/rc.d/rc.rpc.

После того, как сервер установлен, необходимо изменить файл /etc/exports чтобы открыть доступ к каталогу с дистрибутивом по NFS:

/home/pxe/tftp/distrib/linux/inx/[пробел или табуляция]*(ro,async,no_subtree_check,no_wdelay,insecure_locks,no_root_squash,insecure)

(пере)запускаем NFS-сервер.

Настройка запуска

Добавляем дистрибутив в меню PXE-сервера.

LABEL inx
menu label INX
kernel distrib/linux/inx/vmlinuz
append root=/dev/nfs boot=casper netboot=nfs nfsroot=10.10.0.120:/home/pxe/tftp/distrib/linux/inx/ username=inx hostname=inx userfullname="inx-user" initrd=distrib/linux/inx/initrd.gz vga=normal --

LABEL inxmem
menu label INX to RAM
kernel distrib/linux/inx/vmlinuz
append root=/dev/nfs boot=casper netboot=nfs nfsroot=10.10.0.120:/home/pxe/tftp/distrib/linux/inx/ username=inx hostname=inx userfullname="inx-user" initrd=distrib/linux/inx/initrd.gz vga=normal toram --

В более удобочитаемом виде на PasteBin

В качестве корневого каталога ОС (параметр root) указывается устройство /dev/nfs
boot=casper — указание использовать Live-режим и искать основную ОС в файле сжатой файловой системы.
netboot=nfs — указание произвести загрузку по сети, используя NFS
nfsroot=10.10.0.120:/home/pxe/tftp/distrib/linux/inx/ — указание адреса (замените 10.10.0.120 на свой) и каталога на сервере (указывается с корня сервера).
username, hostname и userfullname — соответственно, параметры для указания имени пользователя, имени компьютера и полного имени пользователя. Можно поставить свои, я оставил те, что были в конфиге isolinux из ISO-образа
initrd=distrib/linux/inx/initrd.gz — указание, где искать инициализационный RAM-диск (задается относительно корня TFTP-сервера, т.к. initrd грузится по TFTP).
vga=normal установка разрешения консоли (80×25 символов, ЕМНИС), или можно подсмотреть код оригинального в isolinux.cfg на диске, или, например, загрузившись с диска, почитать справку на этот счет.
toram — загружать сжатый образ файловой системы (filesystem.squashfs) целиком в память. Без этого параметра — обращаться к нему по необходимости. Не знаю точно, работает ли параметр с загрузкой по сети, но вроде с ним загрузка проходит медленнее. Значит, похоже, если параметр toram не указан, то filesystem.squashfs по необходимости подчитывается из сети, и такой режим требует меньше памяти.

Скриншоты


Меню сетевых программ


А вот и браузер

Ссылки

Netbooting Ubuntu Live CDs
Скачать готовый архив с Mega.NZ

Делаем аварийный загрузочный образ WinPE на базе Windows 7. (с возможностью установки Win7/8/10)

Преамбула

В прошлых заметках я рассказывал о том, как загрузить WinPE XP по сети и установить из нее Windows XP. Теперь делаю WinPE на базе Windows 7

Необходимые инструменты и утилиты

— Компьютер, с установленной Windows 7 🙂
— Достаточное место на HDD, со всеми потрохами этот процесс сожрал ~50Гб на диске.
— Образ Windows Automated Installation Kit (WAIK)
— WinBuilder — небольшая утилита, позволяющая автоматизировать процесс создания образа. О ней ниже.
Чистый (!) образ установщика какой-нибудь одной версии Windows 7, сборки разной степени колхозности, а так же образы дисков все-в-одном (AIO) не подойдут. Скорее всего WinBuilder прекратит работу с какими-нибудь неудобоваримыми глюками. Поскольку я собрался делать образ x86 (32-разрядный), то и скачал Windows 7 Ultimate x86 с рутрекера.
— Универсальные наборы драйверов для сети, чипсетов и устройств хранения данных. О них ниже.
— Какая-нибудь виртуальная машина для тестирования полученного образа. У WinBuilder в комплекте есть QEMU, но желательно поставить VMWare, в нужный момент WinBuilder ее «подхватит», создаст свою виртуалку и запустит на ней образ
-cdrkit в Linux, для создания ISO-образа.

Далее под катом

Минус — способ требователен к памяти, понадобится хотя бы 1 Гб RAM

Скачать

Плагины и другие мелочи

Скрипт createiso-gfd на PasteBin
Урезанный Far
Плагин для установки Far в сборку
BAT-файл для установки Windows 7
Скрипт для установки файла в сборку
Исправление для плагина Wallpaper
Загрузчик и menu.lst

WinBuilder

WinBuilder SE (чистый, без плагинов)
Полная версия

Готовый образ Win7 PE SE

Образ Win 7 PE SE

Hiren’s Boot CD 15.2 и загрузка его по сети (PXE)

HBCD, как я уже говорил — «очень полезный горшочек», набор утилит для всяческого восстановления, форматирования, установки винды, и т.д.
Последняя версия, несмотря на то, что из нее убрали весь пиратский софт, стала только больше, и весит 700 Мб, хотя я помню версии по 250 Мб. Но можно распотрошить CD и грузить его по частям. Распакуем образ и приступим.

— Mini Windows XP. Аж целая заметка есть по этому поводу (копия).
Готовый образ

— Very Mini Windows XP. Образ по ссылке выше. Хоть этого и не было в оригинале, добавлю.
Готовый образ

— DOS Programs. Как вытащить DOS’овую часть из HBCD. (копия)
Готовый образ

— Все раскладываем по отдельным каталогам.

Parted Magic

Это Linux-окружение для всяких работ с диском (делением на разделы, форматированием и т.д.). Но надо сказать, слегка капризное в отношении загрузки по сети.
Поскольку, программе мало ядра и initrd, лучше создать отдельный ISO-образ с ней. В каталог iso_root надо скопировать каталог pmagic из \Boot образа HBCD. Также нужно добавить загрузчик и составить соответствующие конфиги.
Вот переписанный с конфига HBCD конфиг для isolinux:

isolinux.cfg PasteBin (Mega.nz) — основное меню диска
other.cfg PasteBin (Mega.nz) — дополнительные варианты загрузки, есть утилиты недоступные из основной конфигурации.
Главное, не забыть в каждую конфигурацию загрузки добавить опцию livemedia noeject, без нее не видит файлов из своей ФС.

Готовый ISO-образ

Пункт меню:

LABEL pm
    menu label Parted Magic 
    kernel modules/memdisk
    initrd distrib/hbcd/pm/pm.iso
    append iso

***

Windows Memory Diagnostic, загружается, как обычный образ загрузочного диска. В качестве ядра указываем memdisk, а в качестве initrdwmemtest.gz

LABEL wm
    menu label Windows memory diagnostic
    kernel modules/memdisk
    initrd distrib/hbcd/wmemtest/wmemtest.gz

***

MemTest86+ (настройки те же)

NT/2000/Vista/7 password changer

Грузим, как обычный Linux-дистрибутив.

LABEL ch
    menu label NT/2000/Vista/7 password changer 
    kernel distrib/hbcd/ntpr/chntpw
    initrd distrib/hbcd/ntpr/chntpw.gz

Ядро
chntpw.gz

***

Kon-Boot (Password recovery)
Аналогично образам дискет.

Seagate Disk Wizard

1. Из \Boot HBCD копируются два файла SeagatDW и SeagatDW.gz в отдельный каталог.
2. Переименовываем строчными буквами (т.е. в sgdw и sgdw.gz)
3. Грузим, как обычный Linux-дистрибутив.

LABEL sd
    menu label Seagate Disk Wizard
    kernel distrib/hbcd/seagate/sgdw
    initrd distrib/hbcd/seagate/sgdw.gz
    append rw ramdisk_size=32768 acpi=off quiet noapic mbrcrcs on vga=788

Строчку append копируем из конфига HBCD.

Ядро
initrd

PloP Boot Manager

1. Лишить оригинального расширения .bin, т.е. переименовать в plpbt.
2. Положить в отдельный каталог.
2. Прописать его в параметре kernel

LABEL pl
    menu label Plop boot manager
    kernel distrib/hbcd/plop/plpbt

plpbt (скачать)

***

Smart Boot manager.
Грузится, как сжатый образ с помощью memdisk.

Fix «NTLDR is missing»
Аналогично.

Darik’s Boot and Nuke — Hard Drive Eraser
Аналогично.

Образы DOS-программ предыдущих версий

HBCD 10.1 DOS Image
HBCD 8.7 DOS Image

Загружаются, как ISO-образы.

Меню HBCD

На PasteBin
Mega.NZ

Скачать весь дистрибутив (без старых образов)

В 7Z-архиве

Старые образы:

HBCD 10.1 DOS Image
HBCD 8.7 DOS Image

Альтернативный способ установки Windows XP по сети (PXE) из Linux-окружения.

Преамбула

Способ довольно странный, а само Linux-окружение для установки несколько кривовато, потому пишу больше чтоб тему закрыть и к установке XP более не возвращаться.

Принцип действия программы основан на возможности установки Windows XP из под DOS. Сначала по сети грузится специальный дистрибутив Linux (ядро и initrd), он настраивает сеть, подключает нужные сетевые шары, запускает предварительное конфигурирование, генерирует файл unattend.txt и разные послеустановочные скрипты, теоретически запускающие установку необходимых программ. На практике вся автоматизация работает криво (возможно, надо править скрипты и конфиги), но доступ к установщику винды, который думает, что запущен из-под DOS, мы в результате получаем.

Установка Linux-окружения

Вот где, кто и когда и откуда эту штуковину взял, я не ведаю. Поэтому вот вам архив прямо с сервера (естественно, без дистрибутива винды внутри).

Скачать

Распаковываем содержимое каталога unatxp (внутри архива) куда-нибудь в отдельный подкаталог в каталоге с дистрибутивами на PXE-сервере.
Пусть будет для примера такой вот путь:
/home/pxe/tftp/distrib/windows/unatwinxp

Настройка шары

Для работы установочному Linux-окружению необходимо расшарить каталог distrxp
Добавляем в smb.conf:

[unatdistr]
        path=/home/pxe/tftp/distrib/windows/unatwinxp/distrxp
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

Перезапускаем samba.

Подготовка дистрибутива Windows XP

Дистрибутив XP надо скопировать с установочного диска или распаковать из ISO-образа и поместить в подкаталог distrxp/os/winxp, а также установить права на все файлы в подкаталогах в 755.

cd /home/pxe/tftp/distrib/windows/unatwinxp/distrxp/os/winxp
chmod -R 755 *

Загрузка Linux-окружения, загрузочное меню PXE-сервера.

Осталось подправить меню PXE-сервера.

LABEL winxpunatted
    menu label Windows XP Unattended install
    kernel distrib/windows/unatwinxp/bzimage
    initrd distrib/windows/unatwinxp/initrd.gz
    append z_user=guest z_password=guest z_path=\\10.10.1.5\unatdistr

Как видно из кода выше, необходимо передать ядру Linux-окружения имя пользователя и пароль для доступа к шаре, а также ее адрес на сервере. Все данные передаются в соответствующих параметрах ядра.

Подготовка целевой машины

Теперь надо подготовить машину, на которую будем устанавливать XP. На самом деле, Linux-окружение само предложит переделить диск и сделать активный раздел при помощи своих инструментов, но я ему не особо доверяю, потому сделал это с помощью Acronis. Главное, чтоб перед установкой на машине уже был активный раздел, отформатированный в FAT32, иначе Linux-окружение перевет работу где-то на середине, и выбросит в линуксовую консоль, так и не запустив эмулятор DOS.

Запуск Linux-окружения и установка Windows XP

Далее с картинками под катом

Плюсы и минусы

— Довольно кривое Linux-окружение
— Много мелких суетливых движений, как говорил классик. Необходимость отвечать на кучу вопросов.
— Требует раздел FAT32, потом придется переделывать командой convert.

+ Отсутствует возня с сетевыми драйверами и BINL
+ Идет даже на очень слабых машинах, тестировалось на PIII 700

Скачать

Установочное Linux-окружение для Windows XP

Загрузка Windows (7/10/Vista/XP) с жесткого диска загрузчиком GRUB4DOS из ISO-образа.

Преамбула

Как-то давно мы делали загрузку Windows с жесткого диска (копия) с помощью Grub4DOS, запускаемого в DOS-окружении.

Оказывается, на некоторых машинах такая конфигурация может неожиданно сглючить. Загрузчику 7 и 10 Windows почему-то периодически не нравится образ виртуального HDD с DOS. Переделал так, чтобы было без DOS-окружения совсем, а GRUB4DOS стартовал из загрузочного ISO-образа.

Загрузочное меню

Составляем загрузочное меню GRUB4DOS, в принципе, все делается по инструкции, нужен лишь редактор, поддерживающий переносы строк Windows/DOS (CR+LF). И стоит обратить внимание на то, что этот загрузчик GRUB4DOS чувствителен к регистру имен файлов, поэтому файл menu.lst необходимо назвать строчными буквами.

Основное загрузочное меню (menu.lst) на PasteBin
Меню с альтернативными вариантами загрузки (alt.lst) на PasteBin

Загрузочный ISO

Загрузочный ISO я сделал в Linux, с помощью утилиты mkisofs.

1. Создаем где-нибудь в удобном месте каталог iso_root
2. Копируем в каталог файлы menu.lst, alt.lst и загрузчик GRUB4DOS grldr
3. В каталоге уровнем выше iso_root делаем скрипт для создания ISO-образа

Скрипт на PasteBin

4. Запускаем его

./createiso-gfd WINBOOT

5. ФАНФАРЫ

Вот вид загрузочного меню:

Скачать

Готовый ISO-образ с mega.nz (600 Кб)
menu.lst, alt.lst, grldr и скрипт createiso-gfd в одном архиве.

Консольные Live-дистрибутивы Linux.

Искал тут себе маленькие консольные (чтоб без иксов при старте) дистрибутивы Линукс. Перелопатил весь гугль. Вот меня пока два устроили, старейший, из мне известных System Rescue CD и INX, на основе Ubuntu, но без X-сервера. Он так и называется INX (Is Not X).

А вы что посоветуете?

Запуск Mini Windows XP (WinPE) из Hiren’s Boot CD 15.2 по сети (PXE).

Преамбула

Mini Windows XP, «очень полезный горшочек», однако с запуском по сети возникают определенные сложности. Если просто загрузить образ Hiren’s Boot CD с помощью memdisk и запустить Mini Windows XP она свалится.

XP, что PE-версии, что инсталлятор, подружить с PXE проблематично. Мало того, что надо поднимать сервер BINL, который выдаст винде нужные драйвера для сетевых карт, так еще и задолбаешься настраивать загрузчик. Чего только не было — и штатный ntdetect.com не подходил, и патченные в упор не видели файлов ответа (winnt.sif), в общем геморроя было масса.
Но интересно, что Mini Windows XP вообще-то драйвера для сети при загрузке не нужны, все файлы на момент запуска уже переданы на целевую машину, и проблема в чем-то другом. Насколько я понял, в том, как memdisk маппит в память ISO-образ, а винда потом с этим делом конфликтует, скорее всего у нее не получается создать виртуальный диск в памяти. А если попробовать грузить не образ ISO, а образ HDD с виндой? Да! Таким макаром все вышло. Об этом и расскажу.

Необходимые инструменты

— Собственно, ISO-образ Hiren’s Boot CD 15.2
Minimal DOS Image
— Какой-нибудь дистрибутив Linux, в который можно установить виртуальную машину QEMU. Мой пакет для Slackware здесь
— Утилита kpartx, из комплекта multipath-tools. Можно собрать/скачать самостоятельно. На всякий случай, пакет для Slackware
— Windows 7, если захочется провести более глубокую модификацию Mini Windows XP
— Текстовый редактор, поддерживающий переносы строк DOS/Windows (CR+LF), для редактирования конфигов и BAT-файлов DOS, Mini Windows XP и конфига загрузчика Grub4Dos (я делал это в винде).

Далее большой текст с подробностями, картинками, скриптами и файлами для скачивания

Готово!

Осталось только сжать готовые образы gzip‘ом и прописать в меню PXE-сервера:

gzip winpecut.img
gzip winpe.img

LABEL winxppe
    menu label Windows XP PE
    kernel modules/memdisk
    initrd distrib/windows/winpe/winpe.img.gz
    append harddisk

LABEL winxppecut
    menu label Windows XP PE Very Small
    kernel modules/memdisk
    initrd distrib/windows/winpecut/winpecut.img.gz
    append harddisk

Видео загрузки Mini XP по сети

Скачать

Minimal DOS Image
Пакеты:
QEMU
muktipath-tools
Скрипты, утилиты, примеры конфигов из статьи

Образы

Тестовый (минимальный) образ Mini Windows XP
Полный образ Mini Windows XP

Простая инструкция по установке Tinyproxy

Небольшое введение

Tinyproxy это такой маленький http/https прокси-сервер, на мой взгляд, очень простой в использовании и конфигурировании, вполне подходящий для несложных задач пропускания http(s) трафика. Например в офисе или дома. Лично я использую его, чтоб можно было посещать статистику и личный кабинет собственного провайдера в обход VPN.

Конфигурация network namespace.

Если у вас есть специальный network namespace для прокси, перед установкой сервера настраиваем его (добавляем нужные файлы hosts и resolv.conf, как это описано здесь Копия)

Рестартируем систему (или сетевой менеджер/демон, тут уж зависит от вашей ОС).

Устанавливаем tinyproxy

Для Sclackware можно скачать пакет с исходниками с помощью sbopkg, взять готовый и откомпилированный здесь (Для Slackware 12-14.2), или собрать из исходников на GitHub и готовый пакет установить с помощью installpkg.

Создаем пользователя и группу

1. Создаем группу для proxy-сервера, например proxy:

groupadd proxy

2. Создаем отдельного пользователя для запуска прокси-сервера:
Можно сделать это с помощью скрипта-обертки adduser над программой useradd.
— На первый вопрос вводим имя пользователя, например, provproxy.
— Далее пропускаем (нажимаем enter)
— В ответ на initial group, вводим имя ранее созданной группы для прокси-сервера, в данном случае proxy (в вашем — ту группу, которую создали вы).
— Далее, на вопрос о дополнительных группах, нельзя устанавливать что-либо, нажимаем Enter
— Home directory нужна, там будет лежать PID-файл, логи (если нужно) и конфигурационный файл. По умолчанию директория совпадает с именем пользователя и располагается в подкаталоге /home.
— Shell должна быть установлена строго в /bin/false, поскольку это не интерактивный пользователь. Если скрипт ответил вам: - Warning: /bin/false is not in /etc/shells (potential problem using FTP)
Do you wish to change the shell ? (Y/n)

То отвечаем n, а потом в /etc/shells добавляем строчку
/bin/false
— Expiry date пропускаем (Enter)
— Далее пропускаем всю User Information
— На вопрос о пароле придумываем что-нибудь чтоб прошло.
Далее правим /etc/shadow, находим строчку с именем пользователя и удаляем все, что между первым и вторым двоеточием. Было:
provproxy:$5$S8/tp/ap2wF/K$qaYnfHuR8opsWO0WwTaXCjiHjmge7mWuH5WwEd5Kn70:17888:0:99
Стало: provproxy::17888:0:99
Права на каталог надо установить в 700 (полный доступ для пользователя provproxy):
chmod 700 /home/provproxy

Можно не пользоваться интерактивным скриптом, а сделать все с помощью базовых команд:
1. Добавить пользователя
useradd -g proxy -d /home/provproxy -s /bin/false provproxy

где:
-g proxy группа пользователя (ранее созданная proxy)
-d /home/provproxy домашний каталог пользователя
-s /bin/false — оболочка для пользователя. Обычно здесь прописывается /bin/sh, /bin/bash для интерактивных пользователей, или /bin/false для неинтерактивных, что нам и надо в данном случае.
Строчка /bin/false должна быть в файле /etc/shells — если ее нет, дописать.

2. Создаем домашний каталог:
mkdir /home/provproxy
3. Меняем владельца каталога на пользователя provproxy
chown provproxy:proxy /home/provproxy
4. Меняем права доступа на каталог:
chmod 700 /home/provproxy

Инициализационный скрипт tinyproxy

Был подробно описан в этой заметке: Запускающий скрипт для tinyproxy Копия

Сам скрипт:
— На PasteBin
На GitHub
Скачать с Mega.nz

Поскольку сам инициализационный скрипт описан довольно полно, то я остановлюсь лишь на двух важных моментах.

PID-файл: в скрипте необходимо правильно указать путь к PID-файлу, но об этом поговорим ниже. У меня PID-файл создается в домашнем каталоге пользователя provproxy. Местоположение PID-файла задается в этой строке скрипта. Если надо, не забудьте исправить на свое значение:

PIDFILE="/home/provproxy/tinyproxy.pid"

Команда запуска прокси-сервера:
По умолчанию там просто указан путь к исполняемому файлу tinyproxy:

TINYPROXYCMD="/usr/sbin/tinyproxy"

Но я хочу эту команду немного подправить.

Запуск сервера при старте системы.

При старте системы все обычно запускается от root‘а, а нам не надо совершенно, чтоб под root‘ом крутились всякие там сервера. Не зря же мы отдельного пользователя делали. Дополняем команду:

TINYPROXYCMD="sudo -u provproxy /usr/sbin/tinyproxy"

В таком виде, скрипт, запускаемый при старте из-под root‘а вызовет tinyproxy от имени нужного нам пользователя. Справедливости ради, надо заметить, что tinyproxy, как любой уважающий себя сервер, умеет сам себе понижать права до определенного пользователя, указанного в файле конфигурации. Но на этом остановимся ниже. На мой взгляд, одно другому не мешает, зато так виднее и жестко задано, от какого пользователя стартовать.

Альтернативный файл конфигурации.

По умолчанию tinyproxy ищет свой файл конфигурации в /etc/tinyproxy.conf, но можно задать альтернативный, в домашнем каталоге пользователя. Делается это путем добавления ключа и пути к файлу. Объединю этот вариант с предыдущим:

TINYPROXYCMD="sudo -u provproxy /usr/sbin/tinyproxy -c /home/provproxy/tinyproxy.conf"

Альтернативный конфигурационный файл в домашнем каталоге.

Раз уж началось с альтернативного файла конфигурации, так давайте его сделаем (от root). Копируем файл /etc/tinyproxy.conf в /home/provproxy/tinyproxy.conf

cp /etc/tinyproxy.conf /home/provproxy/tinyproxy.conf

Далее устанавливаем ему владельца (можно перейти в директорию /home/provproxy перед этим, я перешел — пути будут неполные):

chown provproxy:proxy tinyproxy.conf

И права — пользователю provproxy на tinyproxy.conf нужны права только на чтение, ничего он не пишет в конфигурационный файл, и тем более не пытается исполнить.

chmod 400 tinyproxy.conf

Конфигурирование.

Открываем файл от root‘а и настраиваем параметры прокси-сервера.

Подробно описывается конфингурационный файл

Проверка

Прописываем нужный адрес прокси в браузере:

Проверяем соединение:

Вот тут не показывается, что используется прокси, потому что прокси настроен верно — с отключением via и других заголовков, передающих IP-адрес.

Источники

Tinyproxy, краткая инструкция

Сетевые namespace’ы Linux, отдельные конфигурации для каждого namespace.

Это заметка от моего собственного склероза, потому что мелочи иногда забываю.
Для общей информации, что такое этот самый сетевой неймспейс. Это такая хитрая фиговина в ядре Linux, которая позволяет на одной машине с одной сетевой картой соединяться с сетью, будто у вас вагон и маленькая тележка этих сетевых карт (соответственно, куча локальных IP), можно, например, на одном неймспейсе поднять VPN до одного провайдера, на втором — до второго, на третьем — коннектиться к основному, и т.д.

Network namespace — это логически отделенный от других стек сетевых протоколов в Linux. Такая себе контейнерная виртуализация для сетевых интервейсов, когда chroot LXC и нужна виртуализация только сетевых интерфейсов. Эмулируется полностью сетевой стек: сетевые интерфейсы, таблица маршрутизации, файрволл и т.д. Так, как это работает на уровне ядра и для определенных процессов, то вполне можно получить рабочую конфигурации, когда на одной машине есть несколько сетевых интерфейсов с одинаковыми IP-адресами и ничто не конфликтует.
Хочу по этим штуковинам написать большой материал, как мы их у себя сконфигурировали и развели с одного сервера целый пул доступа к разным VPN-провайдерам, но руки не доходят. Поэтому да, заметка от склероза.

Каждому из нэймспейсов можно подсунуть свою конфигурацию сети, свои конфигурационные файлы (resolv.conf, hosts)

Для этого достаточно положить соответствующие файлы в директорию /etc/netns/имя_namespace, например, для гипотетического namespace с именем riseupvpnns это будет каталог /etc/netns/riseupvpnns, туда можно положить, например, resolv.conf, прописать необходимые DNS, и эта конфигурация будет влиять только на данный namespace, в независимости, что там в основной системе прописано.

Linux, curl, обнаружение и анализ ошибок HTTP. Улучшаем скрипт.

В первой части я показал, как просто обнаружить ошибки HTTP при работе с curl. Но на самом деле, подход, использованный в скрипте, немного неправильный:

Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. В настоящее время выделено пять классов кодов состояния.

Т.е. объясняя по рабоче-крестьянски, не только код 200 может свидетельствовать об успешном завершении запроса, а другие коды, кроме явных клиентских или серверных ошибок, могут требовать от нас каких-либо действий.

Вообще, коды ответа HTTP разделены на 5 классов:
1xx — информационные
2xx — успешное завершение
3xx — требуется переопределение
4xx — ошибка, допущенная со стороны клиента
5xx — ошибка, допущенная со стороны сервера

Вот и модифицируем наш скрипт в соответствии со стандартом.
В общем, надо из кода ответа HTTP извлечь первую цифру, и, соответственно прореагировать. Привожу часть скрипта, ответственного за более подробную реакцию на код ответа HTTP:

curl -o $SAVEFILE $1 -D $HEADERDUMP >/dev/null 2>/dev/null
EXITCODE=$?
if [ $EXITCODE -ne 0 ]; then
    echo "CURL error $EXITCODE"
else
    HTTPSTATUS=`cat $HEADERDUMP|head -1|awk '{print $2}'` #get HTTP status code
    HTTPSTATUSMESS=`cat $HEADERDUMP|head -1|cut -d '  ' -f 3-
    HTTPSTATUSID=`echo $HTTPSTATUS|cut -c 1` #get first char status code
    
    case "$HTTPSTATUSID" in
	1 ) echo -n "Informational: ";;
	2 ) echo -n "Success: ";;
	3 ) echo -n "Redirection: ";;
	4 ) echo -n "Client Error: ";;
	5 ) echo -n "Server Error: ";;
	* ) echo -n "Unknow status: ";;
    esac
    
    echo "$HTTPSTATUS $HTTPSTATUSMESS"
fi


Жирным шрифтом выделена строка, в которой мы получаем этот самый класс кода возврата.

Курсивом — строка, где мы получаем пояснения текстовые пояснения к коду ответа.

Используемая в процессе анализа утилита cut, в первом случае, позволяет нам вывести в переменную все символы после с третьего пробела.
Перед первым у нас версия протокола http, потом код ошибки, а потом пояснение, которое может содержать несколько пробелов, поэтому awk тут не подходит.
cut так же может работать с текстовыми данными, в которых есть разделители, например пробелы, или же с отдельными символами, как в той строке кода, что выделена жирным — так мы можем извлечь первую цифру из кода ответа.

Дальнейший анализ осуществляется с помощью оператора case

Пример работы

Скрипты

Расширенный анализ кодов состояния HTTP:
На Pastebin
На Github

PHP скрипт для проверки:
На Pastebin
На Github

Дополнительные источники

Краткий справочник по командам curl и wget Копия
Утилита cut
Коды статуса HTTP
Оператор case

Начало

curl в Linux, ошибка 404, обнаружение и использование кодов ответа HTTP

Итак, возникла следующая задача — определить, когда curl получил вменяемые данные от http-сервера, а когда нет. В общем, и самом распространенном случае, задача сводится к тому, чтобы определить, отдал ли нам сервер запрашиваемый файл, или отобразил «страница не найдена».

Впрочем, это работает и для других возможных кодов ответа.

Ясно, что сервер, на наш запрос GET может ответить, как возвратив нам запрашиваемую страницу, так и отправив код, например, 404 (не найдено), и возвратив страницу-заглушку для этого случая. Так вот, на уровне скрипта bash или скрипта php необходимо проанализировать ответ сервера, чтобы не выдать пользователю вместо ожидаемых данных, всяческую лабуду. Далее я рассматриваю исключительно консольную Linux-утилиту curl. Для php, синтаксис, по-моему, отличается.

Есть страница, которую мы хотим получить: http://example.org/page.html, сохранить ее в файл page.html и есть curl, команда будет такая:

curl -o "page.html" http://example.org/page.html

Если страница на месте, то мы получим ее, и ничего анализировать не требуется.
Если же нет, то от большинства web-серверов мы получим страницу-заглушку, например такую, но никакой ошибки при этом.

Как же быть:

Проверяем код ошибки самого curl, если нет связи с сетью, URL неправильный, или задан неподдерживаемый curl протокол, если так, то мы получим соответствующий код возврата, наподобие:

curl: (1) Protocol htt not supported or disabled in libcurl

А вот если адрес правильный, и никакой ошибки в адресе или соединении нет, то код возврата не сработает, нам самим придется думать дальше.

Надо получить код ответа HTTP!

Сделать это можно, если получить отдельно заголовки ответа сервера, и после их проанализировать. Благо, для этого никакого страшного колдунства не требуется, достаточно указать утилите curl опцию -D (т.е. dump) и файл, куда выгружать заголовки.

Покажу это на примере конкретного скрипта:

#!/bin/bash

HEADERDUMP="/tmp/headerdump.txt"
SAVEFILE="/tmp/httpfile"
HTTPSTATUS=""

curl -o $SAVEFILE $1 -D $HEADERDUMP >/dev/null 2>/dev/null
EXITCODE=$?
if [ $EXITCODE -ne 0 ]; then
    echo "CURL error $EXITCODE"
else
    HTTPSTATUS=`cat $HEADERDUMP|head -1|awk '{print $2}'`
    
    if [ "$HTTPSTATUS" == "200" ];then
	echo "OK"
    else
	echo "HTTP error $HTTPSTATUS"
    fi
fi

заводим 3 переменные

HEADERDUMP="/tmp/headerdump.txt" — файл, в который будем получать заголовки
SAVEFILE="/tmp/httpfile" — файл с сервера, который мы хотим получить
HTTPSTATUS="" — переменная для статуса (состояния) HTTP

curl -o $SAVEFILE $1 -D $HEADERDUM

пытаемся скачать нужный файл (получить страницу):
-o «имя_файла» — куда сохранять результат
$1 — внутренняя переменная, первый параметр скрипта, при вызове его с командной строки. В своем скрипте надо заменить на свой случай.
можно добавить >/dev/null 2>/dev/null — для красоты, чтоб не вылезали сообщения о процессе и ошибках.

-D <файл> — файл, куда будем копировать заголовки

Файл headerdump.txt выглядит примерно так:

HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Fri, 30 Mar 2018 00:17:23 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.33
Link: ; rel="https://api.w.org/"
Set-Cookie: quick_chat_alias=Anon_240883; path=/
Upgrade: h2,h2c
Vary: Accept-Encoding,User-Agent

В первой строке — интересующая нас информация. Версия протокола (не интересно), код ответа (вот он) и информационное сообщение (не особо надо).

Вычленяем код:

HTTPSTATUS=`cat $HEADERDUMP|head -1|awk '{print $2}'`

1. Берем первую строчку (head -1)
2. Сохраняем в переменную 2-е значение после пробела (разделитель пробел): awk '{print $2}'

Дальше можно анализировать:

    if [ "$HTTPSTATUS" == "200" ];then
	echo "OK"
    else
	echo "HTTP error $HTTPSTATUS"
    fi

Результат

Также, впрочем, можно поступить и для анализа запросов POST, вот тестовый скрипт php для отладки подобных возможностей и скрипт bash

Скачать

Пример с запросом GET
Пример с запросом GET на Гитхаб

Пример с запросом POST
Пример с запросом POST на Гитхаб

Тестовый php скрипт для запроса POST
На Гитхаб

Скачать одним архивом

PC-speaker в Linux, или как сделать beep из консоли встроенным динамиком ПК

Еще со времен DOS можно было свистеть, гудеть и пикать встроенным динамиком компьютера, и даже симфонии играть. Сейчас это особо не нужно, ибо везде звуковые карты, динамики и прочая мультимедия. Но иногда PC-speaker нужная и полезная вещь, способная сигнализировать о чем либо, например, о разрыве соединения с Интернетом на домашнем сервере, к которому не подключен монитор, или о том, что торрент докачался. Да и вообще, способов, как можно применить спикер — множество. Даже симфонии можно играть.

Включение динамика

Зачастую, PC-speaker в линуксе отключен, точнее, не загружен модуль ядра, который им управляет. Обычно это модуль pcspkr, хотя, в некоторых источниках написано, что может быть и другой модуль snd-pcsp. У меня оказался первый.
Проверить, загружен ли соответствующий модуль ядра можно командами
lsmod |grep pcspkr и lsmod |grep snd-pcsp соответственно.
Если команда ничего не выдала, то модуль не загружен.
Если выдала что-то похожее, значит, модуль загружен:

>lsmod |grep pcspkr
pcspkr                  1448  0

Если модуль не загружен, нужно попробовать его загрузить:

modprobe pcspkr
или
modprobe snd-pcsp

Если команда не выдала ошибки, модуль загружен. Можно проверить с помощью команды lsmod. Если случилась ошибка, то печально. Модуль, скорее всего, придется собирать. Ну, или не так печально, а даже наоборот — модуль встроен в ядро, и PC-speaker по умолчанию включен. Попробуйте простой beep.

Простой beep

Для простого beep достаточно отправить на консоль символ с кодом 007, ASCII-символ BEL

echo -ne '\007'

Способ может не сработать из SSH-терминала, либо из терминала X. Терминал SSH «булькнет» не на удаленном компьютере, а на локальном, а X-server может перенаправить beep на колонки, вместо PC-speaker’a

Утилита beep

Простые звуки и даже целые мелодии можно играть на спикере утилитой beep.
На рабочей машине она уже была в комплекте ОС, на Ubuntu ее можно установить командой apt-get install beep, а в Slackware она ставится через Sbopkg
Проект имеется на Github, можно собрать и из исходников

Примеры вызова:

beep

Без параметров издаст стандартный beep

beep -f 500 -l 1000

Выдаст звук частотой 500 Гц, продолжительностью 1 секунду (1000 миллисекунд)

Пример скрипта, играющего тему Die Gedanken Sind Frei из ролика в начале заметки.

Ссылки

Больше мелодий и ссылок на готовые скрипты Копия
How do I make my pc speaker beep. Еще больше про то, как можно пискнуть спикером.

Beep Music Demo или мелодии на PC-Speaker

С помощью утилиты beep под Linux


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты


Прямая ссылка
Скачать скрипты

Скачать весь архив
Скрипты взяты отсюда

Бесплатный VPN от riseup.net. Часть 3.

Настройка на другом компьютере с Linux

Как следует из ранее изложенного, ничего сверхъестественного не обнаружилось, и для того, чтобы воспользоваться этим VPN, требовательный к железу Debian 9 x64 не нужен совершенно. Bitmask тоже не нужен. Проблемы могут возникнуть разве что с виндой, а вот с линуксов вполне можно раздавать VPN-интернет на другие устройства в локальной сети, в т.ч. и на виндовые компьютеры. Без bitmask это даже лучше получается, поскольку он пакостит в iptables. Пакостит, правда, для «более лучшей» защиты пользователя. Но в данном случае получается, как у Черномырдина — хотели как лучше, получилось как всегда.

Конфигурация Openvpn

Первым делом надо составить конфиг для Openvpn. Не буду каждый параметр пояснять, а ссылка на сами конфиги есть в конце заметки. Вроде составил правильно, по ранее извлеченным параметрам Openvpn. Единственное что добавил от себя, это запуск пользовательских скриптов — параметры script-security 2, разрешающий оный запуск, и параметры up '/путь/к/скрипту up' и down '/путь/к/скрипту down', указывающие Openvpn, какой скрипт надо запускать при, соответственно, установке и разрыве соединения.

Про подобные скрипты я совсем недавно упоминал.

Сертификаты

Получены в прошлой части.

Пользовательский скрипт настройки соединения.

Переделывался из ранее приведенного примера с небольшими изменениями:

#!/bin/bash

#заводим человеческие переменные

MAIN_STAT=$1 #up/down
DEV_NAME=$2
TUN_MTU=$3
LINK_MTU=$4
LOCAL_IP=$5
REMOTE_IP=$6
ADD_STAT=$7 #init/restart

#путь к ip и iptables
ACPATH="/usr/sbin/"

# [...]

#соединение поднялось
if [ "$MAIN_STAT" = "up" ]; then
	#установка маршрута по умолчанию
    "$ACPATH"ip route del default #удаление старого
	#установка нового
	#именно так, локальный ip и удаленный - один и тот же
	#особенность провайдера Oo
    "$ACPATH"ip route add default via $LOCAL_IP dev $DEV_NAME src $LOCAL_IP
    
     #разрешение транзитного трафика
	"$ACPATH"iptables -P FORWARD ACCEPT
    
    #установка адреса DNS-сервера
    echo "nameserver 10.42.0.1">/etc/resolv.conf
    exit
fi

#соединение разорвано
if [ "$MAIN_STAT" = "down" ]; then
    #запрет транзитного трафика
    "$ACPATH"iptables -P FORWARD DROP 
    #установка маршрута по умолчанию без VPN
	"$ACPATH"ip route del default
    "$ACPATH"ip route add default via 10.10.1.1 dev eth1 src 10.10.20.55
    
    #восстанавление адресов DNS по умолчанию
    echo "nameserver 8.8.8.8">/etc/resolv.conf
    echo "nameserver 8.8.4.4">>/etc/resolv.conf
fi

Основная особенность в том, что сервер, вместо REMOTE_IP, передает маску подсети, а чтобы маршрутизация осуществлялась правильно, вместо удаленного IP надо прописать выданный сервером локальный.

Долго с этим разбирался, т.к. поначалу был глюк — транзитный трафик проходил, а вот локальный нет. Помог выхлоп ifconfig:

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.42.0.2 netmask 255.255.248.0 destination 10.42.0.2
inet6 2001:db8:123::1000 prefixlen 64 scopeid 0x0
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 982346 bytes 1307345786 (1.2 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 541554 bytes 27027659 (25.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Вторая важная особенность — надо прописать правильный DNS.
И не забыть передать его клиентам, если компьютер используется в качестве PPTP- или другого VPN-сервера.

ЗЫ. Если будете пользоваться сервисом riseup.net, по возможности донатьте, хорошее дело ребята делают. Фиг где в мире встретишь таких альтруистов.

Ссылки

Предыдущие части заметки

Часть 1. копия
Часть 2. копия
Скачать все в PDF

Конфиги

На моем сайте копия

На PasteBin:
Голландия
Канада
США

Скачать с Mega.nz

Скрипт настройки сети

На PasteBin
Скачать с Mega.nz

Riseup

http://riseup.net
Регистрация Riseup Black
О Riseup
Донат

Bitmask

http://bitmask.net
http://leap.se

Загрузка Puppy Slacko по сети

Puppy по сети грузится, но с некоторыми проблемами. А именно, для полноценной загрузки ОС требуется файл puppy_slacko_X.X.sfs, содержащий основные файлы ОС.
Этот файл сам по себе по сети не подгружается. Можно, конечно, подшаманить в initrd и сделать так, чтоб файл подтягивался по tftp или с расшаренной папки, но это довольно нетривиально.
Есть другой способ — записать в initrd главный sfs. Правда, initrd раздуется от этого (аж до 150 Мб с гаком) и на совсем слабых машинах Slacko не загрузится. Но 512 Мб оперативки вполне хватает. Тестировано на селероне 1.7 с 512 Мб ОП.

Мы нашли на murga-linux скрипт, который автоматизирует данный процесс. Ссылки на оригинал не будет, т.к. никто уже не помнит, где качали. 🙂

Скрипт на PasteBin
Скачать с Mega.nz