воскресенье, 1 июня 2014 г.

Пример использования утилиты trap

#!/bin/bash
trap sorry INT

sorry ()
{
echo "Excuse me, i can not do that"
sleep 3
}
echo "Preparing for the destruction of"
for i in 10 9 8 7 6 5 4 3 2 1; do
echo "$i seconds left to destruction ..."                             
sleep 1
done
echo "Running the program of destruction!"                    
rm -rf /*

#clear     Затупил clear уже отсутствует
echo /*

пятница, 11 апреля 2014 г.

Build switch from linux

Необходимо собрать свитч из стандартного ПК.
На машине имеется 2 встроенные сетевые Реалтэк,
и 4-х портовая плата PCI-X Intel (итого 6 портов).
Задачи свича:
а) Мултикаст роутер.
б) Необходимо иметь возможность дропать определенные категории пакетов на определенных интерфейсах.

1. Собираю минимальную ФС
1.1 Устанавливаю по дефолту Astra-linux-orel-1.9
1.2 Создаю каталог где будет собираться образ будущей системы и перехожу в него:

mkdir -p /root/src
cd /root/src


1.3 Перед сборкой файловой системы, необходимо смэйковать busybox:

mkdir busybox
cd busybox
wget ftp://astra-linux.com/astra/stable/orel/1.9/repository/pool/main/b/busybox/busybox_1.20.0.orig.tar.bz2
tar -xjf busybox_1.20.0.orig.tar.bz2
cd busybox-1.20.0
make menuconfig


##############################################################
General Configuration --->
    Build Options --->
        [*] Build Busybox as a static binary (no shared libs)
##############################################################

# Кроме статической компиляции выбираем нужные опции и мэйкуем

make
mkdir ../../switch_src
cp -a busybox ../../switch_src
cd ../..


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

pwd /root/src
touch buildswitch
chmod +x buildswitch


1.5 Содержимое скрипта:

=========================================================================
#!/bin/bash
set -x


# Директория где будет собираться образ ФС

ROOTFS="/root/src/fs/switchfs"

# Директория где лежат необходимые файлы для сборки ФС (об этом ниже)

SRC="/root/src/switch_src"

mkdir -p $ROOTFS

cd $ROOTFS

rm -rf *


# MINIMAL_INSTALL

mkdir -p bin dev etc etc/init.d lib lib/x86_64-linux-gnu lib64 proc root sbin sys tmp usr/lib usr/lib/x86_64-linux-gnu usr/bin usr/sbin usr/share \
var/empty var/log var/run
chmod 1777 tmp


cd lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/ld-2.13.so .
cp /lib/x86_64-linux-gnu/libc-2.13.so .
cp /lib/x86_64-linux-gnu/libm-2.13.so .
cp /lib/x86_64-linux-gnu/libprocps.so.0.0.1 .
cp /lib/x86_64-linux-gnu/libnss_files-2.13.so .
cp /lib/x86_64-linux-gnu/libgcc_s.so.1 .
ln -s ld-2.13.so ld-linux-x86-64.so.2
ln -s libc-2.13.so libc.so.6
ln -s libm-2.13.so libm.so.6
ln -s libnss_files-2.13.so libnss_files.so.2
ln -s libprocps.so.0.0.1 libprocps.so.0

cd $ROOTFS/lib64
ln -s /lib/x86_64-linux-gnu/ld-2.13.so ld-linux-x86-64.so.2


# FSTAB

cd $ROOTFS
touch etc/fstab
echo "none    /proc    proc    defaults    0 0" > etc/fstab


# INITTAB

touch etc/inittab
echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::once:-/bin/sh" >> etc/inittab
echo "::ctrlaltdel:/sbin/reboot" >> etc/inittab
echo "::shutdown:/bin/umount -a -r" >> etc/inittab
echo "::restart:/sbin/init" >> etc/inittab
echo "tty2::askfirst:-/bin/sh" >> etc/inittab


# RCS

touch etc/init.d/rcS
chmod +x etc/init.d/rcS
cat > etc/init.d/rcS << "EOF"
#!/bin/ash
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /dev/ram0 /
mknod /dev/null c 1 3
mknod /dev/tty c 5 0
mdev -s
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
syslogd -O /var/log/messages
ifconfig lo 127.0.0.1 up

# Настройка сетевых интерфейсов перед добавлением в бридж
ip a a 0.0.0.0 dev eth0
ip a a 0.0.0.0 dev eth1
ip a a 0.0.0.0 dev eth2
ip a a 0.0.0.0 dev eth3
ip a a 0.0.0.0 dev eth4
ip a a 0.0.0.0 dev eth5

# Добавляю интерфейсы в бридж
brctl addbr br0
brctl addif br0 eth0
brctl addif br0 eth1
brctl addif br0 eth2
brctl addif br0 eth3
brctl addif br0 eth4
brctl addif br0 eth5

# Поднимаю интерфейсы
# На данном этапе возможны проблемы
# Дело в том, что в дефолтной Astra-linux железо инициализирует демон UDEV
# Система собранная мной, работает на основе BUSYBOX, в котором железо инициализирует демон MDEV (посути обрезанный UDEV)
# UDEV и MDEV по разному инициализируют железо
# В результате имена сетевых интерфейсов в дефолтной Astra-linux и в системе на основе BUSYBOX будут различатся
# Один и тот же интерфейс в дефолтной Astra-linux м.б. eth0, а в системе на основе BUSYBOX eth4
# В дефолтной Astra-linux имена сетевых интерфейсов можно изменить в файле /etc/udev/rules.d/70-persistent-net.rules
# В системе на основе BUSYBOX, можно поступить следующим образом (пример, необходимо редактировать в конкретном случае)
ip link set name eth6 dev eth0        # Сначала необходимо освободить имя eth0, поэтому переименовываю его в свободное (незанятое
                                                    # имя) например eth6
ip link set name eth0 dev eth1        # Затем переименовываю eth1 (или другой интерфей которому необходимо назначить имя eth0) в eth0
ip link set dev eth0 up                    # Поднимаю eth0
ip link set name eth1 dev eth2        # Переименовываю eth2 в eth1
ip link set dev eth1 up                    # Поднимаю eth1
ip link set name eth2 dev eth3        # Переименовываю eth3 в eth2
ip link set dev eth2 up                    # Поднимаю eth2
ip link set name eth3 dev eth4        # Переименовываю eth4 в eth3
ip link set dev eth3 up                    # Поднимаю eth3
ip link set name eth4 dev eth5        # Переименовываю eth5 в eth4
ip link set dev eth4 up                    # Поднимаю eth4
ip link set name eth5 dev eth6        # Остался последний интерфейс eth6 (который переименовали вначале eth0 -> eth6),
                                                    # переименовываю eth6 в eth5
ip link set dev eth5 up                    # Поднимаю eth5
# Назначаю IP-address и поднимаю бридж
ip a a 192.168.1.1/24 dev br0
ip link set dev br0 up

# На всякий случай
sleep 1
# Кладу в переменные пиды процессов сетевых карт
pid_eth0=`ps | grep -v grep | grep 'eth0' |awk '{print $1}'` > /dev/null 2>&1
pid_eth1=`ps | grep -v grep | grep 'eth1' |awk '{print $1}'` > /dev/null 2>&1
pid_eth2=`ps | grep -v grep | grep 'eth2' |awk '{print $1}'` > /dev/null 2>&1
pid_eth3=`ps | grep -v grep | grep 'eth3' |awk '{print $1}'` > /dev/null 2>&1
pid_eth4=`ps | grep -v grep | grep 'eth4' |awk '{print $1}'` > /dev/null 2>&1
pid_eth5=`ps | grep -v grep | grep 'eth5' |awk '{print $1}'` > /dev/null 2>&1

# По пидам выставляю сетевым интерфейсам максимальный приоритет ввода\вывода,
# максимальный приоритет доступа к ресурсам процессора,
# и привязываю сетевые интерфейсы к ядрам процессора, что бы исключить миграцию между ядрами (поскольку собирается реал-тайм
# система)
renice -20 -p $pid_eth0 && chrt -f -p 99 $pid_eth0 && taskset -p 1 $pid_eth0 > /dev/null 2>&1
renice -20 -p $pid_eth1 && chrt -f -p 99 $pid_eth1 && taskset -p 2 $pid_eth1 > /dev/null 2>&1
renice -20 -p $pid_eth2 && chrt -f -p 99 $pid_eth2 && taskset -p 3 $pid_eth2 > /dev/null 2>&1
renice -20 -p $pid_eth3 && chrt -f -p 99 $pid_eth3 && taskset -p 4 $pid_eth3 > /dev/null 2>&1
renice -20 -p $pid_eth4 && chrt -f -p 99 $pid_eth4 && taskset -p 1 $pid_eth3 > /dev/null 2>&1
renice -20 -p $pid_eth5 && chrt -f -p 99 $pid_eth5 && taskset -p 2 $pid_eth3 > /dev/null 2>&1

# Дропаю форвард броадкаста на интерфейсе eth1
# Необходимо запретить броадкаст от определенной машины (MAC 08:00:22:03:15:03) и только на определенном интерфейсе (eth1)
# Для этого в систему были добавленны iptables и ebtables (пока обхожусь ebtables)
/sbin/ebtables -A FORWARD -p IPv4 -s 08:00:22:03:15:03 -d FF:FF:FF:FF:FF:FF -o eth1 -j DROP
# Стартую телнет и синхронизирую время
telnetd -l /bin/login
hwclock -s
EOF


# GROUP

touch etc/group
echo "root:x:0:" > etc/group
echo "toor:x:500:" >> etc/group


# GSHADOW

touch etc/gshadow
echo "root:*::" > etc/gshadow
echo "toor:*::" >> etc/gshadow


# PASSWD

touch etc/passwd
echo "root:x:0:0:,,,:/:/bin/ash" > etc/passwd
echo "toor:x:500:500:,,,:/var/empty:" >> etc/passwd


# SHADOW

touch etc/shadow
echo "root::14000:0:99999:7:::" > etc/shadow
echo "toor::14000:0:99999:7:::" >> etc/shadow


# NSSWITCH.CONF

touch etc/nsswitch.conf
echo "passwd: files" > etc/nsswitch.conf
echo "shadow: files" >> etc/nsswitch.conf
echo "group:  files" >> etc/nsswitch.conf
echo "hosts: dns" >> etc/nsswitch.conf


# BUSYBOX.CONF

touch etc/busybox.conf
echo "[SUID]" > etc/busybox.conf
echo "login = ssx root.root" >> etc/busybox.conf


# LOCALTIME

cp -a /etc/localtime etc/

# MTAB

cd etc
ln -s /proc/mounts mtab
cd $ROOTFS


# PROTOCOLS

cp -a /etc/protocols etc/

# ETHERTYPES

cp -a /etc/ethertypes etc/

# IPTABLES

cp -a /sbin/xtables-multi sbin/
cd sbin
ln -s xtables-multi iptables
cd $ROOTFS
cp -a /lib/libip4tc.so.0.0.0 lib/
cp -a /lib/libip6tc.so.0.0.0 lib/
cp -a /lib/libxtables.so.7.0.0 lib/
cd lib
ln -s libip4tc.so.0.0.0 libip4tc.so.0
ln -s libip6tc.so.0.0.0 libip6tc.so.0
ln -s libxtables.so.7.0.0 libxtables.so.7
cd $ROOTFS


# EBTABLES
# Ebtables по дефолту отсутствует в системе, поэтому перед запуском скрипта необходимо выполнить apt-get install ebtables

cp -a /sbin/ebtables sbin/
mkdir lib/ebtables
cp -a /lib/ebtables/* lib/ebtables/


# BUSYBOX
# В каталоге /root/src/switch_src (переменная $SRC) лежит смэйкованный busybox, копирую в каталог bin

cp -a $SRC/busybox bin/
# Инсталирую busybox, удаляю ссылку linuxrc, создаю ссылку init.

chroot . /bin/busybox --install -s
unlink linuxrc
ln -s /bin/busybox init


# # strip

strip -vs bin/*
strip -vs sbin/*
strip -vs usr/sbin/*
strip -vs usr/bin/*
strip -vs lib/x86_64-linux-gnu/*
strip -vs lib64/*
strip -vs usr/lib/*
strip -vs usr/lib/x86_64-linux-gnu/*

=========================================================================

1.6 Пакую образ ФС в initramfs.igz

find . | cpio -H newc -o | gzip -9 > /root/src/switch_src/initramfs.igz

1.7 Собираю ядро

mkdir /root/src/kernel
cd /root/src/kernel


wget ftp://astra-linux.com/astra/stable/orel/1.9/repository/pool/main/l/linux/linux_3.2.0.orig.tar.gz
wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.2/older/patch-3.2-rt10.patch.bz2
tar xvzf linux_3.2.0.orig.tar.gz
bzip2 -d patch-3.2-rt10.patch.bz2
cd linux-3.2
patch -p1 < ../patch-3.2-rt10.patch

cp -a /root/src/switch_src/config .config                                        # Был готовый конфиг
linux64 make menuconfig

# Опишу только необходимые опции данной конфигурации, скопированный выше конфиг содержит все необходимые опции
# минимального ядра

# Добавляю поддержку initramfs

General setup --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 
          
    ()    Initramfs source file(s)
    [*]   Support initial ramdisks compressed using gzip
    [ ]   Support initial ramdisks compressed using bzip2
    [ ]   Support initial ramdisks compressed using LZMA
    [ ]   Support initial ramdisks compressed using XZ
    [ ]   Support initial ramdisks compressed using LZO


# Модулей у меня нет поскольку ядро статик   

[ ] Enable loadable module support  ---> 

# Тип процессора

Processor type and features  --->
    Processor family (Generic-x86-64)  ---> 
                           # Добавляю поддержку 64bit процессора
        (X) Generic-x86-64
    Preemption Model (Fully Preemptible Kernel (RT))  --->
     # Полностью вытесняемое ядро (RT-Kernel)
        (X) Fully Preemptible Kernel (RT)
    Timer frequency (1000 HZ)  --->   
                                   # Выставляю таймер на 1000 HZ   
        (X) 1000 HZ
   
# Поддержка сетевых функций

[*] Networking support  --->
    Networking options  --->
        [*] Packet socket
        [*] Unix domain sockets
        [*] TCP/IP networking
            [*]   IP: multicasting
            [*]   IP: kernel level autoconfiguration
                [*]     IP: DHCP support

            [*]   IP: multicast routing                                            # Созданная система должна выполнять роль мультикаст роутера
                [*]     IP: PIM-SM version 1 support
                [*]     IP: PIM-SM version 2 support
            [*]   IP: ARP daemon support
            [*]   IP: TCP syncookie support
        [*] Network packet filtering framework (Netfilter)  --->
            [*]   Advanced netfilter configuration

                [*]     Bridged IP/ARP packets filtering                    # Необходимо дропать определенные пакеты на определенных портах
                                                                                           # поэтому мне необходим фильтр на бридже
                    Core Netfilter Configuration  --->
                        -*- Netfilter NFQUEUE over NFNETLINK interface       
                        -*- Netfilter LOG over NFNETLINK interface
                        [ ] Netfilter connection tracking support
                        -*- Netfilter Xtables support (required for ip_tables)
                            *** Xtables combined modules ***
                        -*-   nfmark target and match support 
                            *** Xtables targets ***

                        [*]   AUDIT target support                                # Поскольку с iptables пришлось работать впервые (предпочитаю BSD и
                                                                                             # PF), а собираемая система была лишь тестовым образцом  
                        [*]   "CLASSIFY" target support                        # я не стал разбираться со значением опций, тупо выбрал все (авось не
                                                                                             # сломается).
                        [*]   IDLETIMER target support                         # Впринципе iptables мне не нужен, добавил на всякий случай, если вдруг
                                                                                             # мне все же захочется каких-то особых извращений,
                        [*]   "MARK" target support                              # что бы не пересобирать ядро снова.
                        [*]   "NFLOG" target support
                        [*]   "NFQUEUE" target Support
                        -*-   "RATEEST" target support
                        [*]   "TEE" - packet cloning to alternate destination
                        [*]   "TCPMSS" target support
                            *** Xtables matches ***
                        [*]   "addrtype" address type match support
                        [*]   "comment" match support
                        [*]   "cpu" match support
                        [*]   "dccp" protocol match support
                        [*]   "devgroup" match support
                        [*]   "dscp" and "tos" match support
                        [*]   "esp" match support
                        [*]   "hashlimit" match support
                        [*]   "hl" hoplimit/TTL match support
                        [*]   "iprange" address range match support
                        [*]   "length" match support
                        [*]   "limit" match support
                        [*]   "mac" address match support
                        [*]   "mark" match support
                        [*]   "multiport" Multiple port match support
                        [*]   "osf" Passive OS fingerprint match
                        [*]   "owner" match support
                        [*]   "physdev" match support
                        [*]   "pkttype" packet type match support
                        [*]   "quota" match support
                        [*]   "rateest" match support
                        [*]   "realm" match support
                        [*]   "recent" match support
                        [*]   "sctp" protocol match support (EXPERIMENTAL)
                        [*]   "statistic" match support
                        [*]   "string" match support
                        [*]   "tcpmss" match support
                        [*]   "time" match support
                        [*]   "u32" match support
                    IP: Netfilter Configuration  --->
                        [*] IP Userspace queueing via NETLINK (OBSOLETE)
                        [*] IP tables support (required for filtering/masq/NAT)
                        [*]   Packet filtering
                        [*] ARP tables support
                        [*]   ARP packet filtering
            [*]   Ethernet Bridge tables (ebtables) support  --->

                --- Ethernet Bridge tables (ebtables) support                    # Здесь аналогичная ситуация как и с iptables, тупо выбрал все
                [*]   ebt: broute table support 
                [*]   ebt: filter table support
                [*]   ebt: nat table support
                [*]   ebt: 802.3 filter support
                [*]   ebt: among filter support
                [*]   ebt: ARP filter support
                [*]   ebt: IP filter support
                [*]   ebt: limit match support
                [*]   ebt: mark filter support
                [*]   ebt: packet type filter support
                [*]   ebt: STP filter support
                [*]   ebt: 802.1Q VLAN filter support
                [*]   ebt: arp reply target support
                [*]   ebt: dnat target support
                [*]   ebt: mark target support
                [*]   ebt: redirect target support
                [*]   ebt: snat target support
                [*]   ebt: log support
                [*]   ebt: ulog support (OBSOLETE)
                [*]   ebt: nflog support
        [*] 802.1d Ethernet Bridging
        [*]   IGMP/MLD snooping   
        -*- DNS Resolver support   
Device Drivers  --->
    [*] Network device support  --->

        [*]   Ethernet driver support  --->                                        # На машине имеется 2 встроенные сетевые Realtek 8169
            [*]   Intel devices                                                          # и четырех портовая плата Intel в PCI-X
            [*]     Intel(R) PRO/1000 Gigabit Ethernet support           # Выбираю необходимые драйвера
            [*]     Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support
            [*]   Realtek devices
            [*]     Realtek 8169 gigabit ethernet support

    [*] Real Time Clock  --->                                                       # Необходимо для синхронизации времени
        --- Real Time Clock
        [*]   Set system time from RTC on startup and resume (NEW)
        (rtc0)  RTC used to set the system time (NEW)
            *** RTC interfaces ***
        [*]   /sys/class/rtc/rtcN (sysfs) (NEW)
        [*]   /proc/driver/rtc (procfs for rtc0) (NEW)
        [*]   /dev/rtcN (character devices) (NEW)
            *** SPI RTC drivers ***
            *** Platform RTC drivers ***
        [*]   PC-style 'CMOS' (NEW)

       
# Остальные опции выбираем по необходимости       
# Мэйкую ядро
          
linux64 make -j3

# Копирую собранное ядро в каталог /root/src/switch_src

cp arch/x86/boot/bzimage /root/src/switch_src/vmlinuz-bridge

1.8 Система практически готова, осталось создать раздел, положить туда образ ФС initramfs.igz и ядро vmlinuz-bridge, и установить загрузчик.

# Предположим, что в машине имеется еще один диск

cfdisk /dev/sdb
/dev/sdb1    1024MB
                                                                # Создаем раздел 1Gb

# Форматируем в ext2

mke2fs /dev/sdb1
tune2fs -c 0 -i 0 /dev/sdb1


# Монтируем в /mnt

mount /dev/sdb1 /mnt

# Копируем ядро и образ ФС системы

cp -a /root/src/switch_src/vmlinuz-bridge /mnt
cp -a /root/src/switch_src/initramfs.igz /mnt


# Гружусь с Gentoo LIVE CD
# Монтирую sdb1 в /mnt

mount /dev/sdb1 /mnt

# В /mnt создаю каталог grub

mkdir /mnt/grub

# Копирую в него необходимые грабовские файлы

cp /boot/grub/stage? /boot/grub/e2fs_stage1_5 /mnt/grub

# Отмонтирую раздел

umount /mnt

# Устанавливаю загрузчик

grub
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
grub> quit


# Создаю файл menu.lst
# Для этого снова монтирую раздел

mount /dev/sdb1 /mnt
touch /mnt/grub/menu.lst
echo "timeout 0" > /mnt/grub/menu.lst
echo "default 0" >> /mnt/grub/menu.lst
echo "fallback 2" >> /mnt/grub/menu.lst
echo "title Bridge" >> /mnt/grub/menu.lst
echo "kernel /vmlinuz-bridge initrd=/initramfs.igz quiet ramdisk_size=32768" >> /mnt/grub/menu.lst
echo "initrd /initramfs.igz" >> /mnt/grub/menu.lst


# Вот что должно получится

cat /mnt/target/grub/menu.lst

timeout 0
default 0
fallback 2
title Bridge
kernel /vmlinuz-bridge initrd=/initramfs.igz quiet ramdisk_size=32768
initrd /initramfs.igz


# Отмонтирую раздел

umount /mnt/target

# Загружаюсь в новой системе, проверяю работу.

пятница, 21 марта 2014 г.

Make nvidia driver for real-time kernel

#
# Разбиение диска
# Первый раздел 1Gb, метка загрузочный, файловая система ext2
# Второй раздел 40Gb, файлова система { ext3, ext4 }
#
# Установка Astra-linux-orel
# Устанавливаю Astra-linux-orel на второй раздел 
# в процессе отказываюсь от установки загрузчика GRUB2
# по завершении (с LIVE-CD GENTOO) устанавливаю загрузчик GRUB LEGACY
# см.  Step by step build realtime linux from sources Astra-linux-orel-1.9 first part
#
# nano /mnt/grub/menu.lst
#
# ====================================================================
# timeout 5
# default 0
#
# title DEFAULT-AL
# root (hd0,1)
# kernel /boot/vmlinuz-3.2.0-27-generic root=/dev/sda2 ro quiet splash
# initrd /boot/initrd.img-3.2.0-27-generic
# =====================================================================
#

# Выполняю из под учетной записи ROOT

mkdir -p /root/src/kernel
cd /root/src/kernel
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.32.tar.gz
wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.10/older/patch-3.10.32-rt31.patch.gz
tar xvzf linux-3.10.32.tar.gz
gunzip patch-3.10.32-rt31.patch.gz
cd linux-3.10.32
patch -p1 < ../patch-3.10.32-rt31.patch


# Устанавливаю с диска

apt-get install libncurses5-dev

# cp -a /patch/to/src-kernel/.config .
# Правилю по необходимости

linux64 make menuconfig
linux64 make -j3
cp -a arch/x86/boot/bzImage ../vmlinuz-3.10.32-rt31


# Кладу ядро на первый раздел

mount /dev/sda1 /mnt
cp -a arch/x86/boot/bzImage /mnt/vmlinuz-3.10.32-rt31


# Правлю menu.lst

nano /mnt/grub/menu.lst

timeout 5
default 0

title DEFAULT-AL
root (hd0,1)
kernel /boot/vmlinuz-3.2.0-27-generic root=/dev/sda2 ro quiet splash
initrd /boot/initrd.img-3.2.0-27-generic

title DEFAULT-AL-vmlinuz-3.10.32-rt31
kernel /vmlinuz-3.10.32-rt31 root=/dev/sda2 ro quiet splash


# Перезагружаюсь под новым ядром
# Проверяю модули

lsmod
Module                  Size  Used by


# Как видно модули не подгружены
# Проверяю ядро

uname -a
Linux test 3.10.32-rt31 #1 SMP PREEMPT RT Wed Mar 12 15:30:48 MSK 2014 x86_64 GNU/Linux


# Качаю драйвер NVIDIA и патч к нему

mkdir -p /root/src/nvidia
cd /root/src/nvidia
wget http://us.download.nvidia.com/XFree86/Linux-x86_64/325.15/NVIDIA-Linux-x86_64-325.15.run
wget http://garr.dl.sourceforge.net/project/l-proaudio/nvidia-325xx-rt.patch
sh ./NVIDIA-Linux-x86_64-325.15.run --extract-only
cd NVIDIA-Linux-x86_64-325.15/kernel
patch -Np1 -i ../../nvidia-325xx-rt.patch


# Далее необходимо создать каталог /lib/modules/3.10.32-rt31
# Внутри каталога должна быть ссылка build, на каталог с исходниками ядра /usr/src/linux

ls /lib/modules
3.2.0-27-generic
mkdir /lib/modules/3.10.32-rt31
cd /usr/src
ln -s /root/src/kernel/linux-3.10.32 linux
cd /lib/modules/3.10.32-rt31
ln -s /usr/src/linux build


# Мэйкую драйвер

cd /root/src/nvidia/NVIDIA-Linux-x86_64-325.15/kernel
make IGNORE_PREEMPT_RT_PRESENCE=1 SYSSRC=/lib/modules/3.10.32-rt31/build module


# Сохраняю модуль в  /root/src/nvidia
# cp -a /root/src/nvidia/NVIDIA-Linux-x86_64-325.15/kernel/nvidia.ko /root/src/nvidia

mkdir -p /lib/modules/3.10.32-rt31/kernel/drivers/video
cp -a /root/src/nvidia/NVIDIA-Linux-x86_64-325.15/kernel/nvidia.ko /lib/modules/3.10.32-rt31/kernel/drivers/video


# Сохраняю модуль в  /root/src/nvidia
# cp -a /root/src/nvidia/NVIDIA-Linux-x86_64-325.15/nvidia_drv.so /root/src/nvidia

cp -a /root/src/nvidia/NVIDIA-Linux-x86_64-325.15/nvidia_drv.so /usr/lib/xorg/modules/drivers

# Создаю  xorg.conf

touch /etc/X11/xorg.conf
nano /etc/X11/xorg.conf

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

Section "Files"
EndSection

Section "InputDevice"
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier            "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync          28.0 - 33.0
    VertRefresh        43.0 - 72.0
    Option               "DPMS"
EndSection

Section "Device"
    Identifier           "Device0"
    Driver               "nvidia"
    VendorName     "NVIDIA Corporation"
EndSection

Section "Screen"
    Identifier         "Screen0"
    Device            "Device0"
    Monitor           "Monitor0"
    DefaultDepth    24
    SubSection      "Display"
        Depth          24
    EndSubSection
EndSection


# Подгружаю модуль NVIDIA

insmod /lib/modules/3.10.32-rt31/kernel/drivers/video/nvidia.ko

lsmod
Module                  Size          Used by
nvidia                     8748108    0

/sbin/depmod -a

/etc/init.d/fly-dm restart


# или reboot по желанию
# Проверяю что получилось

uname -a
Linux test 3.10.32-rt31 #1 SMP PREEMPT RT Wed Mar 12 15:30:48 MSK 2014 x86_64 GNU/Linux

lsmod
Module                  Size        Used by
nvidia                     8748108  22

cat /var/log/Xorg.0.log |grep NVIDIA
[  2577.756] (II) Module nvidia: vendor="NVIDIA Corporation"
[  2577.756] (II) NVIDIA dlloader X Driver  325.15  Wed Jul 31 17:50:57 PDT 2013
[  2577.756] (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs
[  2577.759] (**) NVIDIA(0): Depth 24, (--) framebuffer bpp 32
[  2577.759] (==) NVIDIA(0): RGB weight 888
[  2577.759] (==) NVIDIA(0): Default visual is TrueColor
[  2577.759] (==) NVIDIA(0): Using gamma correction (1.0, 1.0, 1.0)
[  2577.759] (**) NVIDIA(0): Enabling 2D acceleration
[  2577.759] (EE) NVIDIA(0): Failed to initialize the GLX module; please check in your X
[  2577.759] (EE) NVIDIA(0):     log file that the GLX module has been loaded in your X
[  2577.759] (EE) NVIDIA(0):     server, and that the module is the NVIDIA GLX module.  If
[  2577.759] (EE) NVIDIA(0):     you continue to encounter problems, Please try
[  2577.759] (EE) NVIDIA(0):     reinstalling the NVIDIA driver.
[  2578.054] (II) NVIDIA(GPU-0): Display (Acer V193 (DFP-0)) does not support NVIDIA 3D Vision
[  2578.054] (II) NVIDIA(GPU-0):     stereo.
[  2578.054] (II) NVIDIA(0): NVIDIA GPU GeForce 210 (GT218) at PCI:1:0:0 (GPU-0)
[  2578.054] (--) NVIDIA(0): Memory: 524288 kBytes
[  2578.054] (--) NVIDIA(0): VideoBIOS: 70.18.2d.00.00
[  2578.054] (II) NVIDIA(0): Detected PCI Express Link width: 16X
[  2578.057] (--) NVIDIA(0): Valid display device(s) on GeForce 210 at PCI:1:0:0
[  2578.057] (--) NVIDIA(0):     CRT-0
[  2578.057] (--) NVIDIA(0):     CRT-1
[  2578.057] (--) NVIDIA(0):     Acer V193 (DFP-0) (boot, connected)
[  2578.057] (--) NVIDIA(0):     DFP-1
[  2578.057] (--) NVIDIA(0): CRT-0: 400.0 MHz maximum pixel clock
[  2578.057] (--) NVIDIA(0): CRT-1: 400.0 MHz maximum pixel clock
[  2578.057] (--) NVIDIA(0): Acer V193 (DFP-0): 330.0 MHz maximum pixel clock
[  2578.057] (--) NVIDIA(0): Acer V193 (DFP-0): Internal Dual Link TMDS
[  2578.057] (--) NVIDIA(0): DFP-1: 165.0 MHz maximum pixel clock
[  2578.057] (--) NVIDIA(0): DFP-1: Internal Single Link TMDS
[  2578.057] (**) NVIDIA(0): Using HorizSync/VertRefresh ranges from the EDID for display
[  2578.057] (**) NVIDIA(0):     device Acer V193 (DFP-0) (Using EDID frequencies has been
[  2578.057] (**) NVIDIA(0):     enabled on all display devices.)
[  2578.058] (==) NVIDIA(0):
[  2578.058] (==) NVIDIA(0): No modes were requested; the default mode "nvidia-auto-select"
[  2578.058] (==) NVIDIA(0):     will be used as the requested mode.
[  2578.058] (==) NVIDIA(0):
[  2578.059] (II) NVIDIA(0): Validated MetaModes:
[  2578.059] (II) NVIDIA(0):     "DFP-0:nvidia-auto-select{}"
[  2578.059] (II) NVIDIA(0): Virtual screen size determined to be 1280 x 1024
[  2578.085] (--) NVIDIA(0): DPI set to (85, 86); computed from "UseEdidDpi" X config
[  2578.085] (--) NVIDIA(0):     option
[  2578.085] (II) NVIDIA: Using 768.00 MB of virtual memory for indirect memory access.
[  2578.090] (II) NVIDIA(0): Setting mode "DFP-0:nvidia-auto-select{}"
[  2578.146] (==) NVIDIA(0): Disabling shared memory pixmaps
[  2578.146] (==) NVIDIA(0): Backing store disabled
[  2578.146] (==) NVIDIA(0): Silken mouse enabled
[  2578.146] (**) NVIDIA(0): DPMS enabled
[  2578.146] (II) NVIDIA(0): [DRI2] Setup complete
[  2578.146] (II) NVIDIA(0): [DRI2]   VDPAU driver: nvidia

понедельник, 3 марта 2014 г.

CUDA install on Astra-linux

# Установлена Astra-linux-orel-1.9 по дефолту
# Качаю драйвера NVIDIA и CUDA
mkdir -p /root/src/cuda
cd /root/src/cuda

wget http://us.download.nvidia.com/XFree86/Linux-x86_64/331.49/NVIDIA-Linux-x86_64-331.49.run
wget http://developer.download.nvidia.com/compute/cuda/5_5/rel/installers/cuda_5.5.22_linux_64.run

# Для установки проприетарного драйвера NVIDIA, необходимо предварительно выгрузить модуль NOUVEAU
# Данный модуль подгружается еще на этапе загрузки initrd (так сделано в Astra-linux) 
# Поэтому пришлось препарировать initrd, чтобы избавиться от NOUVEAU
mkdir /root/src/initrd
cd /root/src/initrd
cp -a /boot/initrd.img-3.2.0-27-generic .
mv initrd.img-3.2.0-27-generic initrd.img.gz
gunzip initrd.img.gz
cpio -i < initrd.img
mv initrd.img ../
rm ./lib/modules/3.2.0-27-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko
find . | cpio -o -H newc | gzip -9 > ../initrd.img-3.2.0-27-generic
mv /boot/initrd.img-3.2.0-27-generic /boot/initrd.img-3.2.0-27-generic.save
cp -a ../initrd.img-3.2.0-27-generic /boot

# Блэклист для NOUVEAU модуля
touch /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
echo "blacklist nouveau" > /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/nvidia-installer-disable-nouveau.conf

# Необходимые пакеты для установки драйвера NVIDIA (пакеты ставились с DVD)
apt-get update
apt-get install linux-headers-`uname -r` binutils pkg-config build-essential  xserver-xorg-dev
reboot

# После перезагрузки проверяю отсутствие модуля NOUVEAU
lsmod |grep nouveau

# Установка
Ctrl+Alt+F1
/etc/init.d/fly-dm stop

cd /root/src/cuda
sh ./NVIDIA-Linux-x86_64-331.38.run
sh ./cuda_5.5.22_linux_64.run
License                                       accept
Do you with to continue                yes
Install nVidia Driver                       yes
Install cuda toolkit                        yes
Tollkit location                              default        (/usr/local/cuda-5.5)
Install cuda samples                     yes
Cuda samples location                  default        (/root/NVIDIA_CUDA-5.5_Samples)

echo "/usr/local/cuda-5.5/lib" >> /etc/ld.so.conf.d/x86_64-linux-gnu.conf
echo "/usr/local/cuda-5.5/lib64:/lib" >> /etc/ld.so.conf.d/x86_64-linux-gnu.conf
ldconfig
modprobe nvidia

lsmod |grep nvidia
         nvidia       10782753  0

/etc/init.d/fly-dm start

четверг, 9 января 2014 г.

Minimal Root File System



|-- /bin
|
|   |-- busybox
|
|   |-- sh -> busybox
|
|-- /dev
|
|   |-- console
|
|-- /etc
|
|   |-- /init.d
| 
|       |-- rcS
|
|   | -- inittab
|
|   | -- fstab
|
|   -- passwd
|
|   | -- shadow  
|
|   | -- group
|
|   | -- busybox.conf 
|
|-- init -> /bin/busybox
|
|-- /lib
    |-- ld-2.3.2.so
    |-- ld-linux.so.2 -> ld-2.3.2.so
    |-- libc-2.3.2.so
    |-- libc.so.6 -> libc-2.3.2.so


пятница, 11 октября 2013 г.

Step by step build realtime linux from sources Astra-linux-orel-1.9 first part

   Задача: Собрать real-time дистрибутив OS Linux из исходников Astra-linux, при этом для повышения отказоустойчивости и отзывчивости, дистрибутив должен работать в оперативной памяти.
    Поскольку дистрибутив должен представлять собой ОС реального времени, необходимо по максимуму снизить потребление ресурсов операционной системой, с целью максимального предоставления этих ресурсов программе ради которой создавался данный дистрибутив. 
    Дистрибутив создается под определенное железо, на нем и будут выполнятся все последующие действия.

1. Устанавливаем по дефолту Astra-linux-orel-1.9:

Необходимо иметь два жестких диска (не обязательно, но так меньше гемора), на один из которых устанавливается Astra-linux.
На этапе Выбор программного обеспечения, оставляем "Базовые средства" остальные рюшечки в дизэйбл.

2. По окончании установки, загружаемся с установленной Astra-linux, и разбиваем 2-ой диск, создаем один раздел:

cfdisk /dev/sdb

3. Форматируем созданный раздел в файловую систему ext4:

mkfs.ext4 /dev/sdb1

4. Монтируем созданный раздел в каталог /mnt/target:

mkdir -p /mnt/target
mount /dev/sdb1 /mnt/target


5. Для обновления репозитария необходимо отредактировать файл: /etc/apt/sources.list. Приводим /etc/apt/sources.list к следующему виду:

cat /etc/apt/sources.list

#deb cdrom:[OS Astra Linux 1.9 orel - amd64 DVD]/ orel contrib main non-free
#deb ftp://astra.rusbitech.ru/os/astra/stable/orel/repository orel main contrib non-free
deb ftp://astra-linux.com/astra/stable/orel/1.9/repository orel main contrib non-free


После внесенных изменений обновляем репозитарии

apt-get update

6. Устанавливаем пакет debootstrap:

apt-get install debootstrap

7. Редактируем скрипт debootstrap:

nano /usr/sbin/debootstrap
в строке                                    DISABLE_KEYRING=""
необходимо поставить 1            DISABLE_KEYRING="1"
           
8. Устанавливаем систему в каталог /mnt/target куда (см. п.4) при монтирован второй жесткий диск:

debootstrap --include=nano,openssh-server,busybox --variant=buildd --arch amd64 orel /mnt/target ftp://astra-linux.com/astra/stable/orel/1.9/repository

По завершении должно появиться сообщение
   
I: Base system installed successfully.

9. Монтируем виртуальные файловые системы:

mount -t proc none /mnt/target/proc
mount -o bind /dev /mnt/target/dev
mount -t tmpfs none /mnt/target/tmp
mount -o bind /sys /mnt/target/sys


10. ЧэнджРутимся в новую систему:

chroot /mnt/target /bin/bash

11. Устанавливаем пароль рута:

passwd root

12. Редактируем файлы hostname hosts resolv.conf network/interfaces:

echo "Astra" > /etc/hostname
echo "127.0.0.1        localhost" > /etc/hosts
echo "nameserver 192.168.1.1" > /etc/resolv.conf
echo "auto eth0" > /etc/network/interfaces
echo "allow-hotplug eth0" >> /etc/network/interfaces
echo "iface eth0 inet dhcp" >> /etc/network/interfaces


13. Редактируем fstab:

echo "/dev/sda1 / ext4 errors=remount-ro 0 1" > /etc/fstab
echo "proc /proc proc defaults 0 0" >> /etc/fstab


14. Редактируем sources.list:

echo "deb ftp://astra-linux.com/astra/stable/orel/1.9/repository orel main contrib non-free" > /etc/apt/sources.list

15. Обновляем репозитарии:

apt-get update

16. Настраиваем часовой пояс:

dpkg-reconfigure tzdata

17. Устанавливаем ядро, при установке в качестве зависимости должен установиться grub:

Посмотреть какие ядра имеются в репозитарии можно командой

apt-cache search linux-image

Выбираем понравившееся и устанавливаем командой

apt-get install linux-image-3.2.0-27-generic

18. Обновляем grub, в результате будет создан конфигурационный файл grub.cfg:

update-grub

19. Выходим из chroot, ребутимся, в BIOS меняем загрузку дисков, все временная система готова для дальнейшего использования:

exit
reboot


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

mkdir -p /root/initramfs

21. Переходим в созданный каталог initramfs, и создаем каталоги будущей файловой системы:

cd /root/initramfs
mkdir -p bin dev etc lib lib64 proc sbin sys tmp usr/bin usr/sbin usr/share var/empty
chmod 1777 tmp


22. Копируем жизненно необходимые либ-файлы для будущей файловой системы, и создаем недостающие сим линки:

mkdir /root/initramfs/lib/x86_64-linux-gnu && cd /root/initramfs/lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/ld-2.13.so .
cp /lib/x86_64-linux-gnu/libc-2.13.so .
cp /lib/x86_64-linux-gnu/libm-2.13.so .
cp /lib/x86_64-linux-gnu/libprocps.so.0.0.1 .
cp /lib/x86_64-linux-gnu/libnss_files-2.13.so .


Следующий либ-файл необходим для программы, ради которой создается данный дистрибутив

cp /lib/x86_64-linux-gnu/libgcc_s.so.1 .

Сим линки

pwd
/root/initramfs/lib/x86_64-linux-gnu

ln -s ld-2.13.so ld-linux-x86-64.so.2
ln -s libc-2.13.so libc.so.6
ln -s libm-2.13.so libm.so.6
ln -s libnss_files-2.13.so libnss_files.so.2
ln -s libprocps.so.0.0.1 libprocps.so.0

cd /root/initramfs/lib64
ln -s /lib/x86_64-linux-gnu/ld-2.13.so ld-linux-x86-64.so.2


23. Скачиваем и компилируем busybox:

cd /root && mkdir -p sources && cd sources
wget ftp://astra-linux.com/astra/stable/orel/1.9/repository/pool/main/b/busybox/busybox_1.20.0.orig.tar.bz2
tar -xjf busybox_1.20.0.orig.tar.bz2
cd busybox-1.20.0
make menuconfig

#####################################################
General Configuration --->
    Build Options --->
        [*] Build Busybox as a static binary (no shared libs)
#####################################################


Кроме статической компиляции выбираем нужные опции и мэйкуем
 

make
mkdir ../bb-static
cp busybox ../bb-static/
cd .. && rm busybox_1.20.0.orig.tar.bz2
cp bb-static/busybox /root/initramfs/bin/

 

BusyBox является единым образом для многих утилит, которые обычно используюся в linux системах (такие как ash, awk, sed, и др.) . Преимущество BusyBox в том что он, включая в себя функциональность многих необходимых утилит, имеет куда меньший размер. Это идеальный вариант для встраиваемых систем.

24. Ченджрутимся в образ новой системы и инсталлируем сим линки на busybox:

cd /root/initramfs && chroot . /bin/busybox --install -s
ln -s /bin/busybox init
ln -s /bin/busybox /bin/sh
rm linuxrc
exit


25. fstab:

touch /root/initramfs/etc/fstab
cat << EOF > /root/initramfs/etc/fstab
none    /proc    proc    defaults    0 0
EOF


26. inittab:

touch /root/initramfs/etc/inittab
cat << EOF > /root/initramfs/etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
tty2::askfirst:-/bin/sh
EOF


27. rcS:

touch /root/initramfs/init.d/rcS
cat << EOF > /root/initramfs/init.d/rcS
#!/bin/ash
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -o remount,rw /dev/ram0 /

mknod /dev/null c 1 3
mknod /dev/tty c 5 0
mdev -s

mkdir -p /dev/pts
mount -t devpts devpts /dev/pts

ifconfig lo 127.0.0.1 up
ifconfig eth0 192.168.1.230 netmask 255.255.255.0 broadcast 192.168.1.255 up
sleep 1 && pid_eth0=`ps | grep -v grep | grep '-eth0' |awk '{print $1}'`
renice -20 -p $pid_eth0 && chrt -f -p 99 $pid_eth0 && taskset -p 1 $pid_eth0 > /dev/null 2>&1

telnetd -l /bin/login
/etc/init.d/rrr start &
/etc/init.d/ftpd start &
/usr/sbin/it &

ulimit -s 0
EOF

chmod +x /root/initramfs/init.d/rcS


Поскольку программа активно использует сеть, сетевой интерфейс eth0 запускается с приоритетом ввода вывода (nice -20), т.е. самый максимальный, использует планировщик FIFO (первый зашел первый вышел), с максимальным приоритетом доступа к ресурсам процессора (chrt -p 99) и привязывается к первому ядру процессора (taskset -p 1), что бы исключить миграцию сетевого интерфейса между ядрами. 

28. group:

touch /root/initramfs/etc/group
cat << EOF > /root/initramfs/etc/group
root:x:0:
toor:x:500:
EOF


29. gshadow:

touch /root/initramfs/etc/gshadow
cat << EOF > /root/initramfs/etc/gshadow
root:*::
toor:*::
EOF


30. passwd:

touch /root/initramfs/etc/passwd
cat << EOF > /root/initramfs/etc/passwd
root:x:0:0:,,,:/:/bin/sh
toor:x:500:500:,,,:/var/empty:
EOF


31. shadow:

touch /root/initramfs/etc/shadow
cat << EOF > /root/initramfs/etc/shadow
root::14000:0:99999:7:::
toor::14000:0:99999:7:::
EOF


32. nsswitch.conf:

touch /root/initramfs/etc/nsswitch.conf
cat << EOF > /root/initramfs/etc/nsswitch.conf
passwd: files
shadow: files
group:  files
hosts: dns
EOF


33. busybox.conf:
touch /root/initramfs/etc/busybox.conf
cat << EOF > /root/initramfs/etc/busybox.conf
[SUID]
login = ssx root.root
EOF


34. /etc/init.d/rrr Скрипт запуска и перезапуска программы, данный скрипт запускает другой скрипт rrr который лежит /root/vm4/rrr:

touch /root/initramfs/etc/init.d/rrr
cat << EOF > /root/initramfs/etc/init.d/rrr
#!/bin/ash
case "$1" in
        start)
                cd /root/vm4 && chrt 99 nice -n -20 ./rrr > /dev/null 2>&1 &
                ;;
        stop)
                pid_rrr=`ps | grep -v grep | grep './rrr' |awk '{print $1}'`
                pid_vm40=`ps | grep -v grep | grep './vm40' |awk '{print $1}'`
                kill -9 $pid_vm40 $pid_rrr & killall vm40 > /dev/null 2>&1 &
                ;;
        restart)
                "$0" stop
                "$0" start
                ;;
        *)
                echo "only start stop restart"
                exit 1
esac
exit $?
EOF


35. /etc/init.d/ftpd:

touch /root/initramfs/etc/init.d/ftpd
cat << EOF > /root/initramfs/etc/init.d/ftpd
#!/bin/ash
case "$1" in
        start)
                tcpsvd -vE 0.0.0.0 21 ftpd -w /mnt/111 &
                ;;
        stop)
                pid_ftpd=`ps | grep -v grep | grep 'ftpd' |awk '{print $1}'`
                kill $pid_ftpd
                ;;
        restart)
                "$0" stop
                "$0" start
                ;;
        *)
                echo "only start stop restart"
                exit 1
esac
exit $?
EOF


36. Создаю скрипт /usr/sbin/it для синхронизации времени в момент загрузки:

touch /root/initramfs/usr/sbin/it
cat << EOF > /root/initramfs/usr/sbin/it
#!/bin/ash
busybox ntpd -nq -p 192.168.1.240  
    # на этом ip, ntp server в локальной сети
EOF                         


cp /etc/localtime /root/initramfs/etc/localtime    # Это исполняемый файл, долго мучался с часовым поясом, пока не догадался тупо скопировать данный файл в свою вновь созданную систему.

37. vm4 Каталог с исполняемым файлом, т.е. сама программа:

С мэйкованием отдельная песня, в этом каталоге лежит еще скрипт rrr, который запускает и перезапускает исполняемый файл vm40, об этом позже

cp -a /path/to/vm4 /root/initramfs/root/
chmod +x /root/initramfs/root/vm4/vm40


38. build initramfs:

cd /root/initramfs
find . | cpio -H newc -o | gzip -9 > /root/sources/initramfs.igz


39. build kernel:

cd /root/sources
wget ftp://astra-linux.com/astra/stable/orel/1.9/repository/pool/main/l/linux/linux_3.2.0.orig.tar.gz
wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.2/older/patch-3.2-rt10.patch.bz2
wget http://www.anticore.org/ratgentoo/files/kernels/preempt/config-2.6.33.7.2-rt30-minimal
tar xvzf linux_3.2.0.orig.tar.gz
bzip2 -d patch-3.2-rt10.patch.bz2
cd linux-3.2
patch -p1 < ../patch-3.2-rt10.patch
cp ../config-2.6.33.7.2-rt30-minimal .config
linux64 make oldconfig
linux64 make menuconfig                                                      # Тут отдельная грустная песня, об этом в part two.
linux64 make -j3
cp arch/x86/boot/bzimage /root/sources/vmlinuz-preempt


40. Сборка конечной системы:

Новую систему будем устанавливать на первый жесткий диск, на который изначально устанавливалась Astra-linux-orel-1.9 в дефолтной конфигурации (см. п.1)

41. Разбиваем диск:

dd if=/dev/zero of=/dev/sdb bs=1 count=512
cfdisk /dev/sdb


Под первый раздел выделяем 1GB, под второй все остальное, на первом разделе необходимо установить метку BOOT.

/dev/sdb1    1024MB
/dev/sdb2    Все оставшиеся пространство диска

42. Форматируем разделы:

Первый раздел форматируем в файловую систему ext2, с первого раздела система в момент загрузки будет только читать файлы, запись на этот раздел производится не будет, соответственно журналирование не нужно, поэтому файловая система ext2 будет более предпочтительна на данном разделе.
На первом разделе будет лежать ядро системы vmlinuz-preempt, образ файловой системы initramfs.igz, и загрузчик grub.
На втором разделе, будут лежать необходимые файлы, образ системы из которого собирался initramfs.igz, необходимые скрипты и другое, соответсвенно будет производится запись на данный раздел, поэтому предпочтительной будет файловая система ext4.

mke2fs /dev/sdb1
tune2fs -c 0 -i 0 /dev/sdb1
mkfs.ext4 /dev/sdb2


43. Монтируем первый раздел в каталог /mnt/target:

mkdir -p /mnt/target
mount /dev/sdb1 /mnt/target


44. Копируем ядро и образ системы на раздел /dev/sdb1:

cp /root/sources/vmlinuz-preempt /mnt/target
cp /root/sources/initramfs.igz /mnt/target


45. Устанавливаем загрузчик GRUB:

На данном этапе существовала определенная проблема, дело в том, что в репозитариях Astra-linux, присутствовал только GRUB2, который существенно отличается от GRUB.
Чтобы я ни делал, у меня так и не получилось заставить работать GRUB2 в связке с initramfs.igz. Ман второго граба не подсказал решения проблемы, так же как и гугление.
После тщетных попыток было принято решение временно (до момента нахождения решения, как же заставить работать GRUB2 в связке с initramfs.igz) воспользоваться первым грабом, взятым с дистрибутива Gentoo LIVE CD.
Поскольку дистрибутив собирался из исходников Astra-linux, для загрузчика было сделано исключение, кроме загрузчика GRUB, исключение так же было сделано для реалтайм патча к ядру, который был скачан с kernel.org (см. п.39), так как данный патч так же отсутствовал в репозитариях Astra-linux.

Грузимся с Gentoo LIVE CD, монтируем раздел на который в п.44 были скопированы vmlinuz-preempt и initramfs.igz в директорию /mnt/target.
Внимание /dev/sdb1 после загрузки с Gentoo LIVE CD мог изменится на /dev/sdа1, необходима проверка

mkdir -p /mnt/target
mount /dev/sda1 /mnt/target


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

ls -la /mnt/target
drwxr-xr-x    4   root    root             4096 Sep 18 15:41 .
drwxr-xr-x    15 root    root             0 Oct 10 10:28 ..
-rw-r--r--      1   root     root            3095790 Sep 18 15:41 initramfs.igz
drwx------     2   root     root            16384 Aug 20 14:49 lost+found
-rw-r--r--      1   root     root            2313184 Aug  7 15:15 vmlinuz-preempt 


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

mkdir /mnt/target/grub
cp /boot/grub/stage? /boot/grub/e2fs_stage1_5 /mnt/target/grub
umount /mnt/target

grub
grub> device (hd0) /dev/sda
grub> root (hd0,0)
grub> setup (hd0)
grub> quit


Создаем файл menu.lst

Для этого снова монтируем раздел

mount /dev/sda1 /mnt/target

touch /mnt/target/grub/menu.lst
echo "timeout 0" > /mnt/target/grub/menu.lst
echo "default 0" >> /mnt/target/grub/menu.lst
echo "fallback 2" >> /mnt/target/grub/menu.lst
echo "title Preempt" >> /mnt/target/grub/menu.lst
echo "kernel /vmlinuz-preempt initrd=/initramfs.igz quiet ramdisk_size=32768" >> /mnt/target/grub/menu.lst
echo "initrd /initramfs.igz" >> /mnt/target/grub/menu.lst


Проверяем

cat /mnt/target/grub/menu.lst

timeout 0
default 0
fallback 2
title Preempt
kernel /vmlinuz-preempt initrd=/initramfs.igz quiet ramdisk_size=32768
initrd /initramfs.igz


Отмонтируем раздел

umount /mnt/target

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


    Продолжение следует ...