Создание основного скрипта инициализации linuxrc

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
Soloven
Сообщения: 63

Создание основного скрипта инициализации linuxrc

Сообщение Soloven »

Преамбула.

В свое время, года полтора назад досталось мне в наследство очень забавное и время убийственное дело – это создание мини-дистрибутивов на базе Linux. Если при этом еще и учесть что о существовании такой ОС я знал только теоретически и работал всегда под Windows. Первое впечатление, которое я испытал после инсталляции это был УЖАС. А что бы вы испытали, когда вдруг обнаружили, что труды двух ваших последних лет необратимо исчезли?

Но время шло, и наличие, какой никакой литературы помогало работать. Дошли руки и до создания своего детища мини-дистрибутива на базе ярда 2.4.7. Все работало отлично, но как выяснилось позже уже клиентом заказчика, что данный дистрибутив не поддерживает возможности обновления, т.е. он не поддерживает vfat , и не имеет таких необходимых команд как rm cp mv. Следовательно встал вопрос о создании очередного мини-дистрибутива, но уже дискетного который бы мог предоставить возможность производить обновление программного обеспечения.

Сам процесс создания мини-дистрибутива описывать в этом документе я пока не буду, а основные принципы вы можете почерпнуть, прочитав Boot-Disk HOWTO.

Здесь же мы остановимся на создании основного скрипта инициализации.. linuxrc для дискетных версий.



В первых строках своего письма.

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



#!/bin/sh

#

# linuxrc – main initialization script

# Author: Andrew E. Kuznetsoff kuznetsoff@fromru.com

#



Далее в целях облегчения своей работы дабы не писать перед каждой командой полный путь к ней передадим оболочке основные пути к исполняемым файлам. И приглашение PROMPT которое появится после загрузки скрипта.



PATH="/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin:/usr/local/sbin"

TERM=linux

PS1="myDSK>"

clear

export PATH TERM PS1 VERSION BOOT BOOTFS FLCFG FXCFG FIXED

Хотелось обратить ваше внимание на то, что загромождать пустыми каталогами образ вашего виртуального диска не всегда желательно. Места как вы сами понимаете маловато, а программ и необходимых библиотек придется туда скопировать много, поэтому моя личная рекомендация создавать эти директории во время загрузки было бы намного приемлемее.



umask 022

mount -t proc proc /proc # монтирум proc файловую ситему

mkdir -p /lib/modules

mkdir -p /usr/update



Теперь мы создадим софт-линки для стандартных портов ввода/вывода и подготовим RAM-диск к дальнейшей работе.



ln -sf /proc/self/fd/0 /dev/stdin

ln -sf /proc/self/fd/2 /dev/stderr

ln -sf /proc/self/fd/1 /dev/stdout

chmod a+w /tmp

chmod a+w /dev/null



Когда подготовительные работы окончены, можно собрать информацию о системе: размер оперативной памяти, наличие CD-ROM и дисковода с которого мы сейчас стартуем. Хочу заметить, что приведенный ниже пример далеко не идеален, дело в том, что при наличии в системе двух CD-ROM’ов вы присвоите переменной CDEV имена сразу двух CD-ROM’ов и следовательно в дальнейшем использовать такую переменную для монтирования CD-ROM вы не сможете. Я бы посоветовал самостоятельно доработать этот момент. Я за неимением времени этим вопросом почти не занимался, единственное, что могу посоветовать это добавить подсчет количества строк в получаемом сообщении.



VERS=”0.0.1”

MEMORY=`grep MemTotal /proc/meminfo | cut -d':' -f2 | cut -d'k' -f1`

KERNEL=`cat /proc/version | cut -d' ' -f3`

CDEV=`dmesg | grep D-ROM | grep hd | cut -d: -f1 | sort | uniq`

FDEV=`dmesg | grep -v LDM | grep "^ [sh]d[a-f]" | cut -d':' -f2 | sort | uniq`



Что ж отлично теперь мы знаем, что у нас есть и непременно этим воспользуемся позже. Сейчас займемся не менее интересным делом это настройкой локали. Здесь нам придется определить тип клавиатуры и загрузить системный шрифт. Особых комментариев эта процедура не требует, в данном случае мы настраиваем локаль на работу с koi8-r. Для любознательных рекомендую почитать Cyrilic HOWTO.





/bin/loadkeys /lib/kbd/ru.map

/bin/setfont -v /lib/kbd/Cyr_a8x16.psfu.gz

/bin/mapscrn /lib/kbd/koi2alt

reset

for i in 1 2 3 4 5 6;

do

echo -ne "\033(K" > /dev/tty$i

done



Наконец пришло время косметического ремонта на нашей системе. Не может же весь процесс инициализации пройти молча не проинформировав пользователя о происходящем, вот и первые сообщения для него.



echo "==========================="

echo "Версия: $VERS"

echo "Ядро: $KERNEL"

echo "==========================="

echo "Привод CD-ROM: $CDEV"

sleep 1



В принципе этого уже достаточно, но в нашем случае мы говорили о диске с update так, что нам необходимо эти файлы обновления подключить к нашему RAM-диску. Есть две вариации, если вы будете использовать этот скрипт для загрузочного CD-ROM приведенный ниже или как в нашем случае для загрузочной дискеты.





if [ "$CDEV" ]

then

echo -n "Попытка монтирования CD-ROM по адресу $CDEV:"

if mount -t iso9660 /dev/${CDEV} /mnt/cdrom 2> /dev/null > /dev/null

then

echo " Успешно!"

else

echo " Неудачно!"

fi

fi

if [ "$FDEV" ]

then

if mount -t vfat /dev/${FDEV} /mnt/fd 2> /dev/null > /dev/null

then

echo " Успешно!"

else

echo " Неудачно!"

fi

fi



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





if [ "$HOME" != "" ]

then

echo "Создаю /home"

mkdir /home 2> /dev/null

if [ "$TMPFS" = "true" ]

then

mount -n -t tmpfs -o size=${HOMEP}000 /dev/null /home

else

mkfs.minix /dev/ram5 $HOMEP 2> /dev/null > /dev/null

mount -t minix /dev/ram5 /home

fi fi



if [ "$VAR" != "" ]

then



echo "Создаю /var"

mkdir /var 2> /dev/null

if [ "$TMPFS" = "true" ]

then

mount -n -t tmpfs -o size=${VAR}000 /dev/null /var

else

mkfs.minix /dev/ram6 $VAR 2> /dev/null > /dev/null

mount -t minix /dev/ram6 /var

fi

fi



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



Материал:



# Based on:

# linuxrc - main RTK initialization script

# Author: Stalsen <stalsen@trinux.atanor.ru>

Based on:

# linuxrc - main trinux initialization script

# Author: Matthew Franz <mfranz@cisco.com>

# Bill Burdick for the User-Mode-Linux fixes



Andrew E. Kuznetsoff ака Разгильдяй на Обкуренной кошке kuznetsoff@fromru.com
The /dev/null где то рядом ©
Использовать компьютер только для игр все равно, что Использовать Ламборгини для перевозки картошки ©
Спасибо сказали: