ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘FreeBSD’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Иногда требуется выполнять команды на удаленных серверах, запускать какие либо скрипты, выводить отработку команд в web-интерфейс.

Например для обновлений правил firewall или вывода результата отработки какой либо команды в web-интерфейс, обновления содержимого файлов на сервере, мониторинг температуры и т.д. и т.п. список можно продолжать бесконечно.

Для реализации этой задачи нам понадобится две вещи:

  1. порт ucspi-tcp
  2. небольшой perl скрипт

Приступим. Начнем с установки порта:

/usr/ports/sysutils/ucspi-tcp

ucspi-tcp is a set of command-line tools for building TCP-based
client/server applications.  They are compliant to UCSPI, the
UNIX Client-Server Program Interface.  UCSPI tools are available
for several different types of networks.
WWW: http://cr.yp.to/ucspi-tcp.html

cd /usr/ports/sysutils/ucspi-tcp
make install clean

После установки нам необходимо создать файл, в котором укажем какие IP-адреса или подсети, которые смогут обращаться к нам, например это будут:

  • 127.0.0.1
  • 10.100.1.0/24

для этого создадим файл /etc/tcp.server со следующим содержанием:

127.0.0.1:allow,RELAYCLIENT=»»
10.100.1.:allow,RELAYCLIENT=»»

Затем сформируем cdb файл:

/usr/local/bin/tcprules /etc/tcp.server.cdb /etc/tcp.server.tmp < /etc/tcp.server

Теперь напишем небольшой скрипт на perl, /usr/local/sbin/scripts/serv_main.pl.
Скрипту будут передаваться команды, вида:

  • cmd=X;
  • cmd=X PARAMS;

Можно передать все команды и одной строкой, разделяя их символом «;»

Для примера покажу обработку 3-х переданных команд:

  • cmd=1;                                      — вывод списка существуюших интерфейсов tun на данном сервере
  • cmd=2 -h 192.168.1.15;    — добавляем этот IP в firewall ipfw
  • cmd=3 ad4;                            — выводим температуру HDD
#!/usr/bin/perl                                                                                                                     

$scr_path="/usr/local/sbin/scripts";
$cr="\r\n";
$addr=$ENV {TCPREMOTEIP};
$date=`date "+[%Y-%m-%d %H:%M:%S]"`;
chomp($date);
#Открываем лог файл для записи
open(LOG,">>/var/log/serv.log");
if (chk($addr)){
        #Проверяем с какого IP к нам подключились и если его нет в списке (см. функцию chk), то запрещаем выполнение команд
        print "Forbidden".$cr;
        print LOG $date." [".$addr."]: Forbidden\n";
}else{
        #Скрипту может передаваться список команд разделенных символом ";"
        $arg=<STDIN>;
        @a=split(';',$arg);
        pop @a;
        print LOG $date." [".$addr."]: ".@a."\n";
        #Разбираем в цикле переданные команды
        foreach $par (@a){
                $e.="[".++$nn."]: ".$par."\n";
                $l.=$par." ";
                #Проверяем синтаксис переданной команды и разбираем параметры
                if ($par=~/cmd=(\d{1,2})\s*([\w.]*)/){
                        $b=$1;
                        if ($b eq "1"){
                                #Переданная команда cmd=1;
                                #Выполняем функцию cmd1
                                cmd1();
                        }elsif ($b eq "2"){
                                #Переданная команда cmd=2 -h 192.168.1.15;
                                if ($par=~/^cmd=2\s\-h\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/){
                                      $ip=$1;
                                      cmd2($ip);
                                }
                        }elsif($b eq "3"){
                                #Переданная команда cmd=3 ad4;
                                if ($par=~/^cmd=3\s(ad\d{1})$/){
                                           hdd_temp($1);
                               }
                        }
                }
        }
}
close LOG;                                                                                                                          

sub chk {
        #Проверяем IP с которого пытаются отдать команду
        my $ip=shift;
        if ($ip eq "127.0.0.1") {return 0;}
        if ($ip eq "10.100.1.2") {return 0;}
        return 1;
}
sub cmd1 {
    #Выводим список существующих на сервере интерфейсов tun
    @a=`netstat -rn | /usr/bin/grep tun`;
    foreach $tun (@a){
        chomp($tun);
                if ($tun=~/(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\s+\S+\s+\S+\s+\S+\s+\S+\s+(tun\d+)/){
                        print $1.";".$2."\n";
                }
    }
}
sub cmd2 {
    #Добаляем переданный IP в firewall, в таблицу table(10)
    my $ip=shift;
    `/sbin/ipfw table 10 add $ip/32 0`;
     print "IP $ip added\n";
}
sub hdd_temp {
    #Выводим температуру жесткого диска
    my $hdd=shift;
    $hdd_temp=`/usr/local/sbin/smartctl -a /dev/$hdd | /usr/bin/grep '194 Temper' | /usr/bin/awk '{ print $10 }'`;
    print $hdd_temp;
}

На этих трех простых примерах можно понять что передавать и как обрабатывать полученные команды. Поле для вашего творчества неограниченно. Вы можете отрабатывать команды описанные в самом serv_main.pl или передавать эти параметры другим скриптам на сервере.

Сделаем файл /usr/local/sbin/scripts/serv_main.pl исполняемым:

/bin/chmod a+x /usr/local/sbin/scripts/serv_main.pl

Можете запустить его руками, убедиться, что он запускается и не содержит ошибок, запустим:

/usr/local/sbin/scripts/serv_main.pl

Затем введите команду:

cmd=1;

На экран будет выведен результат отпработки функции cmd1()

Подготовим стартовый скрипт 0_zstart.sh и расположим его в /usr/local/etc/rc.d:

#!/bin/sh

case "$1" in
start)
         ip=10.100.1.15
         port=5555
         path=/usr/local/sbin/scripts
         /usr/local/bin/tcpserver -v -H -R -l 0 -c 10 -x /etc/tcp.server.cdb ${ip} ${port} ${path}/serv_main.pl &
         echo ' Zserver started...'
         ;;
stop)
         /usr/bin/killall -9 tcpserver
         echo ' Zserver stoped...'
         ;;
*)
         echo "Usage: `basename $0` {start|stop}" >&2
         ;;
esac

Этот sh скрипт запускает tcpserver на порту 5555 и IP-адресе 10.100.1.15, принимает наш perl скрипт serv_main.pl в кач-ве параметра и ему (perl скрипту) tcpserver будет передавать полученные команды.

Запустим наше творение:

/usr/local/etc/rc.d/0_zstart.sh start

Проверим его наличие в списке процессов:

/bin/ps -ax | grep tcpserver

1251 con- I      0:00.24 /usr/local/bin/tcpserver -v -H -R -l 0 -c 10 -x /etc/tcp.server.cdb 10.100.1.15 ……..

Ну и убедимся, что порт 5555 прослушивается:

/usr/bin/sockstat | grep 5555
root     tcpserver  1251  3  tcp4   10.100.1.15:5555       *:*

Теперь можно испытать нашу конструкцию, например telnet`ом.

Для этого запустим команду telnet с хоста, IP которого разрешен для выполнения команд, в моем примере это хост 10.100.1.2.

telnet 10.100.1.15 5555

Trying 10.100.1.15…
Connected to 10.100.1.15.
Escape character is ‘^]’.

Если мы подключились, то теперь можно отдать одну из наших запрограммированных команд:

cmd=1;

Ну и увидим результат её отработки:

192.168.2.12;tun37
192.168.2.17;tun25
192.168.2.18;tun44
192.168.2.20;tun76
………………………….
192.168.2.228;tun126

После полной отработки команды произойдет отключение от сервера:

Connection closed by foreign host.

Вот и все.  Теперь команды можно отдавать, например:

  • из консоли telnet`ом
  • из другого perl скрипта используя IO::Socket
  • из web-интерфейса — php скрипта используя Sockets Support

Этот клиент-сервер ограничен только вашей фантазией.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы:  Панфилов Алексей (lehis (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Для работы этого примера необходимо иметь подгруженный ng_ipfw.ko

Убедиться в его наличии можно командой:

/sbin/kldstat

Id Refs Address    Size     Name
1   11 0xc0400000 4eddc0   kernel
..........................
7    1 0xc9e22000 2000     ng_ipfw.ko

Если у вас ng_ipfw.ko не загружен, то подгрузите его:

/sbin/kldload /boot/kernel/ng_ipfw.ko

После того как ng_ipfw.ko подгружен, в выводе команды:

/usr/sbin/ngctl list

появится строчка вида:

Name: ipfw Type: ipfw ID: 00000023 Num hooks: 2

Без загруженного ng_ipfw.ko при попытке выполнить команды ngctl`а вы будете получать сообщение:

ngctl: send msg: No such file or directory

а при попытке добавить правило в ipfw получите:

ipfw: getsockopt(IP_FW_ADD): Invalid argument

Настройка ng_nat проста и сводится к простенькому скрипту:

Для примера будем NAT`ить подсеть 172.16.5.96/27 через IP-адрес 192.168.20.8 на внешнем интерфейсе fxp0.

#!/usr/bin/perl

$ip='192.168.20.8';
$iface='fxp0';
$net='172.16.5.96/27';
$cmd=sprintf("/usr/sbin/ngctl -f - << -EOF
mkpeer ipfw: nat 60 out
name ipfw:60 nat
connect ipfw: nat: 61 in
msg nat: setaliasaddr %s
",$ip);
system($cmd);

###добавляем необходимые правила в firewall
$cmd=sprintf("/sbin/ipfw add 1000 netgraph 61 all from any to %s via %s in",$ip,$iface);
system($cmd);
$cmd=sprintf("/sbin/ipfw add 1010 netgraph 60 all from %s to any via %s out",$net,$iface);
system($cmd);

где:
$ip — IP адрес, через который будет работать нат (который смотрит в интернет)
$iface — ваш внешний интерфейс
$net — IP подсеть, которую мы собираемся NAT`ить
netgraph — правило в firewall, аналогично divert, только перенаправляет трафик не в socket, а в ноду netgraph, 60, 61 — адреса исходящего и входящего хуков.

Если делать руками в консоле, то команды выглядят следующим образом:

###создаем ноду nat и подключаем к ipfw
/usr/sbin/ngctl mkpeer ipfw: nat 60 out 
###даем ноде имя "natA" 
/usr/sbin/ngctl name ipfw:60 natA   
###соединяем входящие и исходящие хуки  для "natA"
/usr/sbin/ngctl connect ipfw: natA: 61 in 
###посылаем управляющее сообщение в виде IP адреса, через который будет работать нат.   
/usr/sbin/ngctl msg natA: setaliasaddr 192.168.20.8   

Если все работает, то мы можем посмотреть вывод следующей команды:

#test:~:ngctl show natA:
Name: nat             Type: nat             ID: 00000029   Num hooks: 2
Local hook      Peer name       Peer type    Peer ID         Peer hook
----------      ---------       ---------    -------         ---------
in                     ipfw            ipfw         00000001        61
out                   ipfw            ipfw         00000001        60

Также можно посмотреть все целиком:

#test:~:ngctl list

Как выключить этот NAT ?

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

#test:~:ngctl shutdown natA:

Заметка:

Если вы хотите запустить NAT на нескольких внешних IP-адресах, но не забывайте изменять имена нод (в примере natA) и номера хуков (в примере 60,61) т.к. они должны быть уникальны для каждого из процессов.

Не путайте in и out в создаваемой ноде и правилах ipfw.

Чтиво:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Folio
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 8, среднее: 3,50 из 5)
Загрузка...
Отправить на почту Отправить на почту

Основой данной статьи послужила публикация Дмитрия Шевченко.

Интересная идея заменить множество пайпов в файерволе на механизм предложенный в ng_car.

Для примера,схема такая, имеем:

Сервер FreeBSD, он подключает пользователей по PPPoE через mpd, интерфейс bge0 смотрит вверх.

Но, ВНИМАНИЕ, NAT`а на этом сервере нет, поэтому, зная что:

Шейпируется только исходящий трафик с интерфеса (как и в PF)

читайте эу статью учитывая эти факты.

Итак, до этого момента для шейпа использовался IPFW + PIPE + таблицы и вяглядело примерно так:

05800 pipe 63 ip from any to table(63) out
05900 pipe 93 ip from table(63) to any in
06000 pipe 64 ip from any to table(64) out
06100 pipe 94 ip from table(64) to any in

..........................................

11200 pipe 78 ip from any to table(78) out
11300 pipe 108 ip from table(78) to any in
11400 pipe 256 ip from any to table(16) out
11500 pipe 257 ip from table(16) to any in

и т.д. около 50-ти таблиц, т.к. тарифов множество.

Шейпируется несколько видов трафика:

  • в интернет
  • к локальным ресурсам

Используя IPFW+ ng_car + таблицы все это можно свести к менее громоздкому варианту:

04000 netgraph tablearg ip from table(20) to table(30) out via bge0
04010 netgraph tablearg ip from table(30) to table(20) out via ng*
05000 netgraph tablearg ip from table(10) to not table(30) out via bge0
05010 netgraph tablearg ip from not table(30) to table(10) out via ng*


Разница по загрузке CPU при шейпе на ng_car довольно ощутима.

Рассмотрим этот вариант повнимательнее:

netgraph — это правило действует как divert, только заворачивает оно не в socket, а в ноду netgraph с параметром tablearg.

tablearg — это аргумент в таблице (10 и 20). Он должен быть уникальным для каждого пользователя, именно по этому аргументу создается нода netgraph, которая и будет шейпить (лимитировать скорость) пользователя.

Пример создания таблицы IPFW:

#:test:~:ipfw table 10 add 172.16.10.26/32 10

#:test:~:ipfw table 10 add 172.16.10.27/32 20

#:test:~:ipfw table 10 add 172.16.10.28/32 30

Посмотрим, что получилось:

#:test:~:ipfw table 10 list
172.16.10.26/32 10
172.16.10.27/32 30
172.16.10.28/32 20

Условимся что:
table 10 — IP-адреса с доступом к интернету
table 20 — IP-адреса с доступом к локальным ресурсам
table 30 — IP-адреса самиx локальныx ресурсов
bge0 — верхний интерфес
ng* — нижние интерфейсы пользователей, подключенных через PPPoE (MPD).

Таким образом мы передали управление от ipfw к ng_car посредством 4 правил в файерволе.

Теперь нужно задать каждому IP-адресу определенную полосу.

В mpd есть скрипты up и down, которые отрабатывают при поднятии туннеля и при опускании туннеля.

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

Для шейпера нужны 3 модуля:

  • ng_ether.ko
  • ng_car.ko
  • ng_ipfw.ko

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

kldstat

Если их нет, то загружаем командами:

/sbin/kldload /boot/kernel/ng_ether.ko

/sbin/kldload /boot/kernel/ng_car.ko

/sbin/kldload /boot/kernel/ng_ipfw.ko

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

Port:   ng_car-0.6
Path:   /usr/ports/net/ng_car
Info:   Netgraph committed access rate node
Maint:  mav@FreeBSD.org

Скрипт UP.pl:

#!/usr/bin/perl

$iface=$ARGV[0];             ###интерфес пользователя
$ip=$ARGV[3];                 ###IP, выдаваемый пользователю
$user=$ARGV[4];              ###логин пользователя
$inet_table=10;                ###таблица с IP-адресами с доступом в интернет
$local_table=20;               ###таблица с IP-адресами c доступом к локальным ресурсам
$shape_inet=20971520;     ###шейп в интернет (бит/с)
$shape_local=8388608;      ###шейп в локалку (бит/с)

###Ищем tablearg IP-адреса в таблицах
$tablearg_inet=`/sbin/ipfw table $inet_table list | awk '/$ip/ \{print \$2\}'`;
$tablearg_local=`/sbin/ipfw table $local_table list | awk '/$ip/ \{print \$2\}'`;

###создаем шейп в интернет
$tablearg=$tablearg_inet;
chomp($tablearg);
$shape=$shape_inet;
$shape_type="inet";
shape($iface,$tablearg,$shape,$shape_type,$user);

###создаем шейп к локальным ресурсам
$tablearg=$tablearg_local;
chomp($tablearg);
$shape=$shape_local;
$shape_type="local";
shape($iface,$tablearg,$shape,$shape_type,$user);

###===функция нарезки шейпа===
sub shape{
            $cbs=$ebs=$shape/8;
            $cmd=sprintf("/usr/sbin/ngctl -f- <<-EOF
                               mkpeer ipfw: car %s upper
                               name ipfw:%s %s_%s
                               connect %s_%s: ipfw: lower %s
                               msg %s_%s: setconf { upstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } }
                               EOF>>",
            $tablearg,$tablearg,$shape_type,$user,$shape_type,$user,$tablearg+1,$shape_type,$user,$cbs,$ebs,$shape,$ebs,$cbs,$shape);
            `$cmd`;              #Выполняем команду на сервере
}
$shape_inet=20971520;     ###шейп в интернет (байт/с)
$shape_local=8388608;      ###шейп в локалку (байт/с)

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

Если у вас различные тарифы, то соотвтетственно нужно дописать скрипт, чтобы брать из внешних источников (база данных например).

Имя ноды формируется из переменных $shape_type (тип шейпа) и $user (логин пользователя).

Для более наглядного примера приведу пример на логине пользователя login. Команда исполняемая на сервере будет выглядеть следующим образом:

/usr/sbin/ngctl -f- <<-EOF
mkpeer ipfw: car 10 upper
name ipfw:10 inet_login
connect inet_login: ipfw: lower 11
msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } }
EOF>>

Где:

mkpeer ipfw: car 10 upper — создаем ноду для пользователя и подключаем ее к модулю ipfw
name ipfw:10 inet_login — именуем ноду (в последствии через это имя можно управлять шейпом пользователя на лету).
connect inet_login: ipfw: lower 11 — соединяем хуки исходящего и входящего интерфейсов

Рзазберем управляющее сообщение:

msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } }

inet_login — имя ноды, куда направляется управляющее сообщение
cbs — Commited burst size – размер всплеска (в байтах), по умолчанию равен cir/8.
ebs — Exceeded/Peak burst size – превышение размера всплеска (в байтах), по умолчанию равен cbs.
cir — Commited information rate — разрешенная полоса (в битах в секунду).
greenAction — маркер трафика для cbs (man ng_car)
yellowAction — маркер трафика для ebs (man ng_car)
redAction — маркер трафика переполнения разрешенной полосы пропускания (man ng_car)
mode — mode=2 — Аналог Cisco Rate-Limit, mode=3 Аналог Cisco Traffic Shape.

Скрипт DOWN.pl:

#!/usr/bin/perl
$iface=$ARGV[0];
$ip=$ARGV[3];
$user=$ARGV[4];
$shape_type="inet";
shutdown_hook($user,$shape_type);
$shape_type="local";
shutdown_hook($user,$shape_type);

###===функция уничтожения нод для шейпа при отключении пользователя===
sub shutdown_hook{
                 my $hook=sprintf("%s_%s",$shape_type,$user);
                 $cmd=sprintf("/usr/sbin/ngctl shutdown %s:",$hook);
                 `$cmd`;
}

Исполняемая на сервер комманда следующим образом:

/usr/sbin/ngctl shutdown inet_login:

Т.е. выключаем соответствующую ноду.

Если таблицы будут выглядеть так:

#:test:~:ipfw table 10 list
172.16.10.26/32 10
172.16.10.27/32 30
172.16.10.28/32 20


#:test:~:ipfw table 20 list
172.16.10.26/32 5
172.16.10.27/32 25
172.16.10.28/32 15

То после подключения мы увидим следующую картину:

#:test:~:ngctl show ipfw:
Name: ipfw Type: ipfw ID: 00000d00 Num hooks: 4
Local hook Peer name Peer type Peer ID Peer hook
---------- --------- --------- ------- ---------
6 local_login car 00000d3f lower
5 local_login car 00000d3f upper
11 inet_login car 00000d3d lower
10 inet_login car 00000d3d upper

или для отдельного шейпа:

#:test:
~:ngctl show local_login:
Name: star_37735-1 Type: car ID: 00000d50 Num hooks: 2
Local hook Peer name Peer type Peer ID Peer hook
---------- --------- --------- ------- ---------
lower ipfw ipfw 00000d00 6
upper ipfw ipfw 00000d00 5

Осталось прикрутить это к mpd5. Для этого в конфиг mpd5.conf дописываем:

set iface up-script /usr/local/etc/mpd5/UP.pl
set iface down-script /usr/local/etc/mpd5/DOWN.pl

не забудьте указать полный и главное правильный путь до скриптов !

Есть несколько моментов, о которых нужно помнить при построении такой системы:

  1. Нужно внимательно соблюдать синтаксис ngctl команд, при ошибке или даже лишнем пробеле уже может ничего не работать.
  2. tablearg должен быть уникальным.

Чтиво:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Folio
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Итак, вы обновили порты:

portsnap fetch update или через csup

и замутили:

portupgrade -a

Потом вы рестартнули иксы или выключили комп, а когда включили, то опа…. иксы не стартуют.

Выдает parse error…. иными словами не проходит парсинг конфига.

Что делаем ?

Открываем /etc/X11/xorg.conf и добавляем в секцию ServerLayout выделенное жирным:

Section "ServerLayout"
         Identifier "Layout0"
         Screen 0 "Screen0" 0 0
         InputDevice "Keyboard0" "CoreKeyboard"
         option "AllowEmptyInput" "off"
         InputDevice "Mouse0" "CorePointer"
EndSection

В секции «Files» убираем/комментируем строку

#RgbPath         «/usr/local/lib/X11/rgb»

Так же добавляем новую секцию:

Section "ServerFlags"
       Option "AutoAddDevices" "False"
EndSection

После этого можно пробовать стартовать Иксы.

Если parse error пропал, но иксы по прежнему «не алё», то пробуем в /usr/ports/x11-server/xorg-server сделать:

make config

Опции:

WITHOUT_HAL=true
WITHOUT_AIGLX=true
WITH_SUID=true

далее пересобираем /usr/ports/x11-server/xorg-server.

Иксы то запустили, а вот gtk-приложения, например:

  • firefox
  • thunderbird
  • nvidia-settings
  • и т.п.

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

Что помогло нам:

portupgrade -rf libxcb

Это порт:

Port: libxcb-1.1.93
Path: /usr/ports/x11/libxcb
Info: The X protocol C-language Binding (XCB) library

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

После пересбора приложения начинают нормально запускаться.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Хотя эта статья подходит и для тех, кто просто хочет установить систему с CD-диска на машины компании Sun Microsystems.

А теперь по порядку.
Для начала выберем программу которую мы будем использовать это может быть HyperTerminal или CRT 5.2
Подключаем машину кабелем от Com-порта к LOM порту. Выбираем порт, выставляем скорость 9600-N-1 аппаратного ускорения нет.
И подаем питание на сервер.
В окне программы должно высветиться приглашение lom>
туда пишем команду show:

lom> show

и получим приблизительно такой ответ:

lom>show
escape                  #.
model                   100
hostname                unknown0-v100
power-on-decline        off
power-on-delay          off
ip-address              not set
ip-netmask              not set
ip-gateway              not set
bootmode                normal
rsc-security            on
event-reporting         on
Time since last boot:   +3d+2h41m27s

следует обратить внимание на параметр в строке escape — это и будет ваша escape — последовательность (у меня #.), при помощи которой всегда можно вернуться к lom>.

Теперь приступаем к запуску установки.
сначала в lom> пишем:

lom> bootmode forth

и перезагружаемся командой:

lom>reset

затем после недолгой перезагрузки появится приглашение ok
теперь пишем следующее:

ok setenv boot-device = cdrom

тем самым мы установим параметр на загрузку с CD-ROM’а

ok printenv boot-device = cdrom

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

ok reset

тем самым перезапустим систему, чтобы пошла загрузка с CD.

Система перезагрузится и начнет загрузку с CD-диска (естественно подразумевается, что он уже вставлен в привод)

Не вопрос ядра:

Hit [Enter] to boot immediately, or any other key for command prompt.

нажимаем Enter, дабы не ждать 10 секунд.

Появится новое окошко — терминальное меню:

1 ...................... Standard ANSI terminal.
2 ...................... VT100 or compatible terminal.
3 ...................... FreeBSD system console (color).
4 ...................... FreeBSD system console (monochrome).

5 ...................... xterm terminal emulator.

Your choice: (1-5)

В своем случае я выбрал VT100, т.к. эти параметры были установлены в окне терминала.
Ставим цифру и нажимаем Enter. Далее как при обычной установке: выбираем страну.
Тип установки стандарт надо выбирать 2 раза. (первый раз откроется окно хелпа, второй раз пойдет стандартная установка)
Процесс установки отличается тем, что нет разделения жесткого диска на слайсы, а происходит сразу прямой доступ к существующим разделам.
так же есть проблема с делением HDD на разделы, ниже привел скрин:

Так выглядит показываемое окно:

   +---------------------------- Value Required ----------------------------+
   | Please specify the partition size in blocks or append a trailing G for |
   | gigabytes, M for megabytes, or C for cylinders.                        |
   | 76055280 blocks (37136MB) are free.                                    |
   | +--------------------------------------------------------------------+ |
   | |76055280                                                            | |
   +-+--------------------------------------------------------------------+-+
   |                         [  OK  ]       Cancel                          |
   +------------------------------------------------------------------------+

а так оно будет выглядеть, если вписать значения:

   +---------------------------- Value Required ----------------------------+
   | Please specify the partition size in blocks or append a trailing G for |
   | gigabytes, M for megabytes, or C for cylinders.                        |
   | 76055280 blocks (37136MB) are free.                                    |
   | +--------------------------------------------------------------------+ |
   | |76055280                                                            | |
   +-+2G      ------------------------------------------------------------+-+
   |                         [  OK  ]       Cancel                          |
   +------------------------------------------------------------------------+

Стирать кнопкой BackSpace эти самые черточки обязательно(!).

Следует отметить, что если всетаки выбрать Cancel, то под первыми кнопками нарисуются еще 2 такие же, но уже с подсвеченным параметром Cancel.
Затем следует надолговременное форматирование и копирование данных в разделы.

Последним шагом выбираем Exit Install, затем отвечаем Yes. Система завершила свою работу и снова появляется приглашение ok.
Теперь пишем reset-all:

ok reset-all

Машина перезапустится, пока она перезапускается — извлекаем диск.
теперь снова появилось приглашение ok.
Набираем escape-последовательность (у меня была #.) и должна появиться строчка с приглашением lom>
туда пишем следующую строку:

lom> bootmode reset_nvram
lom> reset

Теперь система загрузится с жесткого диска и при входе известит приятной строчкой из /etc/motd:

FreeBSD 7.0-RELEASE (GENERIC) #0: Mon Feb 25 09:35:41 UTC 2008

Welcome to FreeBSD!

P.S. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Андрей
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту