Запуск Django-проекта на nginx с gunicorn в Arch Linux и с БД PostgreSQL

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

1
2
3
4
5
6
7
8
sudo pacman -S python2-pip
sudo pip2 install virtualenv virtualenvwrapper
mkdir ~/Env
echo "export WORKON_HOME=~/Env" >> ~/.bashrc
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2" >> ~/.bashrc
echo "source /usr/bin/virtualenvwrapper.sh" >> ~/.bashrc
source ~/.bashrc
mkvirtualenv firstsite

Из-под виртуального окружения (в которое мы попадаем после mkvirtualenv) ставим необходимые модули и создаем Django-проект:

1
2
3
pip install django psycopg2 gunicorn
cd ~
django-admin startproject firstsite

Далее правим настройки проекта:

1
nano ~/firstsite/firstsite/settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ...
ALLOWED_HOSTS = ['доменные_имена', 'и/или_ip-адрес_проекта']
# ...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'имя_бд',
        'USER': 'имя_пользователя_бд',
        'PASSWORD': 'пароль_пользователя_бд',
        'HOST': 'localhost',
        'PORT': '',
    }
}
# ...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# ...

Выходим из виртуального окружения:

1
deactivate

Ставим БД PostgreSQL:

1
sudo pacman -S postgresql

Создаем БД для проекта:

1
sudo -u postgres psql
1
2
3
4
5
6
7
CREATE DATABASE имя_бд;
CREATE USER имя_пользователя_бд WITH PASSWORD "пароль_пользователя_бд";
ALTER ROLE имя_пользователя_бд SET client_encoding TO 'utf8';
ALTER ROLE имя_пользователя_бд SET default_transaction_isolation TO 'read committed';
ALTER ROLE имя_пользователя_бд SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE имя_бд TO имя_пользователя_бд;
\q

Возвращаемся в виртуальное окружение:

1
workon firstsite

Из-под него продолжаем развертывание проекта:

1
2
3
4
cd ~/firstsite
./manage.py migrate
./manage.py createsuperuser
./manage.py collectstatic

Проверяем, не допустили ли где ошибку или не пропустили ли чего:

1
./manage.py runserver 0.0.0.0:8000

Открываем в браузере ip-адрес_нашего_проекта:8000 (главное не забыть указать его в ALLOWED_HOSTS в settings.py):

Выходим из виртуального окружения:

1
deactivate

Ставим nginx:

1
sudo pacman -S nginx

Создаем каталог для конфигов виртуалхостов:

1
sudo mkdir /etc/nginx/conf.d/

И создаем там конфиг для нашего проекта:

1
nano /etc/nginx/conf.d/firstsite.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
    listen 80;
    server_name доменное_имя_проекта www.доменное_имя_проекта;
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    location /static/ {
        root /home/<username>/firstsite;
    }
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/home/<username>/firstsite/firstsite.sock;
    }
}

Указываем nginx’у читать все конфиги из новосозданного каталога:

1
sudo nano /etc/nginx/nginx.conf
1
2
3
4
...
    http {
        include /etc/nginx/conf.d/*.conf;
...

Создаем systemd-юнит для gunicorn:

1
sudo nano /etc/systemd/system/gunicorn-firstsite.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Gunicorn service for firstsite
After=network.target
[Service]
User=<username>
Group=http
WorkingDirectory=/home/<username>/firstsite
ExecStart=/home/<username>/Env/firstsite/bin/gunicorn --workers 3 --bind unix:/home/<username>/firstsite/firstsite.sock firstsite.wsgi:application
[Install]
WantedBy=multi-users.target

Активируем и запускаем gunicorn-юнит и nginx:

1
2
3
4
sudo systemctl enable gunicorn-firstsite
sudo systemctl start gunicorn-firstsite
sudo systemctl enable nginx
sudo systemctl start nginx

Проверяем в браузере:

Работает. Вот и славно!

Рубрика: it | Метки: , , , , | Оставить комментарий

Получение root-прав на планшете с Rockchip RK3066

Некоторое время назад приобрел планшет Mystery MID-722 и, естественно, столкнулся с недостатком места на внутреннем накопителе. Дополнительная SD-карта для музыки, видео, книг и всякого такого пригодилась, но вот кэш и данные программ на нее не поместишь просто так (внутрення карта монтировалась как /mnt/sdcard, внешняя же как /mnt/external_sd). Любой из способов, будь то перемонтирование/симлинки/изменение fstab, требовал наличия root-прав.
Никакое из приложений для самого устройства результата никакого не принесли. Решено было подключить планшет к компьютеру, включить отладку через USB и root’ать.
На домашней машине Windows 7 x64. Скачал необходимые драйвера, Android SDK, программу UnlockRoot. Все установилось, но, руки наверное кривые, результата так же не принесло. Вроде и система железяку видит, и все необходимое на планшете включено, а анлокер не видит. Ну, думаю, на работе поставлю Windows XP x32 в виртуальную машину, проброшу на нее USB и буду пробовать там. Что и сделал. С тем же результатом. Также попробовал, помимо UnlockRoot, iRoot и ERoot. Также безрезультатно.
Нашел несколько советов как из под GNU/Linux получить root-права на планшете. Воспользовался и получил.

Сначала необходимо поставить пакет android-tools-adb. Поскольку у меня Linux Mint, то:

1
sudo apt-get install android-tools-adb

Решил посмотреть есть ли поддержка «из коробки» моего планшета. Несколько ранее, играясь под Windows, выписал Vendor ID планшета (2207). Посмотрел:

1
sudo grep 2207 /etc/udev/rules.d/51-android.rules

Увы. Ну и ладно. Добавил необходимую строку в /etc/udev/rules.d/51-android.rules:

1
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666", GROUP="plugdev"

Добавил своего пользователя в группу plugdev:

1
useradd -G plugdev poloniumv

Перезагрузил правила доступа к USB:

1
sudo udevadm control --reload-rules

Добавил Vendor ID своего планшета в конфиг adb:

1
echo "0x2207" >> ~/.android/adb_usb.ini

И перезапустил сервер adb:

1
adb kill-server; adb start-server

Список подключенных устройств порадовал наличием в нем планшета:

1
2
3
adb devices
List of devices attached
NCGS6PZX0N device

Подключил планшет USB-кабелем к ноутбуку и включил отладку по USB. Далее скачал архив (на случай 404) с набором необходимых бинарников и пакетов: su, SuperSU, busybox, RootExplorer и распаковал в отдельный каталог.

Перейдя в этот каталог начал получать root’а:

1
2
3
adb shell mv /data/local/tmp /data/local/tmp.bak
adb shell ln -s /data /data/local/tmp
adb reboot

После перезагрузки планшета (первой из трех), продолжил:

1
2
3
adb shell rm /data/local.prop > nul
adb shell "echo \"ro.kernel.qemu=1\" > /data/local.prop
adb reboot

Перезагрузка (вторая из трех) завершилась, проверил, от root’а ли я сейчас буду заливать необходимые бинарники да пакеты и «човнить» да «чмодить» 🙂

1
2
adb shell id
uid=0(root) gid=0(root)

Удовлетворенный результатом, продолжил:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
adb remount
adb push su /system/bin/su
adb shell chown root.shell /system/bin/su
adb shell chmod 6755 /system/bin/su
adb push busybox /system/bin/busybox
adb shell chown root.shell /system/bin/busybox
adb shell chmod 0755 /system/bin/busybox
adb push SuperSU.apk /system/app/SuperSU.apk
adb chown root.root /system/app/SuperSU.apk
adb chmod 0644 /system/app/SuperSU.apk
adb push RootExplorer.apk /system/app/RootExplorer.apk
adb chown root.root /system/app/RootExplorer.apk
adb chmod 0644 /system/app/RootExplorer.apk
adb shell rm /data/local.prop
adb shell rm /data/local/tmp
adb shell mv /data/local/tmp.bak /data/local/tmp
adb reboot

После перезагрузки запустил SuperSU и обрадовался — получилось!

Рубрика: it | Метки: , , | Оставить комментарий

Ноутбук с CentOS как точка доступа

После приобретения смартфона возникла идея использовать Wi-Fi карту рабочего ноутбука (Qualcomm Atheros AR242x / AR542x Wireless Network Adapter) как точку доступа. Дело нехитрое.

Ставим dhcpd:

1
yum install dhcp

Правим конфиг /etc/dhcp/dhcpd.conf. У меня он выглядит так:

1
2
3
4
5
6
7
8
9
10
11
default-lease-time 3600;
max-lease-time 9000;
authoritative;
log-facility local7;
subnet 192.168.11.0 netmask 255.255.255.0 {
    interface wlan0;
    range 192.168.11.2 192.168.11.255;
    option domain-name-servers 95.169.2.106;
    option routers 192.168.11.1;
    option broadcast-address 192.168.11.0;
}

Поднимаем интерфейс wlan0 и вешаем на него IP-адрес в соответствии с указанным в /etc/dhcp/dhcpd.conf:

1
2
3
ifconfig wlan0 down
ifconfig wlan0 192.168.11.1/24 up
ifconfig wlan0 up

Включаем форвардинг и NAT:

1
2
3
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables --flush
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Запускаем dhcpd:

1
/etc/init.d/dhcpd start

Ставим программную точку доступа hostapd. Тут есть два варината: первый — ставить из репозиториев, второй — собирать с исходников. Я выбрал второй вариант, т. к., почему-то, в репозиториях была сборка без поддержки драйвера nl80211.

1
2
3
4
5
cd /usr/src
wget http://w1.fi/releases/hostapd-2.1.tar.gz
tar -xvf hostapd-2.1.tar.gz
cd hostapd-2.1/hostapd
cp defconfig .config

Убеждаемся, что строка CONFIG_DRIVER_NL80211=y присутствует в файле .config и собираем hostapd:

1
make install clean

Создаем конфиг /etc/hostapd/hostapd.conf:

1
2
3
4
5
6
7
8
9
10
11
interface=wlan0
driver=nl80211
ssid=имя_сети
country_code=RU
hw_mode=g
channel=11 # Канал на ваше усмотрение. У меня это 11-ый.
macaddr_acl=0
wpa=3
wpa_key_mgmt=WPA-PSK
wpa_passphrase=ключ
wpa_pairwise=TKIP CCMP

Ну а чтобы все автоматом стартовало, добавляем нижеследующее в /etc/rc.local (привычка еще с FreeBSD):

1
2
3
4
5
6
7
/sbin/iptables --flush
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig wlan0 192.168.11.1/24 up
ifconfig wlan0 up
/etc/init.d/dhcpd start
hostapd /etc/hostapd/hostapd.conf &

Рубрика: it | Метки: , , , | Оставить комментарий

Обновление IOS через tftp

Привезли маршрутизатор Cisco 2811 и дали указание залить более новый IOS. Ок, сделаем. Поднял на ноутбуке (стоит xubuntu 11.04) tftp-сервер:

1
sudo apt-get install tftpd-hpa

Потом привел /etc/default/tftpd-hpa в такой вид:

1
2
3
4
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="10.0.1.195:69"
TFTP_OPTIONS="-p -v -v -v -c -s"

Дальше перезапустил tftpd:

1
sudo /etc/init.d/tftpd-hpa restart

На самом маршрутизаторе поставил IP-адрес из своей внутренней сетки:

1
2
3
4
5
2811#conf t
2811(config)#int Fa0/0
2811(config-if)#no shut
2811(config-if)#ip address 10.0.1.102 255.255.255.252
2811(config-if)#end

Посмотрел, под каким именем лежит IOS на флешке:

1
2
3
4
5
6
7
2811#sh flash
CompactFlash directory:
File Length Name/status
1 59374168 c2800nm-adventerprisek9-mz.124-24.T.bin
[59374232 bytes used, 4851044 available, 64225276 total]
62720K bytes of ATA CompactFlash (Read/Write)

После этого, на всякий случай, сохранил предыдущий IOS на ноутбук:

1
2
3
4
5
6
2811#copy flash tftp
Source filename [c2800nm-adventerprisek9-mz.124-24.T.bin]?
Address or name of remote host []? 10.0.1.195
Destination filename [c2800nm-adventerprisek9-mz.124-24.T.bin]?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
59374168 bytes copied in 228.896 secs (259394 bytes/sec)

Удалил его:

1
2
3
4
5
6
7
8
9
10
2811#delete flash:c2800nm-adventerprisek9-mz.124-24.T.bin
Delete filename [c2800nm-adventerprisek9-mz.124-24.T.bin]?
Delete flash:c2800nm-adventerprisek9-mz.124-24.T.bin? [confirm]
2811#show flash
CompactFlash directory:
File Length Name/status
1 59374168 c2800nm-adventerprisek9-mz.124-24.T.bin [deleted]
[59374232 bytes used, 4851044 available, 64225276 total]
62720K bytes of ATA CompactFlash (Read/Write)

И залил новый:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Destination filename [c2800nm-adventerprisek9-mz.124-25f.bin]?
Erase flash: before copying? [confirm]
Erasing the flash filesystem will remove all files! Continue? [confirm]
Erasing device... eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee ...erased
Erase of flash: complete
Loading c2800nm-adventerprisek9-mz.124-25f.bin from 10.0.1.195 (via FastEthernet0/0): !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[OK - 39866256 bytes]
Verifying checksum... CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC OK (0xB9E)
39866256 bytes copied in 502.632 secs (79315 bytes/sec)
2811#sh flash
CompactFlash directory:
File Length Name/status
1 39866256 c2800nm-adventerprisek9-mz.124-25f.bin
[39866320 bytes used, 24358956 available, 64225276 total]
62720K bytes of ATA CompactFlash (Read/Write)

И, под конец, указал системе, что надо грузить именно этот IOS, сохранил конфигурацию и перезагрузил маршрутизатор:

1
2
3
4
5
6
7
8
9
2811#conf t
2811(config)#boot system flash:c2800nm-adventerprisek9-mz.124-25f.bin
2811(config)#end
2811#wr me
Building configuration...
[OK]
2811#reload
Proceed with reload? [confirm]
Рубрика: it | Метки: , , | Оставить комментарий

Подвисшие PPtP-сессии в mpd5

После перезагрузки сервера, на котором установлены mpd5 и FreeRADIUS, клиентам, которые коннектятся по PPtP начала вылетать ошибка 691, при том, что логин/пароль и параметры безопасности были введены правильно. В radius.log’е была куча таких сообщений:

1
Tue Jul 24 10:34:33 2012 : Auth: Multiple logins (max 1) [MPP attempt]: [vpnlogin/] (from client localhost port 4 cli )

Похоже, подвисли сессии. Решилось просто: командой radwho получил список сессий, а командой radzap их прибил. После этого все стало хорошо 🙂

Рубрика: it | Метки: , , , , | Оставить комментарий

Передача BGP-префиксов на Cisco

Дано: два апстрима, от одного из которых я принимаю full-view (World), от второго только украинские префиксы (UA).
Задача: отдать default route и, отдельно, украинские префиксы пиру Target и принять и проанонсить его префиксы аплинкам. Украинский трафик, естественно, должен ходить через UA, остальной через World.

Решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
interface GigabitEthernet1/1
 switchport
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10
 switchport mode trunk
 switchport nonegotiate
!
interface GigabitEthernet1/2
 switchport
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 20
 switchport mode trunk
 switchport nonegotiate
!
interface GigabitEthernet1/3
 switchport
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 30,40
 switchport mode trunk
 switchport nonegotiate
!
interface Vlan10
 ip address 1.1.1.2 255.255.255.252
 ip policy route-map World-map
!
interface Vlan20
 ip address 2.2.2.2 255.255.255.252
 ip policy route-map UA-map
!
interface Vlan30
 ip address 3.3.3.1 255.255.255.252
!
interface Vlan40
 ip address 4.4.4.1 255.255.255.252
!
router bgp 1234
 no synchronization
 bgp router-id 1.1.1.2
 bgp log-neighbor-changes
 neighbor 1.1.1.1 remote-as 1111
 neighbor 1.1.1.1 send-community
 neighbor 1.1.1.1 soft-reconfiguration inbound
 neighbor 1.1.1.1 route-map World-in in
 neighbor 1.1.1.1 route-map World-out out
 neighbor 2.2.2.2 remote-as 2222
 neighbor 2.2.2.2 send-community
 neighbor 2.2.2.2 soft-reconfiguration inbound
 neighbor 2.2.2.2 route-map UA-in in
 neighbor 2.2.2.2 route-map UA-out out
 neighbor 3.3.3.3 remote-as 3333
 neighbor 3.3.3.3 send-community
 neighbor 3.3.3.3 default-originate
 neighbor 3.3.3.3 soft-reconfiguration inbound
 neighbor 3.3.3.3 route-map Customer-in in
 neighbor 3.3.3.3 route-map Customer-World-out out
 neighbor 4.4.4.4 remote-as 3333
 neighbor 4.4.4.4 send-community
 neighbor 4.4.4.4 soft-reconfiguration inbound
 neighbor 4.4.4.4 route-map Customer-in in
 neighbor 4.4.4.4 route-map Customer-UA-out out
 no auto-summary
!
ip community-list expanded UA permit 1234:3
!
ip prefix-list Customer-prefs seq 1 permit 30.30.30.0/19
ip prefix-list Customer-prefs seq 2 permit 31.31.31.0/21
ip prefix-list Customer-prefs seq 3 permit 32.32.32.0/24
!
ip access-list expanded Customer
 permit ip any 30.30.30.0 0.0.31.255
 permit ip any 31.31.31.0 0.0.7.255
 permit ip any 32.32.32.0 0.0.0.255
!
ip prefix-list default seq 1 permit 0.0.0.0/0
!
route-map World-map permit 1
 match ip address Customer
 set ip next-hop 3.3.3.3
!
route-map UA-map permit 1
 match ip address Customer
 set ip next-hop 4.4.4.4
!
route-map World-in permit 1
!
route-map World-out permit 1
 match ip address prefix-list Customer-prefs
!
route-map UA-in permit 1
 set community 1234:3
!
route-map UA-out permit 1
 match ip address prefix-list Customer-prefs
!
route-map Customer-in permit 1
 match ip address prefix-list Customer-prefs
!
route-map Customer-in deny 2
!
route-map Customer-World-out permit 1
 match ip address prefix-list default
!
route-map Customer-World-out deny 2
!
route-map Customer-UA-out deny 1
 match ip address prefix-list default
!
route-map Customer-UA-out permit 2
 match community UA
!
route-map Customer-UA-out deny 3
!
Рубрика: it | Метки: , , , | Оставить комментарий

Ограничение скорости внутри VLAN на Cisco

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mls qos
class-map match-any CustomerVLAN
 match access-group name customer-policy_inbound
 match access-group name customer-policy_outbound
!
policy-map VLAN-policy
 class CustomerVLAN
  police 1000000000 conform-action transmit exceed-action drop violate-action drop
!
interface Vlan10
 description Customer
 ip address x.x.x.x x.x.x.x
 mls qos bridged
 service-policy input VLAN-policy
 service-policy output VLAN-policy
!
interface TenGigabitEthernet4/1
 description Trunk
 switchport
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10
 switchport mode trunk
 mls qos vlan-based
!
Рубрика: it | Метки: , , | Оставить комментарий

Установка FreeBSD 9.0-RELEASE по сети

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

Машинка неплохая, но в ней было привода оптических дисков и IDE-разъемов для его подключения. Только SATA-слоты. SATA-привода у меня, увы, не нашлось, а MP3-плеер в качестве флеш-накопителя для установки использовать я не захотел.

Решил на рабочем компьютере поднять FreeBSD 9.0-RELEASE в VirtualBox’е и сделать из него сервер для установки через сеть.

В данном случае на виртуальной машине на сетевом интерфейсе стоял IP-адресс 10.0.1.190/24 (тип подключения в свойствах ВМ был выбран «Мост»)

Настраиваем tftpd. В /etc/rc.conf добавляем строчку:

1
inetd_enable="YES"

Создаем каталог:

1
mkdir /tftpboot

В /etc/inetd.conf раскомментируем строчку:

1
tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot

Запускаем сетевую файловую систему. В /etc/rc.conf добавляем:

1
2
3
4
5
6
7
8
dhcpd_enable="YES"
rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
mountd_enable="YES"
mountd_flags="-r -p 59"

Создаем каталог:

1
mkdir /usr/local/pxeboot

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

1
/usr/local/pxeboot -network 10.0.1.0 -mask 255.255.255.0

Устанавливаем dhcpd:

1
2
cd /usr/ports/net/isc-dhcp42-server
make install clean

После сборки dhcpd правим /usr/local/etc/dhcpd.conf:

1
2
3
4
5
6
7
8
9
10
11
12
authoritative;
option domain-name "local";
option domain-name-servers ваш.DNS.сервер;
subnet 10.0.1.0 netmask 255.255.255.0 {
    range 10.0.1.61 10.0.1.63;
    option routers 10.0.1.128;
    next-server 10.0.1.190;
    filename "/pxeboot";
    option root-path "10.0.1.190:/usr/local/pxeboot";
}

range 10.0.1.61 10.0.1.63 поставил, чтобы адреса не пересекались с уже занятыми, 10.0.1.190, как я уже писал выше, это адрес на сетевой карте ВМ, 10.0.1.128 — адрес локального NAT’а, через который локальные машины ходят в мир

Теперь необходимо скачать загрузочный диск FreeBSD 9.0-RELEASE и примонтировать его:

1
2
3
fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-i386-bootonly.iso
mdconfig -a -t vnode -f FreeBSD-9.0-RELEASE-i386-bootonly.iso
mount_cd9660 /dev/md0 /mnt

Копируем содержимое диска в /usr/local/pxeboot:

1
cp -R /mnt /usr/local/pxeboot

И копируем загрузчик в /tftpboot:

1
cp /mnt/boot/pxeboot /tftpboot/

Теперь запускаем необходимые службы:

1
2
3
4
5
/etc/rc.d/inetd restart
/usr/local/etc/rc.d/isc-dhcpd start
/etc/rc.d/rpcbind start
/etc/rc.d/nfsd start
/etc/rc.d/mountd reload

Если все сделано правильно, то showmount -e должен вывести:

1
2
3
showmount -e
Exports list on localhost:
/usr/local/pxeboot 10.0.1.0

Вывод sockstat | grep inetd должен содержать строку:

1
root inetd 847 6 udp4 *:69 *:*

Далее подключам машину, на которую через сеть надо поставить FreeBSD 9.0-RELEASE, в нашу локальную сеть, в BIOS’е выбираем загрузку через PXE.

Если все сделано правильно, и я нигде не ошибся ;-), запустится загрузчик и начнется установка. Все необходимые компоненты для установки установщик будет тянуть с интернета.

P. S.: У меня, почему-то, во время начальных этапов установки затиралось содержимое /etc/resolv.conf. Но это не беда. Перед выбором distributions я на виртуальной машине просто отредактировал /usr/local/pxeboot/etc/resolv.conf

P. P. S.: Прошу прощения, если где-то что-то пропустил — по возможности исправлю.

Рубрика: it | Метки: , , | Оставить комментарий

BGP и два канала

К одной удаленной точке, которая была доступна только по WiFi, появился 100 Мбит/с канал. Решили сделать так, чтобы при падении 100 Мбит/с канала связь переруливалась на WiFi, а при восстановлении — все переруливалось обратно (т. к. пользователям той удаленной точки мы предоставляем интернет). С обеих сторон стоят циски, есть небольшой пул «белых» IP-адресов.
Первым делом задал два default-маршрута с разной метрикой:

1
2
ip route 0.0.0.0 0.0.0.0 A.B.C.73
ip route 0.0.0.0 0.0.0.0 A.B.C.81 10

И, о чудо, при отключении 100 Мбит/с канала, в лабораторных условиях, естественно :-), трафик пошел через A.B.C.81 10. Вот только при восстановлении 100 Мбит/с канала назад ничего не перерулилось.
Решил реализовать все при помощи BGP.
Со стороны удаленной точки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
router bgp 65534
 bgp log-neighbor-changes
 network A.B.C.76 mask 255.255.255.252
 neighbor A.B.C.73 remote-as 65533
 neighbor A.B.C.73 send-community
 neighbor A.B.C.73 soft-reconfiguration inbound
 neighbor A.B.C.73 route-map FiberUplink-IN in
 neighbor A.B.C.73 route-map FiberUplink-out out
 neighbor A.B.C.81 remote-as 65533
 neighbor A.B.C.81 send-community
 neighbor A.B.C.81 soft-reconfiguration inbound
 neighbor A.B.C.81 route-map RadioUplink-IN in
 neighbor A.B.C.81 route-map RadioUplink-out out
!
access-list 1 permit 0.0.0.0
access-list 1 deny any
ip prefix-list RemotePrefixes seq 10 permit A.B.C.76/30
route-map RadioUplink-out permit 10
 match ip address prefix-list RemotePrefixes
!
route-map FiberUplink-out permit 10
 match ip address prefix-list RemotePrefixes
!
route-map FiberUplink-IN permit 10
 match ip address 1
 set weight 1000
!
route-map RadioUplink-IN permit 10
 match ip address 1
 set weight 10
!

Немного опишу:
network A.B.C.76 mask 255.255.255.252 — объявляю, что хочу аплинку проанонсировать эту подсеть.
access-list 1 permit 0.0.0.0
access-list 1 deny any — хочу принимать только default-префикс (full-view мне там не нужен, да и памяти на удаленной циске маловато)
route-map FiberUplink-IN permit 10
set weight 1000 — ставлю бОльший приоритет на скоростной аплинк

Теперь конфиг с главного узла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
router bgp 65533
 neighbor A.B.C.74 remote-as 65534
 neighbor A.B.C.74 send-community
 neighbor A.B.C.74 default-originate
 neighbor A.B.C.74 soft-reconfiguration inbound
 neighbor A.B.C.74 route-map RemoteFiberUplink-IN in
 neighbor A.B.C.74 route-map RemoteFiberUplink out
 neighbor A.B.C.82 remote-as 65534
 neighbor A.B.C.82 send-community
 neighbor A.B.C.82 default-originate
 neighbor A.B.C.82 soft-reconfiguration inbound
 neighbor A.B.C.82 route-map RemoteRadioUplink-IN in
 neighbor A.B.C.82 route-map RemoteRadioUplink out
!
ip prefix-list RemotePrefixes seq 10 permit A.B.C.76/30
access-list 10 permit 0.0.0.0
access-list 10 deny any
route-map RemoteFiberUplink-IN permit 10
 match ip address prefix-list RemotePrefixes
 set weight 1000
!
route-map RemoteRadioUplink-IN permit 10
 match ip address prefix-list RemotePrefixes
 set weight 10
!
route-map RemoteRadioUplink permit 10
 match ip address 10
!
route-map RemoteFiberUplink permit 10
 match ip address 10
!

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

Рубрика: it | Метки: , , | Оставить комментарий

Восстановление файлов с сыпящегося винта (ОС FreeBSD)

Принесли на днях компьютер, который выполнял ранее роли офисного маршрутизатора, почтового сервера, офисной же файлопомойки и VPN-сервера для нескольких внешних подключений.
Проблема заключалась в том, что начал сыпаться винт. К слову, на машинке установлена FreeBSD, которая проработала там довольно солидный срок.
Так вот, в связи с неизбежной гибелью винта, невозможным стал вход в систему даже в single-user режиме.
Естественно, первым делом был скачан LiveCD Frenzy (версия 1.3, если что). Загрузка прошла удачно, но dmesg оказался засранным вот такими сообщениями:

ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: WARNING - READ_DMA UDMA ICRC error (retrying request) LBA=63
ad0: FAILURE - READ_DMA status=51 error=84 LBA=63

Сначала я выставил режим доступа к устройству в PIO4:

atacontrol mode ad0 pio4

Далее смонтировал корень файловой системы:

mkdir /mnt/root
mount -o ro /dev/ad0s1 /mnt/root

… и посмотрел содержимое /etc/fstab (поскольку с данным компьютером я столкнулся впервые, и как был разбит жесткий диск не имел понятия):

cat /mnt/root/etc/fstab
# See the fstab(5) manual page for important information on automatic mounts
# of network filesystems before modifying this file.
#
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1
/dev/ad0s1h /spool ufs rw 2 2
/dev/ad0s1e /tmp ufs rw 2 2
/dev/ad0s1g /usr ufs rw 2 2
/dev/ad0s1f /var ufs rw 2 2
proc /proc procfs rw 0 0

Естественно, первым желанием было перемонтировать корневую в rw-режим, зачрутиться и смонтировать все остальное. Но увы:

ls /dev | grep ad0
ad0
ad0s1
mount -o rw /dev/ad0s1 /mnt/root/
mount: /dev/ad0s1 : Operation not permitted

Тем не менее, был слегка удивлен (объяснить не могу — опыта да знаний не так уж много) когда после неудачного монтирования в rw-режиме увидел:

ls /dev|grep ad0
ad0
ad0s1
ad0s1a
ad0s1b
ad0s1e
ad0s1f
ad0s1g
ad0s1h

Отлично! В связи с тем, что ФС есть возможность монтировать только в ro-режим, в /mnt создал для каждой ФС отдельный каталог:

mkdir spool
mkdir usr
mkdir var

И, для того, чтобы убедится, что данные на этих ФС сохранились — примонтировал каждый из них:

mount -o ro /dev/ad0s1h /mnt/spool/
mount -o ro /dev/ad0s1g /mnt/usr
mount -o ro /dev/ad0s1f /mnt/var

Однако, некоторое время спустя, при копировании нужных файлов с этих ФС, получил панику ядра Frenzy (один 5-килобайтный файл, перед этим, копировался минуты две).
Пришлось перезагрузиться, выплонить часть вышеуказанных действий, покурить_и_подумать.
Решил схитрить, поднял на рабочей машинке nfs-kernel-server. Расшарил один из каталогов для Frenzy.
На самой Frenzy решил использовать утилиту dd, с целью создания образов разделов, переноса их на одну из FreeBSD-машин, монтировании их там и, собственно, извлечении данных.

dd if=/dev/ad0s1h of=/root/spool.img
dd if=/dev/ad0s1g of=/root/usr.img
dd if=/dev/ad0s1f of=/root/var.img
mkdir /mnt/share; mount freebsd.local:/srv /mnt/share
cp /root/spool.img /mnt/share/
cp /root/usr.img /mnt/share/
cp /root/var.img /mnt/share/

Далее, уже на FreeBSD-машине, выполнил ряд действий, необходимых для монтирования образов:

mdconfig -a -t vnode -f spool.img -u 5
mdconfig -l -u md5
mkdir spool
mount -r /dev/md5 spool/

И так для каждого образа…
В общем, критически важную часть файлов удалось спасти.
На этом все.

Рубрика: it | Метки: , | Оставить комментарий