Для того, чтобы создавать материалы, необходимо представиться.
Эта статья охватывает монтирование виндовых файловых систем,форматированных в NTFS =) . Приступим.
Что мы имеем:
% uname -r
8.0-RELEASE
Идем в порты и ставим fusefs-nfts
# cd /usr/ports/sysutils/fusefs-ntfs && make clean config install clean
Как все собрали,добавляем в автозагрузку
Добавляем fusefs в автозагрузку:
# echo 'fusefs_enable=YES' >> /etc/rc.conf
Стартуем fusefs
# /usr/local/etc/rc.d/fusefs start
Синтаксис монтирования такой:
ntfs-3g [-o option[,...]] устройство точка_монтирования
mount -t ntfs-3g [-o option[,...]] устройство точка_монтирования
Пример:
# mount_msdosfs -Wkoi2dos -Lru_RU.UTF-8 /dev/da0s1 /mnt/flash/
(У меня локаль UTF-8,Вы указывайте свою)
Для автомонтирования мной был написан скрипт,ессесно кривоват,и тут по-любому опытные юзеры FreeBSD могут посмеяться,но что делать,работает,и ладно. Ниже приведен пример скрипта
#!/bin/sh
#
#auto mount NTFS FS with fuse-fs for rc.d usage (c) DeathStar
# PROVIDE: mount_ntfs
# REQUIRE: DAEMON
# KEYWORD: shutdown
. "/etc/rc.subr"
name=mount_ntfs
rcvar=`set_rcvar`
load_rc_config $name
: ${mount_ntfs_enable="NO"}
start_cmd=mount_ntfs_start
stop_cmd=mount_ntfs_stop
status_cmd=mount_ntfs_status
mount_c="mount_ntfs-3g /dev/ad0s1 /home/deathstar/mnt/c"
mount_d="mount_ntfs-3g /dev/ad0s5 /home/deathstar/mnt/d"
year=$(date "+DATE: %Y" | cut -d' ' -f2)
mounth=$(date "+DATE: %m" | cut -d' ' -f2)
day=$(date "+DATE: %d" | cut -d' ' -f2)
time=$(date "+TIME: %H:%M:%S" | cut -d' ' -f2)
logfile="/var/log/${name}.txt"
mount_ntfs_start() {
echo "Starting $name."
echo ${name} was started ${day}.${mounth}.${year} в ${time} >> ${logfile}
${mount_c} && ${mount_d} >> ${logfile} &
mount_ntfs_status
}
mount_ntfs_stop() {
echo $name was stopped ${day}.${mounth}.${year} в ${time} >> ${logfile}
echo "Stopping $name."
pids=`pgrep ntfs-3g`
pkill ntfs-3g
wait_for_pids $pids
mount_ntfs_status
}mount_ntfs_restart() {
if mount_ntfs_checkstatus; then
mount_ntfs_stop
mount_ntfs_start
else
mount_ntfs_start
fi
}
mount_ntfs_status()
{
pids=`pgrep mount_ntfs-3g`
if mount_ntfs_checkstatus; then
echo "$name is start with PID: ${pids}"
echo $name is start with PID:: ${pids} >> ${logfile}
else
echo "$name not starting"
echo $name not starting >> ${logfile}
fi
}
mount_ntfs_checkstatus()
{
pgrep mount_ntfs-3g > /dev/null
}
run_rc_command "$1"
Кладём это в /usr/local/etc/rc.d под именем,напрмер как у меня, mount_ntfs
Далее выполняем команду
# echo 'mount_ntfs_enable=YES' >> /etc/rc.conf
и пробуем
# /usr/local/etc/rc.d/mount_ntfs start
Устанавливаем из портов Apache22, при этом убираем поддержку IPV6:
cd /usr/ports/www/apache22
make install clean
Для старта apache при загрузке системы прописываем в /etc/rc.conf строчку:
apache22_enable="YES"
Устанавливаем php5. Убираем поддержку IPV6, добавляем поддержку Apache:
/cd /usr/ports/lang/php5
make install clean
В конфиге Apache /usr/local/etc/apache22/httpd.conf смотрим чтобы была строчка:
LoadModule php5_module libexec/apache22/libphp5.so
а так же блок:
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
находим секцию и добавляем index.php
DirectoryIndex index.php index.html
В /usr/local/etc/php.ini проверяем, чтобы было разрешено отображение короткой формы записи
short_open_tag = On
Включаем защищенный режим:
safe_mode = On
Необходимо так же раскомментировать строчки:
extension=php_mcrypt.dll
session.save_path = "/tmp"
После этих действий страницы на php буду нормально открываться в браузере.
Устанавливаем MySQL 5.1
cd /usr/ports/databases/mysql51-server
make install clean
cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf
/usr/local/bin/mysql_intsall_db --user=mysql
chown -R mysql:mysql /var/db/mysql/
/usr/local/bin/mysqld_safe –user=mysql &
/usr/local/bin/mysqladmin -u root password '123456'
в /etc/rc.conf добавляем:
mysql_enable=”YES”
Установка PhpMyAdmin
cd /usr/ports/databases/phpmyadmin
make install clean
добавляем в /usr/local/etc/apache22/httpd.conf
Alias /pma/ "/usr/local/www/phpMyAdmin/"
Options none
AllowOverride Limit
Order Deny,Allow
Deny from all
Allow from 127.0.0.1 .example.com
Вместо .example.com нужно вписать IP с которого разрешено заходить.
Теперь необходимо создать файл конфигурации для подключения phpMyAdmin к MySQL. Делаем следующие действия:
cd phpMyAdmin
mkdir config # создаем директорию для записи
chmod o+rw config # даем права на запись
cp config.inc.php config/ # копируем текущий конфигурационный файл для редактирования
chmod o+w config/config.inc.php # даем права на запись
Идем по адресу http://наш_сервер/pma/scripts/setup.php, нажимаем add, вносим нужные настройки (пароль root к БД, способ
атентификации) и записываем конфигурацию. Далее копируем конфигурационный файл обратно:
mv config/config.inc.php .
chmod o+r config.inc.php # ставим необходимые права
Всё. Теперь можно заходить по адресу http://наш_сервер/pma/ и редактировать БД.
Ставим php5-mysql
cd /usr/ports/databases/php5-mysql
make install clean
Ставим php5-extensions, обязательно отметив галочками следующие пункты - BCMATH, FTP, GD, GETTEXT, MBSTRING, ZLIB
cd /usr/ports/lang/php5-extensions
make install clean
Веб-файлы предполагается размещать в домашнем каталоге пользователя user. Создадим там папку www. И сделаем символическую ссылку в этот каталог.
cd /usr/local/www/apache22/
rm -dr data
ln -s /usr/home/user/www /usr/local/www/apache22/data
# cd /usr/ports/net/3proxy
# make install clean
Создаем конфиг
#!/usr/local/bin/3proxy
#config /usr/local/3proxy/3proxy.cfg
# Тут прописываем ДНС
nserver 82.146.40.4
nserver 82.146.40.6
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
# Создаем пользователя ,после CL: его пароль
users deathstar:CL:password
# Запускаем как демон
daemon
# Указываем путь к логам
log /var/log/3proxy.log D
# Формат логов
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"
# Включаем архивацию логов
archiver zip zip -m -qq %A %F
# Включаем ротацию логов , 30 дней
rotate 30
# Авторизация по имени/паролю
auth strong
# Разрешаем подключение всем юзерам в любое время к любым сервисам
allow *
# внешний интерфейс
# (через который будут уходить запросы от сервера)
external 0.0.0.0
# ip адрес интерфейса на котором будут приниматься
# запросы от клиентов
internal 78.24.218.60
# для использования ICQ включаем
socks
# и запускаем службу HTTP proxy с отключенной NTLM
# авторизацией
proxy -n
# запускаем от пользователя nobody
setgid 65534
setuid 65534
После всех манипуляций с настройками, создаём директорию для хранения логов и меняем владельца
# mkdir /var/log/3proxy
# chown 65534:65534 /var/log/3proxy
Добавляем в автозапуск (/etc/rc.conf)
# echo 'threeproxy_enable="YES"' >> /etc/rc.conf
Запускаем командой
# /usr/local/etc/rc.d/3proxy start
1) TeamSpeak
Teamspeak (тимспик) — семейство программ, предназначенных для общения голосом в сети. От классического телефона отличается практически неограниченным количеством абонентов, разговаривающих одновременно. Больше всего это похоже на многоканальную рацию, в которой можно одновременно пользоваться несколькими каналами. При этом доступны все опции, разработанные в своё время для удобства использования раций в полевых (боевых) условиях. Программы этого типа предназначены, прежде всего, для игроков, но могут использоваться везде, где необходима голосовая связь и координация большой группы людей.
Для работы с TeamSpeak на сервере потребуется серверная часть, для клиента – клиентское
ПО и колонки, либо наушники и микрофон.
2) Инсталляция
В программе остутствует возможность установки опций.
# cd /usr/ports/audio/teamspeak_server && make install clean
Добавляем в автозапуск
# echo "teamspeak_enable="YES" > /etc/rc.conf
Запускаем
# /usr/local/etc/rc.d/teamspeak2-server start
3) Администрирование
Теперь зайдем в администраторский раздел web интерфейса TeamSpeak
http://{server_address}:{port} (пример http://my_site:14534/)
Обратите внимание, что существует два уровня привелегий администратора
Admin/Client login так и SuperAdmin Login
Поскольку логинов и паролей нам не сообщали, то посмотрим их в логах сервера,
которые находятся в директории с демоном см server.log
# less /usr/local/lib/teamspeak_server/server.log
19-10-07 19:12:57,WARNING,Info,SERVER, Default VirtualServer created
19-10-07 19:12:57,WARNING,Info,SERVER, admin account info: username: admin password: hs7gpl
19-10-07 19:12:57,WARNING,Info,SERVER, superadmin account info: username: superadmin password: 3vaqny
19-10-07 19:12:58,ALL,Info,server, Server init finished
19-10-07 19:12:58,WARNING,Info,server, TeamSpeak Server daemon activated
Нас интересуют строчки, в которых находятся строчки admin account info
и superadmin account info информацию из этих строк, мы будем использовать для
авторизации. В административном разделе всегда можно поменять пароль на более удобный
Итак,устанавливаем =)))
Добавляем в /etc/rc.conf:
linux_enable=”YES” ,
В /etc/sysctl.conf:
compat.linux.osrelease=2.6.16 ,
А в /etc/fstab:
linproc /usr/compat/linux/proc linprocfs rw 0 0
далее даем команды:
mkdir -p /usr/compat/linux/proc
mount /usr/compat/linux/proc
/etc/rc.d/abi start
/etc/rc.d/sysctl start
Устанавливаем Linux библиотеки, Flash плагин и nspluginwrapper из портов:
cd /usr/ports/emulators/linux_base-f10 && make install clean
cd /usr/ports/www/linux-f10-flashplugin10/ && rm distinfo && make install clean
cd /usr/ports/www/nspluginwrapper && make install clean
Запускаем плагин в nspluginwrapper
nspluginwrapper -v -a -i
Если увидели примерно следующее
Auto-install plugins from /usr/X11R6/lib/browser_plugins
Looking for plugins in /usr/X11R6/lib/browser_plugins
Auto-install plugins from /usr/local/lib/npapi/linux-flashplugin
Looking for plugins in /usr/local/lib/npapi/linux-flashplugin
Install plugin /usr/local/lib/npapi/linux-flashplugin /libflashplayer.so
nto /usr/local/lib/browser_plugins/npwrapper.libflashplayer.so
Auto-install plugins from /root/.mozilla/plugins
Looking for plugins in /root/.mozilla/plugins
То все прошло успешно
1) Подготовка системы
Установим линукс эмулятор linux_base-fc10
# cd /usr/ports/emulators/linux_base-f10 && make install clean
Впишем строки запуска linux-эмулятора при загрузке системы,.
в /etc/rc.conf:
linux_enable=”YES” ,
В /etc/sysctl.conf:
compat.linux.osrelease=2.6.16 ,
А в /etc/fstab:
linproc /usr/compat/linux/proc linprocfs rw 0 0
далее даем команды:
mkdir -p /usr/compat/linux/proc
mount /usr/compat/linux/proc
/etc/rc.d/abi start
/etc/rc.d/sysctl start
В конфигурацию ядра, добавляем следующие опции
options DEVICE_POLLING
options HZ=1000
<.code>
Скачаем эти файлы
1) Сам сервер - hlds_l_1120_full.bin 424Mb
NoSteam - linux_server_nosteam_27.10.06_.zip 8mb
Распаковываем архив, создаем директорию и обновляем.
# mkdir /usr/steam
Копируем в созданную директорию файл hlds_l_1120_full.bin, затем установим ему права на запуск и запускаем.
# chmod 700 hlds_l_1120_full.bin
# ./hlds_l_1120_full.bin
На вопрос о лицензии отвечаем "YES".
Через некоторое время появится файл hlds_l_1120_full.tgz который нужно распаковать
# tar zxvf hlds_l_1120_full.tgz
Появится папка hlds_l в которую необходимо перейти
# cd /usr/steam/hlds_l/<.code>
Обновленяем Steam
Cтавим из под любого юзера кроме root иначе не обновит!!!
#./steam -update[/color] <.code>
После запуска система напишет следующее:
Checking bootstrapper version ...
Getting version 9 of Steam HLDS Update Tool
Downloading. . . . . . . . . . .
Steam Linux Client updated, please retry the command
Если у вас остутствует аккаунт в стиме, можно его, при необходимости, создать. Но нам не надо, поэтому ниже будет NoSteam.
Обновление Counter-Strike
# ./steam -command update -game cstrike -dir /usr/steam/hlds_l
Появится сообщение об успешном обновлении.
Verifying: /usr/steam/hlds_lvalvevalvecomm.lst
Downloading: /usr/steam/hlds_lvalveviolence.cfg
Verifying: /usr/steam/hlds_lvalvexeno.wad
HLDS installation up to date
NoSteam
Если сервер запустить сразу и попробовать подключить к нему клиента, то появится интерестная табличка Invalid CD key. Ее необходимо убрать Для этого, распакуем содержимое файла linux_server_nosteam_27.10.06_.zip заменив оригинальные файлы
# tar zxvf linux_server_nosteam_27.10.06_.zip /usr/steam/hlds_l[/color]
Запуск
Запускаем не от пользователя root, а от другого созданого пользователя, ибо во-первых безопастнее, во-вторых - будет меньше проблем при запуске сервера!
# cd /usr/steam/hlds_l
# ./hlds_run -game cstrike -insecure -nomaster +sv_lan 1 +maxplayers 12 +map de_dust
Если вывод происходит без ошибок, то я вас поздравляю - все впорядке сервер встал
Auto detecting CPU
Using Pentium II Optimised binary.
Auto-restarting the server on crash
Console initialized.
scandir failed:/usr/home/911/hlds_l/./valve/SAVE
scandir failed:/usr/home/911/hlds_l/./platform/SAVE
Protocol version 47
Exe version 1.1.2.5/Stdio (cstrike)
Exe build: 20:02:49 Oct 24 2006 (3651)
STEAM Auth Server
couldn't exec language.cfg
Server IP address 192.168.0.5:27015
scandir failed:/usr/home/911/hlds_l/./valve/SAVE
scandir failed:/usr/home/911/hlds_l/./platform/SAVE
couldn't exec listip.cfg
couldn't exec banned.cfg
Master server communication disabled.
0 fps -- host(6401) sv( 0) cl( 0) gfx( 0) snd( 0) ents(101)
Можно еще посмотреть следующим образом.
# sockstat |grep hlds
911 hlds_i686 2067 4 udp4 *:27015 *:*
911 hlds_i686 2067 7 udp4 192.168.0.5:26900 *:*
911 hlds_i686 2066 4 udp4 *:27015 *:*
911 hlds_i686 2066 7 udp4 192.168.0.5:26900 *:*
911 hlds_i686 2065 4 udp4 *:27015 *:*
911 hlds_i686 2065 7 udp4 192.168.0.5:26900 *:*
-game cstrike - запускаемый мод.
-insecure - отключает античит VAC
-nomaster - сервер не авторизовается в WON.
+sv_lan 1 - работа в режиме локальной сети
+maxplayers - количество игроков
+map de_dust - стартовая карта
Запуск в background
# ./hlds_run -game cstrike -insecure -nomaster +sv_lan 1 +maxplayers 12 +map de_dust > /dev/null 2>&1 &[/color]
Или с логами,вот так
# ./hlds_run -game cstrike -insecure -nomaster +sv_lan 1 +maxplayers 12 +map de_dust > hlds.log 2>&1 &
<.code>
Конфигурация
hlds_l/cstrike/server.cfg
Главный конфиг сервера, здесь задаются все основные параметры его работы.
Все доступные переменные см Cmds & Cvars
hlds_l/cstrike/motd.txt
Здесь находится текст сообщения, который выводится при подключении к игре.
hlds_l/cstrike/mapcycle.txt
Список карт находящихся в ротации в игре. хотите добавляйте удаляйте и дублируйте по вашему желанию.
hlds_l/cstrike/map/
Собственно, путь где расположены карты
Скрипты запуска
#!/bin/sh
/usr/steam/hlds_l/hlds_run -game cstrike -insecure -nomaster +sv_lan 1 +maxplayers 12 +map de_dust >/dev/null 2>&1 &
# chmod +x cs1.6.sh
# sh cs1.6.sh
И так,скрипт
#!/bin/sh
pkg_ver="/usr/sbin/pkg_version"
${pkg_ver} -v | awk '{print $1}' |
{
while read pkg_name
do
cd /usr/ports
pkg_path=`make search name="${pkg_name}" | grep Path | cut -d' ' -f4 | awk '{print $2}`
echo `cd ${pkg_path} && make clean`
done
}
Код довольно громоздкий,долго исполняемый,так как приходилось шарить INDEX и тп. Обратился в конфу freebsd@conference.jabber.ru и там дали что типа такого
#!/bin/sh
for i in `pkg_info | awk '{print $1}'`; do make clean -C /usr/ports/`pkg_info -qo ${i}`; done
+ в том,что не требуется сторонних утилит,ну и работает быстрее моего )))
Для начала рекомендую установить erlang-lite,чтоб не было в дальнейшем гемороев
cd /usr/ports/lang/erlang-lite
make install clean
Теперь ставим сам сервер,Enable ODBC support не включаем, ждем пока соберется.
cd /usr/ports/net-im/ejabberd
make install clean
Пока собирается ejabberd, настраиваем DNS Создаем следующие записи в зоне, указывающие на наш сервер (deathstar.name)
icq IN A 78.24.*.*
_jabber._tcp.deathstar.name. 86400 IN SRV 5 0 5269 jabber.hostname.ru.
_xmpp-server._tcp.deathstar.name. 86400 IN SRV 5 0 5269 jabber.hostname.ru.
_xmpp-client._tcp.deathstar.name. 86400 IN SRV 5 0 5222 deathstar.name.
Настраиваем ejabberd
cp /usr/local/etc/ejabberd/ejabberd.cfg.example /usr/local/etc/ejabberd/ejabberd.cfg
cp /usr/local/etc/ejabberd/ejabberd.defaults.example /usr/local/etc/ejabberd/ejabberd.defaults
Редактируем
ee /usr/local/etc/ejabberd/ejabberd.cfg
Трогаем только это ))
{hosts, ["deathstar.name"]}.
{listen,
[
{5222, ejabberd_c2s, [
%%
%% If TLS is compiled and you installed a SSL
%% certificate, put the correct path to the
%% file and uncomment this line:
%%
%%{certfile, "/usr/local/etc/ejabberd/ssl.pem"}, starttls,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
]},
%%
%% To enable the old SSL connection method in port 5223:
%%
{5223, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
{certfile, "/usr/local/etc/ejabberd/ssl.pem"}, tls,
{max_stanza_size, 65536}
]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
%%
%% ejabberd_service: Interact with external components (transports...)
%%
{5248, ejabberd_service, [
{access, all},
{hosts,["pyvk-t.deathstar.name"],
[{password,"password"
]},
{5280, ejabberd_http, [
http_poll,
web_admin
]}
]}.
%%% ====================
%%% ACCESS CONTROL LISTS
%%
%% The 'admin' ACL grants administrative privileges to Jabber accounts.
%% You can put as many accounts as you want.
%%
{acl, admin, {user, "deathstar", "deathstar.name"}}.
В принципе больше ничего не трогал ))
Затем создадим сертификат
cd /usr/local/etc/ejabberd/
openssl req -new -x509 -nodes -newkey rsa:1024 -days 3650
-keyout privkey.pem -out server.pem -subj
"/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=deathstar.name/emailAddress=deathstar@deathstar.name"
cat privkey.pem >> server.pem
rm privkey.pem
mv server.pem ssl.pem
Добавим в запуск и запустим
# ejabberd_enable="YES"" >> /etc/rc.conf
# /usr/local/etc/rc.d/ejabberd start
P|Pc|Pc console:
:ht:np:sp#115200:
Заносим вот такую запись,где deathstar – имя пользователя,под которым надо логинится
Pc-autologin|Pc console with autologin:
:ht:np:sp#115200:al=deathstar:
Затем в /etc/ttys правим строку
ttyv0 "/usr/libexec/getty Pc" cons25r on secure
на
ttyv0 "/usr/libexec/getty Pc-autologin" cons25r on secure
И в ~/.profile в конце добавляем строчку:
startx
Чтоб запускались например kde4,то в ~/.xinitrc пишем следующее
exec "/usr/local/kde4/bin/startkde"
nops
Во время отдыха я люблю вспомнить игры Dendy, за прохождением которых я провёл не один год. Испробовал я много открытых эмуляторов Dendy, но по душе оказался только tuxnes (http://tuxnes.sourceforge.net/) - эмулятор Dendy с поддержкой множества форматов rom, музыки и рендеринга в X11 (с возможность увеличения размера).
В FreeBSD tuxnes из порта (/usr/ports/emulators/tuxnes) устанавливается без проблем:
cd /usr/ports/emulators/tuxnes
make clean && make && make install
В Linux проблем тоже быть не должно.
Единственное что мне не нравилось - это клавиши управления, особенно при игре двух игроков. Для решения этой проблемы пришлось сделал патч (только рендера x11), конфигурационного файла у этой маленькой утилитки, конечно же, нет.
Патч можно взять здесь - http://files-upload.com/253926/patch-x11.c.html.
После наложения этого патча клавиши будут такими:
Игрок 1:
Вверх: I
Вниз: K
Влево: J
Вправо: L
Кнопка A: X
Кнопка B: Z
Start: S
Select: A
Игрок 2:
Вверх: 5*
Вниз: 2*
Влево: 1*
Вправо: 3*
Кнопка A: End
Кнопка B: Delete
Start: Home
Select: Insert
* Кнопки на дополнительной клавиатуре.
PS: В эмуляторе есть очень интересная фича - величение скорости эмуляции, даже самые простые игры становятся непроходимыми :)
nops
Любой модем можно настроить мостом (Bridge), но не любой модем можно настроить маршрутизатором (Router).
Внимание: для настройки соединения потребуется утилита pppoeconf. Заранее скачайте и установите пакет pppoeconf.
Настройки приводятся на примере Ubuntu 7.10, но также верны для других дистрибутивов, за исключением мелких различий (расположение меню, названий пакетов и т.п.).
Настройка модема:
СистемаАдминистрированиеСетьПроводное подключение
В свойствах:
Конфигурация: Статический адрес IP
IP адрес: 192.168.1.2 (или любое число до 255, включительно)
Маска подсети: 255.255.255.0
Gateway адрес: 192.168.1.1
Настройка модема производиться при помощи Интернет-браузера, например, Firefox. Запустите Интернет-браузер, наберите в строке адреса http://192.168.1.1 и после появления приглашения введите имя пользователя admin и пароль admin.
Режим Bridge (для подключения одного компьютера).
Для создания нового соединения запустите мастер соединений через пункт меню «Wizard». В открывшемся окне укажите следующие параметры и нажмите конопку «Next»:
Protocol - Bridge,
Encapsulation - LLC,
VPI - 8,
VCI - 35,
QoS: UBR
В следующем окне нажмите кнопку «Save/Restart» для завершения работы мастера.
После окончания настройки закройте браузер.
Настройка соединения PPPoE
В свойствах «СистемаАдминистрированиеСетьПроводное подключение» укажите конфигурацию «Автоматическая настройка (DHCP)».
После этого нужно запустить утилиту pppoeconf для настройки подключения PPPoE.
$ sudo pppoeconf
Первое окно сообщает об обнаруженных устройствах:
Если Вы не видите имя вашего устройства в списке найденных, то проверьте что ваша сетевая карточка правильно настроена. Ответьте утвердительно на вопрос о найденных устройствах Ethernet, если ваша сетевая карта перечислена в списке.
После нажатия «Да» будет произведено сканирование устройств для определения подключения.
Далее мастер конфигурации может предупредить вас о существовании файла конфигурации соединения PPPoE и изменении его в дальнейшем процессе. Сделайте резервную копию указанного в мастере файла.
На следующей странице мастера будет задан вопрос о изменении популярных параметров. Выберите «Нет», если будет необходимо в дальнейшем их можно будет настроить в ручную.
На следующих двух страницах необходимо будет ввести логин и пароль выданный Вам провайдером.
Следующая страница содержит вопрос о автоматической настройке DNS. Ответьте «Да».
На вопрос об ограниченном MSS ответьте «Да», иначе могут быть проблемы с некоторыми сайтами.
На вопрос об установке соединения при загрузке компьютера ответьте утвердительно, если хотите чтобы при загрузке компьютера соединение устанавливалось автоматически.
На следующей странице будет вопрос об установлении соединения. Ответьте «Да».
Всё соединение настроено и команда ifconfig ppp0 должна показывать что соединение установлено.
Чтобы вручную остановить соединение пользуйтесь утилитой poff.
Чтобы вручную установить соединение — pon. В качестве первого параметра передаётся имя конфигурационного файла из каталога /etc/ppp/peers (по умолчанию dsl-provider)
Чтобы просмотреть журнал PPPoE соединения используйте plog.
lexa_
Используя Linux, непременно приходится читать справку, В этом деле наш лучший друг - man. Но по умолчанию man, стирает manстраницу сразу после нажатия 'q', это своеобразный тест : хорошая-ли у тебя память.
Для исправления этого безобразия читаем man man, в разделе OPTIONS обнаруживаем, что man использует pager - программу которая занимается отображение manстраницы. В моём случае файл /usr/bin/pager (пейджер по умолчанию) оказался ссылкой на /etc/alternatives/pager а тот в свою очередь ссылкой на /usr/bin/less. Те для отображения справки используется обычный less.
Если вам не нравится стандартный pager то его можно сменить с помощью переменной окружения $PAGER, просто export PAGER=more и теперь
справка отображается с помощью more.
Вернёмся к настройке стандартного pager, как мы выяснили нам надо настроить less. В секции OPTIONS найдём опцию -X или --no-init. Если запустить less -X <имя файла> , то после выхода из less экран не очистится, это то что нам нужно.
Но как сказать что нужно использовать man'у что надо использовать less с ключом -X Существуют 2 способа :
1) в своём ~/.bashrc задать строку export PAGER='less -s -X'
(опция -s в принципе не нужна просто она заставляет less выводит текст в более красивом виде)
Это изменение повлияет только на вашего пользователя.
2) поправит /etc/manpath.config
строку
#DEFINE pager /usr/bin/pager -s
заменить на
DEFINE pager /usr/bin/pager -s -X
Такое изменение повлияет на всех пользователей.
К слову хочу добавить об очень полезном ключе для man'а:
man -k <что хочу> покажет список с именами программ и их кратким описанием, таких что слово <что хочу> встречается в их кратких описаниях. Это очень полезно если вы не знаете какая программа вам конкретно нужна, но знаете что она должна делать.
lexa_
В последнее время в продаже появились клавиатуры с "лишними" клавишами(или если по иностранному Multimedia keys), настройкой этих клавишь мы и займёмся. В Windows работа этих клавишь реализуется за счёт специальных утилит поставляемых производителем, к сожалению (а может к счастью) для Linux таких кривоутилит не делают (а если и делают то очень не многие производители).
Для настроки клавитуры вы можете попытаться найти свою клавиатуру в gnome-keyboard-properties или в kcontrol, если она есть в списке значит вам повезло, если вы не такой везунчик то придётся поработать руками.
Во-первых придётся определить кейкоды нажатых клавиш, это можно сделать либо с помощью xev (из графики) или же showkey (из консоли). Но по неизвестной причине xev не реагировал на некоторые клавиши, а в консоли при использовании showkey появлялись сообщения вида :
atkbd.c: Use 'setkeycodes 71 <keycode>' to make it known.
atkbd.c: Unknown key released (translated set 2, code 0x71 on isa0060/serio0).
Внимание: showkey необходимо запускать через консоль, те надо нажать ALt+Ctrl+F1, зайти от рута, и запустить showkeys, если запускать showkeys из графическаого терминала, то сообщений об ошибках вы не увидите (скорее всего)
Из этих сообщений и справки по setkeycodes я понял что клавиатура посылает скан коды, но ядро не знает с каким кейкодом он связан, и предлагает связать сканкод с кейкодом, что-ж выполним просьбу ядра. После выполнения (от имени рута) setkeycodes 71 227 получаем, что ядро перестало ругаться на эту клавишу и xev начал реагировать на её нажатие. Аналогично надо сделать и для остальных "непонятных" ядру клавиш.
Внимание : Максимальный номер кейкода который можно указать зависит от ядра, в том ядре что было у меня это 255 на некотрых ядрах максимальный кейкод ограничен 127.
После всех этих действий остаётся только привязать конкретные клавиши к каким-либо действиям.
Для этого воспользуемся xmodmap и gnome-keybinding-properties (в kde можно воспользлваться kcontrol)
для того-чтобы сделать нажатия видимыми для gnome-keybinding-properties выполним xmodmap -e "keycode <кейкод> = F", n > 12, те нажатия на мультимедия клавиши будут восприниматься как нажатия клавишь F13 F14 итд, затем запускаем gnome-keybinding-properties и настраиваем какие нужно привязки.
Внимание: кейкод который мы указали в setkeycodes и тот что мы указываем в xmodmap могут быть РАЗЛИЧНЫ ! Это отмечено в man setkeycodes в разделе BUGS. Поэтому необходимо определить кейкоды для X'ов с помощью xev.
К сожалению gnome-keybinding-properties позволяет привязать только на действия Gnome. Для запуска других приложений (не из Gnome) можно воспользоваться программой hotkeys (я описываю настройку программы hotkeys просто потому-что она первая попалась мне на глаза, также есть замечательные программы xbindkeys (к плюсам можно отнести возможность использования дополнительных кнопок мыши) и Sven(которую очень хвалят за функциональность и сильно ругают за глюки:)) можно выбрать любую, это дело вкуса)
Для настройки hotkeys выполним hotkeys -l и смотрим есть-ли наша клавиатура в списке, если нет то не расстраиваемся, а идём в /usr/share/hotkeys/ и находим там конфигурационный файл для клавиатуры которая ближе всего по конфигурации к той которая имеется в наличии, делаем копию (например так: cp itouch.def mykey.def), а затем редактируем этот файл (эти действия выполняются от имени рута).
Содержимое этого файла простое, это "XML-ориентированый файл для конфигурации кейкодов", мы просто удаляем из него строки в которых указывются клавиши которых нет в данной модели клавиатуры и добавляем свои. Я добавил строчки вида:
<userdef keycode="144" command= "mpc prev">Prev</userdef>
<userdef keycode="162" command= "/home/lexa/bin/play_stop.sh">Play/Pause</userdef>
<userdef keycode="164" command= "mpc stop">Stop</userdef>
<userdef keycode="153" command= "mpc next">Next</userdef>
В /home/lexa/bin/play_stop.sh находится скрипт который продолжает воспроизведение если оно остановлено и приостанавливает если если сейчас идёт воспроизведение (комментарий получился длинее скрипта :) )
Теперь запускаем hotkeys -t mykey и радуемся работе мультимедиа клавиш. Для полного счастья можно подредактировать /etc/hotkeys.conf по своему вкусу.
Конечно-же после перезагрузки все изменения которые мы сделали пропадут, что-бы каждый раз не повторять все манипуляции можно создать скрипт выполняющий setkeycodes и положить его в /etc/init.d/ а также сделать симлинк вида /etc/rcN.d/S99xxxx(N - тот runlevel на котором вы хотоите что-бы работали "Горячие клавиши" xxxx - имя скрипта).
Так-же полезно автоматизировать вызов xmodmap и hotkeys, для этого тоже напишем скрипт содержащий вызовы xmodmap с нужными параметрами.
Для автозагрузки в kde необходимо поместить симлинк на исполняемый файл в ~/.kde/Autostart . (те ln -s ~/bin/myxmodmap.sh ~/.kde/Autostart)
Автозагрузку в Gnome можно сделать так: в файл ~/.gnome2/session-manual добавить строки:
[Default]
num_clients=1
0,RestartClientHint=3
0,Priority=50
0,RestartCommand="hotkeys -t mykey"
0,Program="hotkeys -t mykey"
Аналогично автозагрузка делается и для скрипта устанавливающего правильный xmodmap
Автозапуск в Xfce делается с помощью скриптов вида
#!/bun/sh
/usr/bin/hotkeys -t -Z
Которые надо положить в ~/Desktop/Autostart, а для версии 4.4 в ~/.config/autostart
Вот пожалуй и всё что я могу сказать о настройке "мультимедиа клавиш".
Ссылки по теме:
Домашняя страница xbindkeys: http://hocwp.free.fr/xbindkeys/xbindkeys.html
Здесь можно взять hotkeys(я так понял что нормальной домашней страницы у них нет): http://freshmeat.net/projects/hotkeys/
Домашняя страница Sven: http://sven.linux.kiev.ua/
P.S. Скорее всего я не слишком правильно использовал xmodmap если у кого-нибудь есть дополнения к моему расказу сообщите пожалуйста мне.
P.P.S. Благодарю nops за помощь в создании сего документа.
dbsh, nops
Эта статья не претендует на звание учебника, охватывающего все стороны программирования на ассемблере в Linux. Я лишь хочу помочь людям, которые начинают делать первые шаги. Всё, что здесь будет описано, я буду описывать так, как понял это я. Надеюсь, что люди, которые найдут ошибку в моём описании, меня поправят.
Зачем все это? Литературы по ассемблеру под Linux как таковой нет. Руководства по разработке драйверов я не учитываю - до этого еще далеко. В интернете можно встретить лишь несколько статей, но там всё рассматривается поверхностно и заканчивается на примере вывода надписи "Hello, world!". На www.wasm.ru встречал интересное руководство по опкодам (опкоды – машинное представление команд ассемблера), но чтобы эти опкоды правильно писать - нужно что то знать :) Да, и перепись всего понятого - мне поможет лучше запомнить.
Надеюсь, у читающего есть хотя бы туманное представление какого-либо языка программирования высокого уровня.
Инструментарий.
Чтобы писать программы на ассемблере не нужны тяжёлые среды разработки (вроде Eclipse). Если вы занимаетесь программированием, то, наверно, большинство необходимого у вас уже установлено:
* NASM — свободный (GNU LGPL) кроссплатформенный Intel x86 ассемблер;
* LD – GNU линкер – объединяет несколько объектных файлов в один исполняемый файл;
* KHexEdit – редактор бинарных файлов;
* strace - утилита, помогающая узнать какие системные вызовы использует процесс;
* GCC – набор GNU компиляторов. Полезно дизассемблировать программы и изучать, какой код на ассемблере был сгенерирован в соответствии с исходным кодом на языке С;
* GDB - Отладчик. Как им пользоваться, поясню позже;
* VIM+GDB plugin - Текстовый редактор (или любой другой).
и, собственно SlackWare 10.2 и ядро 2.6.22
Операционная система не важна - во всех линуксах ядро одно и тоже. Принципиальная разница отсутствует.
Про синтаксис компилятора и описание архитектуры компьютера писать не буду. Много времени займет. Про архитектуру понаписано достаточно учебников. А про синтаксис можно посмотреть в приложении.
Стоит, наверно, начать с того, с чего начинают в любой книжке. Введите следующий код в файл, и сохраните под именем hello.asm
BITS32 ; Говорим компилятору, что код 32-битный
; В исполняемом файле может быть различное количество секций.
; Секции обычно выделяются по содержимому:
; .text — для кода,
; .data — для данных,
; .bss — для неинициализированных данных.
section .text ; Начало секции кода
global _start ; Метка _start должна быть глобальной,
; чтобы линкер смог её найти и сделать точкой входа в программу.
_start:
mov eax,4 ; системный вызов «write»
mov ebx,1 ; стандартный вывод
mov ecx,msg ; адрес сообщения
mov edx,[msg_size] ; длина
int 0x80 ; вызов прерывания
mov eax,1 ; системный вызов «exit»
xor ebx,ebx ; код выхода
int 0x80 ; вызов прерывания
section .data ; Начало секции данных
; Объявление переменной с сообщением
msg db 'Hello, YarLUG',0xA
; Объявление переменной с длинной сообщения
msg_size dd $-msg
Это первая наша программа. Она должна выводить на экран приветствие «Hello, YarLUG».
Для того, чтобы создать работающую программу нужно откомпилировать текст программы в объектный файл, а затем объектный файл скомпоновать в исполняемый.
$ nasm -f elf hello.asm
$ ld -o hello hello.o
Зачем так сложно? Представьте, у нас есть очень большой проект, состоящий из нескольких подпроектов. Каждый подпроект компилируется в отдельный объектный файл и затем все они компонуются в один большой исполняемый файл. Если вы изменяете один подпроект, то вам не нужно перекомпилировать все подпроекты, нужно всего лишь откомпилировать изменённый подпроект, а потом скомпоновать с остальными.
Давайте проверим работоспособность нашей первой программы:
$ ./hello
Если выводится строчка, то всё работает. Если нет, то проверьте сообщения компилятора и компоновщика при создании исполняемого файла.
Давайте разберём текст программы.
Вероятно, самое непонятное - это откуда я взял эти циферки:
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,msg_size
int 0x80
По пунктам:
1) mov eax,4
Помещаю в регистр еах номер системного вызова. Номера системных вызовов можно найти исходных текстах ядра. В файле /usr/src/linux/include/asm-i386/unistd.h описаны константы номеров системных вызовов. Номер 4 описан так:
#define __NR_write 4
2) mov ebx,1
Записываем файловый дескриптор стандартного вывода в еbх. Всегда существует 3 стандартных дескриптора:
0 – стандартный ввод
1 – стандартный вывод
2 – вывод ошибкок.
3) mov ecx,msg
Помещаем адрес сообщения в регистр есх.
4) mov edx,[msg_size]
Длина сообщения передаётся в регистре edx.
При описании переменной msg_size мы использовали символ $. Он означает текущее смещение в программе, из него мы вычитаем смещение переменной msg и получается длина сообщения в байтах. Длину можно указать и константой, но ошибившись в числе, можно придти к нежелательным последствиям. К примеру, замените в коде msg_size на какое нибудь число, например, 4, и заново пересоберите программу. В итоге на екране получим строку из четырёх символов:
Hell.
5) int 0x80
Системный вызов операционной системы. Это аналог DOS'овскому int 21h.
А теперь, самое важное - откуда я вообще узнал, что и как заносится в регистры? Наберите в консоли
$ man 2 write
Второй раздел справочника (man 2) посвящён системным вызовам ОС. Строчка, которая сразу же бросается в глаза:
ssize_t write(int fd, const void *buf, size_t count);
Это описание вызова на языке C. Чтобы понять, куда, что помещать нужно знать способ вызова (call convention). В регистре eax передаётся номер системного вызова, параметры передаются в регистрах, в порядке очерёдности, ebx, ecx, edx.
Следующий кусок кода:
mov eax,1
xor ebx,ebx
int 0x80
По номеру системного вызова в регистре eax понимаем, что это выход из программы – системный вызов exit. XOR – операция «исключающее ИЛИ». Этой операцией в ebx заносится 0. Для простоты понимания можно записать эту строчку так:
mov ebx,0
или так:
sub ebx,ebx
По описанию функции (man 2 exit) видно, что она принимает один параметр – код выхода из программы.
В описании значения переменной msg в конце написано 0xA – это переход на следующую строку. Попробуйте это убрать и посмотреть, что получиться.
Здесь можно закончить, и направить вас штудировать учебники, техническую документацию, как это делают некоторые авторы. Но я продолжу =)
Сейчас попробуем записать строчку в файл. Что для этого нужно? Нужен сам файл, но, его отдельно создавать не будем - заставим код это сделать. Потом его нужно открыть, записать, закрыть, нельзя так же забывать выйти из программы.
Используемые функции:
int open(const char *pathname, int flags, mode_t mode);
Открыть файл
ssize_t write(int fd, const void *buf, size_t count);
Записать в файл
int close(int fd);
Закрыть файл
void _exit(int status);
Выход из программы.
BITS32
section .text
global _start
_start:
; open
mov eax,5
mov ebx,path_file
mov ecx,0001002
mov edx,7666
int 0x80
mov [fd],eax
; write
mov eax,4
mov ebx,[fd]
mov ecx,msg
mov edx,[msg_size]
int 0x80
; close
mov eax,6
mov ebx,[fd]
int 0x80
; exit
mov eax,1
xor ebx,ebx
int 0x80
section .data
msg db 'Hello, YarLUG'
msg_size dd $-msg
path_file db 'file.txt',0
section .bss
fd resd 1
Не забываем, что после знака точка с запятой идет строка комментария и компилятор её пропускает.
С начала, вызывается функция open:
mov eax,5
Системный вызов open под номером 5.
mov ebx,path_file
Передаем адрес пути файла.
mov ecx,0001002
В ecx передаются битовые флаги. Здесь взведены два флага:
0001000 – если файла не существует, то создать новый;
0000002 – открыть файл в режиме чтение/запись.
mov edx,7666
В регистре edx передаются права для создаваемого файла. Подробнее можно узнать в станице man chmod.
mov dword [fd],eax
В регистре eax системный вызов open возвращает файловый дескриптор. Поскольку еах нам еще потребуется, то дескриптор необходимо сохранить в какую-нибудь промежуточную переменную. В программе для этого используется переменная fd. Дальше код достаточно простой, а местами знакомый.
Программа компилируется и компонуется аналогично предыдущей. Стоит лишь сказать о мощной утилите make, которая очень облегчит нам жизнь. Если в каталоге, где вы сохранили программу (я назвал её hellofile.asm), создать файл с именем Makefile и следующим содержимым:
build:
nasm -f elf hello.asm
ld -o hello hello.o
clean:
rm -f hello hello.o
То после любого изменения исходного текста нам остаётся ввести
$ make build
и получим готовый исполняемый файл, а утилита make вызовет всё за нас. Если ввести
$ make clean
то в каталоге останется только файл hello.asm, а всё лишнее будет удалено.
За кадром осталось ещё много всего интересного. Но об этом я постараюсь изложить в следующих своих записках.
Полезные ссылки:
* http://nasm.sourceforge.net/ - ассемблер NASM;
* http://home.online.no/~espensa/khexedit/ – KhexEdit;
* http://sourceforge.net/projects/strace/ - strace;
* http://gcc.gnu.org/ – коллекция GNU компиляторов
* http://www.gnu.org/software/gdb/ - отладчик GDB;
* http://mitya.pp.ru/gdb/ - русское руководство по GDB;
* http://wasm.ru/ - много статей по программированию на ассемблере.
dbsh, nops
Эта статья будет посвящена программированию сетевых приложений в Linux на ассемблере. В сетевом программировании на ассемблере по сути нет ничего сложного. Если вы уже создавали сетевые приложения на любом другом языке программирования и даже для другой операционной системы, то вам будет гораздо проще. Как обычно замечания и пожелания приветствуются.
Приготовления
Для наших примеров потребуются заголовочные файлы из исходных текстов ядра, которые, если вы их установили, можно найти в файловой системе в каталоге /usr/src/linux (или /usr/src/linux-2.*.*, но лучше сделайте символическую ссылку /usr/src/linux на этот каталог). Для того, чтобы не работать с голыми цифровыми константами, можно сделать аналогичные ассемблерные файлы, с теми константами, которые Вам требуются, и по мере необходимости дополнять их.
Для системного вызова ядра всегда используются две однотипные команды:
mov eax,<число>
int 0x80
Чтобы сделать наш код лаконичным можно описать макрос:
%macro syscall 1
mov eax,%1
int 0x80
%endmacro
Теперь при вызове функции ядра, можно просто вызвать макрос syscall:
syscall __NR_exit
Для отладки примеров могут пригодиться следующие приложения:
* edb (Evan's Debugger) – графический (на бибилотеке QT4) ассемблерный отладчик;
* WireShark - анализатор пакетов (снифер).
Принципы программирования сокетов
Для того, чтобы установить соединение с другим компьютером в сети нужно создать сокет – конечную точку (endpoint) соединения. Для создания соединения необходимы два сокета: на стороне клиента и на стороне сервера. Серверный сокет, обычно, создаёт программа-сервер при запуске, например, веб-сервер, а клиентский сокет создаёт приложение-клиент, например, браузер. Такая архитектура называется клиент-серверной. Активной стороной (инициирующей соединение и передачу данных) является приложение-клиент. Сервер ждёт подключения клиентов и отвечает на их запросы.
Созданием сокета и получением его дескриптора занимается функция socket. Принимаемые параметры и описание, как и всех остальных функций, можно посмотреть в man-страницах (man 2 socket):
int socket(int domain, int type, int protocol);
Первым параметром передаётся семейство протоколов (определяется константами AF_* в заголовочном файле socket.h). Мы будем использовать константу AF_INET – семейство протоколов IPv4 (обычно, его просто называют IP). Вторым параметром передаётся тип соединения (константы SOCK_* из заголовочного файла net.h). В наших примерах используется SOCK_STREAM – соединение TCP. Последним параметром передаётся конкретный протокол для использования сокетом. Если передать 0, то будет выбран протокол по умолчанию для выбранного семейства протоколов. Результатом является дескриптор созданного сокета для дальнейшей идентификации сокета.
Для установки соединения используется функция connect. Декларация функции на языке Си выглядит следующим образом:
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
Первый параметр – дескриптор сокета, который будет служит для приёма и передачи данных. Второй параметр структура, указывающая адрес удалённого хоста. Третий параметр – размер структуры, переданной вторым параметром.
Для указания удалённого адреса используется структура sockaddr_in.
struct sockaddr_in {
sa_family_t sin_family; /* Address family */
__be16 sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};
Поле sin_family – семейство протоколов, к которому относится адрес. Поле sin_port используется для указания номера порта к которому осуществляется подключение. Многие порты заранее известны (well-known ports) и закреплены за определёнными сервисами, например, для порт 80, обычно, используется для веб-сервера. Параметр sin_addr используется для указания адреса удалённого хоста. Для IPv4 протокола используется четырёх байтный адрес. Для локального тестирования можно использовать адрес 127.0.0.1 – адрес локального интерфейса (loop back). Номер порта и адрес передаются в сетевом формате: младший байт по младшему адресу.
Для передачи данных используются стандартные функции read и write, в качестве первого параметра для них передаётся дескриптор сокета. Закрыть соединение можно с помощью стандартной функции close.
Простой HTTP клиент
Протокол HTTP описан в RFC 2068. Все запросы и ответы передаются в текстовом виде. Чтобы запросит у сервера файл используется несколько типов запросов. Один из них GET. Например,
GET / HTTP/1.1
Host: lug.yaroslavl.ru
Connection: close
Это запрос корневого файла (обычно index.html) у хоста lug.yaroslavl.ru, после передачи файла сервер должен закрыть соединение. Обратите внимание на одну пустую строку в конце запроса. Этой строкой мы указываем серверу, что текст запроса окончен.
Ответ от сервера может иметь следующий вид:
HTTP/1.1 200 OK
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
<html></html>
Все доступные сетевые функции на ассемблере можно вызвать с помощью системного вызова socketcall. Первым параметром передаётся номер вызываемой функции (константы SYS_* из заголовочного файла net.h), а вторым указатель на параметры для вызываемой функции.
В примере, также, показан способ изменения цвета вывода на консоль с помощью ESC-последовательностей (man console_codes).
[code]
; Включаем заголовочные файлы с константами
%include "../include/unistd.inc"
%include "../include/socket.inc"
%include "../include/net.inc"
%include "../include/in.inc"
; Макрос преобразующий слово из представления хоста
; в сетевое представоление (host to network short)
%define htons(a) (( a >> 8 ) & 0xFF) | (( a & 0xFF ) << 8 )
; Макрос для системного вызова
; Первым параметром нередаётся номер системного вызова
%macro syscall 1
mov eax,%1
int 0x80
%endmacro
; Декскриптор стандартного вывода
%define STD_OUT 1
section .bss
; Дескриптор прослушиваемого сокета
listenfd resd 1
; Дескриптор присоединённого сокета
connfd resd 1
section .text
; Строки для вывода на экран
global _start
_start:
; Изменяем цвет шрифта консоли
; Параметры для write
mov ebx,STD_OUT ; вывод на стандартное устройство вывода
mov ecx,esc_console_green ; ESC последовательность
mov edx,esc_console_green_size ; длина ESC последовательности
syscall __NR_write
; Создаем сокет
; sock_fd = socket(AF_INET, SOCK_STREAM, 0);
; Парамеры для socket
push 0 ; протокол по умолчанию для IPv4
push SOCK_STREAM ; TCP соединение
push AF_INET ; IPv4
; Параметры для socketcall
mov ebx,SYS_SOCKET ; номер вызова функции socket
mov ecx,esp ; параметры находяться в стеке
syscall __NR_socketcall
add esp,3*4 ; очищаем стек, занятый 3мя параметрами для socket
mov [sock_fd],eax ; сохраняем дескриптор сокета
; Подключение
; connect(sock_df, servaddr, sizeof(sockaddr_in))
; Парамеры для connect
push sockaddr_in_size ; размер структуры sockaddr_in
push servaddr ; смещение структуры с адресом сервера
push dword[sock_fd] ; дескриптор сокета для подключения
; Параметры для socketcall
mov ebx,SYS_CONNECT ; номер вызова функции connect
mov ecx,esp ; парамерты находятся в стеке
syscall __NR_socketcall
add esp,3*4 ; очищаем стек, занятый 3мя параметрами для connect
; Отсылка запроса
; write(sock_fd, get_query, get_query, strlen(get_query))
; Параметры для write
mov ebx,[sock_fd] ; записать в сокет (отослать данные)
mov ecx,get_query ; запрос
mov edx,get_query_len ; длина строки запроса
syscall __NR_write
; Приём данных
; read(sock_fd, buffer, sizeof(buffer))
.recv:
mov ebx,[sock_fd] ; чтение происходит из сокета
mov ecx,buffer ; в буфер
mov edx,buffer_size ; размер буфера
syscall __NR_read
mov [buffer_readed],eax ; сохранение количества считанных байтов
; Если больше нечего читать или ошибка
; то заверщаем приложение
cmp eax,0
jng .exit
; Вывод принятых данных на экран
; write(STD_OUT, buffer, buffer_readed)
mov ebx,STD_OUT ; Вывод на стандартное устройство вывода
mov ecx,buffer ; из буфера считанных данных из сокета
mov edx,[buffer_readed] ; количество считанных байтов
syscall __NR_write
; Продолжаем чтение
jmp .recv
.exit:
; Возвращаем значения по умолчанию для консоли
; Параметры для write
mov ebx,STD_OUT ; вывод на стандартное устройство вывода
mov ecx,esc_console_defaults ; ESC последовательность
mov edx,esc_console_defaults_size ; длина ESC последовательности
syscall __NR_write
; Закрытие сокета
; Параметры для close
mov ebx,[sock_fd] ; дескриптор сокета
syscall __NR_close
; Выход из программы
xor ebx,ebx ; код выхода 0
syscall __NR_exit
section .data
servaddr istruc sockaddr_in
at sockaddr_in.sin_family, dw AF_INET ; IPv4
at sockaddr_in.sin_port, dw htons(80) ; HTTP порт
at sockaddr_in.sin_addr, db 217,15,135,71 ; IP адрес lug.yaroslavl.ru (в сетевом формате)
at sockaddr_in.__pad, dd 0,0 ; неиспользуемая часть структры должна содержать нули
iend
get_query db "GET / HTTP/1.1",0xd,0xa ; Запрос корневого файла (обычно index.html)
db "Host: lug.yaroslavl.ru",0xd,0xa ; Имя хоста должно обязательно присутствовать (смотри RFC2616 секцию 14.23)
db "Connection: close",0xd,0xa ; Чтобы сервер сразу после отдачи файла закрывал соединение
db 0xd,0xa ; Окончание запроса идентифицируется пустой строкой
get_query_len equ $ - get_query ; Длина сообщения запроса
esc_console_green db 0x1b,'[32m' ; ESC последовательность: установить зеленый цвет символов
esc_console_green_size equ $ - esc_console_green
esc_console_defaults db 0x1b,'[0m' ; ESC последовательность: сбросить все атрибуты в их значения по умолчанию
esc_console_defaults_size equ $ - esc_console_defaults
section .bss
; Дескриптор сокета
sock_fd resd 1
; Буфер для чтения из буфера и вывода на консоль
buffer resb 4096
; Размер буфера
buffer_size equ $ - buffer
; Количество считанных байт
buffer_readed resd 1
[/code]
Пример выводит на консоль зелёным цветом ответ от сервера, как изображено на рисунке.
Консоль с запущенным webclient
Ссылки:
www.rfc-archive.org – архив RFC (2068 - HTTP/1.1), 760 (IP), 761 (TCP));
http://www.wireshark.org – сетевой анализатор Wireshark;
http://www.codef00.com – графический отладчик EDB.
Настройка сети по протоколу L2TP на примере Ател.
1) Необходимо установить пакет xl2tpd
sudo apt-get install xl2tpd
2) Отредактируйте файл /etc/xl2tpd/xl2tpd.conf:
sudo gedit /etc/xl2tpd/xl2tpd.conf
Необходимо прописать в него следующее:
[global]
access control = yes
[lac corbina]
lns = l2tp.rybnet.ru
redial = yes
redial timeout = 1
require chap = yes
require authentication = no
name = <atel-user-name>
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
require pap = no
autodial = yes
где atel-user-name; - ваше имя пользователя в Ател.
3) Отредактируйте /etc/ppp/options.xl2tpd:
sudo gedit /etc/ppp/options.xl2tpd
Пропишите в него:
unit 0
name <atel-user-name>
remotename l2tp
ipparam atel
connect /bin/true
mru 1460
mtu 1460
nodeflate
nobsdcomp
persist
maxfail 0
nopcomp
noaccomp
defaultroute
replacedefaultroute
4) В /etc/ppp/chap-secrets добавьте строку (если её еще там нет):
<atel-user-name-without-brackets> * <atel-password-without-brackets>
Внесите изменения в /etc/init.d/xl2tpd:
sudo gedit /etc/init.d/xl2tpd
Необходимо поменять секцию start следующим образом:
start) if !([ -f /var/run/xl2tpd/l2tp-control ]) ; then mkdir -p
/var/run/xl2tpd touch
/var/run/xl2tpd/l2tp-control fi echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile
/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS echo "$NAME."
route add -host <host l2tp.rybnet.ru> gw <default-gw>
route add -host <dns-server-1> gw <default-gw>
route add -host <dns-server-2> gw <default-gw>
Здесь: host l2tp.rybnet.ru - L2TP-сервер провайдера, - первый DNS-сервер, - второй DNS-сервер. Шлюз по умолчанию определяются для каждого случая свой.
Для их определения можно воспользоваться командами:
host l2tp.rybnet.ru
cat /etc/resolv.conf
route -n
6) Пропишите в /etc/network/interfaces свои настройки сети для карточки:
auto lo eth0
iface lo inet loopback
address 127.0.0.1
netmask 255.0.0.0
iface eth0 inet dhcp
7) Отключите network-manager в списке запущенных приложений, чтобы не мешал работать стандартной дебиановской сетевой системе и позволил проинициализировать eth0 до того, как будет подниматься ppp0 через xl2tpd.
В наличии: Ubuntu 9.04, Gnome и предустановленный Gnome Network Manager и pptp-linux.
Естественно, у вас уже должно быть настроеное обычное соединение с сервером.
Нажимаем правой кнопкой мыши на апплете сети и выбираем "Edit Connections...".
Мы попадаем в программу настройки сетевых соединений. Выбираем вкладку VPN.
Если кнопка "Add" неактивна, нужно установить дополнительные пакеты.
Идем сюда. Выбираем дистрибутив (например interpid (8.10)).
Нам нужна секция "Сеть" (Network).
Ищем пакеты pptp-linux (основная библиотека) и network-manager-pptp (плагин для Gnome network manager).
Чтобы скачать пакет - нажмите на него, потом выберите архитектуру внизу страницы (i386 или amd64), на следующей странице выберите сервер, с которого будете качать пакет.
Сначала устанавливаем pptp-linux, потом network-manager-pptp, т.к. второй зависит от первого.
Чтобы установить пакеты, просто кликните мышкой два раза на пакете и следуйте указаниям (не обращайте внимания на предупреждения о том, что пакет уже находится в репозитории).
После того, как пакеты будут установлены - кнопка "Add" должна стать активной. Если этого не произошло - перегрузите компьютер и попробуйте еще раз.
Итак, добавляем новое соединение, нажимаем "Add".
Мы установили пакет pptp-linux как раз для того, чтобы в этом списке появился пункт PPTP. Выбираем его и нажимаем Create.
Вводим шлюз, имя пользователя и пароль. Можно поставить галочку "Connect automatically", чтобы мы каждый раз входили в сеть после перезагрузки автоматически.
Нажмем на кнопку "Дополнительно".
Если с первого раза соединиться не получится - узнайте у провайдера информацию о дополнительных опциях, таких как шифрование и выставьте их тут.
Вернемся к настройкам VPN. Если необходимо ввести свой ip адрес вручную - выбирайте вкладку IPv4 Settings.
По умолчанию стоит Automatic (VPN). Можно выбрать пункт меню Manual и настроить все вручную.
Нажимаем ок.
Наше соединение в списке. Таким образом можно добавить столько соединений, сколько вам нужно (например, если у вас несколько различных тарифов).
Закрываем настройки.
Теперь нажимаем левой кнопкой мыши на апплете сети.
В пункте "VPN Connections" должно появится ваше соединение. Просто нажмите на него чтобы соединиться.
В появившемся диалоге нажмите "Always Allow" и он больше не появится.
На этом все. Если у вас будут проблемы с соединением - в первую очередь консультируйтесь с провайдером на предмет наличия дополнительных настроек (обычно пользователям дают инструкцию с такими настройками при заключении договора, так что поройтесь в бумагах)
1. Устанавливаем apache:
sudo apt-get install apache2 libapache2-mod-auth-mysql
2. Устанавливаем php:
sudo apt-get install php5-common php5 libapache2-mod-php5 php5-cli php5-cgi php5-mysql
Перезапустим apache:
sudo /etc/init.d/apache2 restart
Проверим работоспособность php. Для этого создаем файл /var/www/test.php и поместим в него следующие строки:
<?php
print_r (phpinfo());
?>
Запускаем Firefox и вводим адрес http://localhost/test.php. На экране должна отобразиться служебная информация о php.
3. Устанавливаем MySQL:
sudo apt-get install mysql-server mysql-client
Во время установки будет запрошен ввод пароля root-а MySQL-ного сервера.
4. Ставим phpmyadmin.
phpmyadmin - веб-инструмент для управлениями MySQL-ными базами данных. Очень удобный инструмент для разработчиков.
Установим командой:
sudo apt-get install phpmyadmin
Во время установки от нас запросят об используемом веб-сервере - выбираем "apache2".
Вход в phpmyadmin: http://localhost/phpmyadmin
З.Ы. Подключение модулей:
Включить их можно командой:
sudo a2enmod имя_модуля
Например, подключение модуля mod_rewrite:
sudo a2enmod rewrite
После подключения модулей необходимо перезапустить apache:
sudo /etc/init.d/apache2 restart
Вот в принципе еще ) Тока тока поднимал - решил описать действия )
Пример настройки провайдера "Атэл" в г. Рыбинск
1. Установка
Для установки PPTP клиента под FreeBSD необходимо установить из портов пакет pptpclient Скачать эти пакеты можно с официального ftp сервера FreeBSD.
Чтобы установить эти пакеты, в системе FreeBSD используется команда pkg_add(1). С правами администратора запустите следующие команды:
# pkg_add /путь до пакета/pptpclient-1.7.2.tgz
2. Настройка
в /etc/rc.conf должно быть это :
ifconfig_rl0="DHCP"
ifconfig_rl0="Локальный IP netmask 255.255.0.0"
Для настройки ppp добавьте следующие строки в файл /etc/ppp/ppp.conf
vpn:
set device "!pptp 10.0.0.1 --nolaunchpppd"
disable ipv6cp
disable acfcomp
disable protocomp
set mtu max 1492
disable lqr
disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
deny pred1 deflate deflate24 protocomp acfcomp shortseq vj
disable mppe
#enable dns
set openmode passive
delete ALL
alias enable yes
nat enable yes
set authname 745-09-2008
set authkey пароль
set timeout 0
set ifaddr 0 0
add default HISADDR
где 745-09-2008 - имя пользователя для авторизации на VPN сервере, а пароль - его пароль.
3. Запуск и остановка
Подключение к VPN серверу выполняется командой, запущенной с правами администратора:
# /usr/local/sbin/pptp 10.0.0.1 vpn &
При успешном подключении создастся интерфейс tunX, где X - цифра. Через этот интерфейс и пойдёт весь трафик.
Пример
home# ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether 00:55:d0:fb:1d:11
inet6 fe80::255:d0ff:fefb:1d11%rl0 prefixlen 64 scopeid 0x1
inet 10.0.152.147 netmask 0xffff0000 broadcast 10.0.255.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> metric 0 mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1460
inet 62.33.93.56 --> 10.128.0.0 netmask 0xffffffff
Opened by PID 950
Разорвать соединение можно послав сигнал TERM (15) командой kill процессу pptp.
Настройка firewall'а
Протокол PPTP использует следующие порты и протоколы:
На сервере - порт 1723, протокол TCP.
У клиента (т.е. у Вас) - некий верхний порт (>1023), протокол TCP.
С обеих сторон - протокол GRE (для создания туннеля).
Если у Вас на машине установлен firewall, его необходимо настроить с учётом этих данных. Смотрите руководство на программное обеспечение, отвечающее за firewall в Вашей операционной системе.





