Текст получившегося скрипта.
#!/bin/sh
#************************************************
#* скрипт для расширения ROM на USB drive *
#* для возможности установки дополнительного ПО *
#* Автор zepete.livejournal.com *
#************************************************
#check for usb drive
if ! [ -b /dev/sda ]; then
echo Have not flash drive '(/dev/sda)'
exit 1
fi
#delete partition
# parameters
# d - delete partition
# Partition number
fdisk /dev/sda <<EOF
d
1
d
2
d
3
d
4
w
EOF
#create partitions
# parametrs
# n - create partition
# p - primiry partition, e - extended
# Partition number (1-4)
# First cylinder, by default first free
# Last cylinder or +size or +sizeM or +sizeK
fdisk /dev/sda <<EOF # create swap partition
n
p
1
+256K
w
EOF
fdisk /dev/sda <<EOF #create data partition
n
p
2
w
EOF
#set type of swap partition
# parametrs
# t - set type of partition
# partition number
# Hex code type of partition
fdisk /dev/sda <<EOF
t
1
82
w
EOF
#formating partition
mkswap /dev/sda1
mkfs.ext2 /dev/sda2
#setup /etc/config/fstab
/etc/init.d/fstab stop
uci set fstab.automount.anon_mount=0
uci delete fstab.@mount[0].device
uci set fstab.@mount[0].uuid=$(blkid -s UUID /dev/sda2 | cut -d\" -f2)
uci set fstab.@mount[0].fstype='ext2'
uci set fstab.@mount[0].enabled=1
uci set fstab.@mount[0].target='/overlay'
uci delete fstab.@swap[0].device
uci set fstab.@swap[0].uuid=$(blkid -s UUID /dev/sda1 | cut -d\" -f2)
uci set fstab.@swap[0].enabled=1
uci commit fstab
#copy /overlay to flash
mkdir /tmp/ExtRoot
mount -t ext2 /dev/sda2 /tmp/ExtRoot
sync
tar -C /overlay -cvf - . | tar -C /tmp/ExtRoot -xf -
sync
umount /tmp/ExtRoot
rmdir /tmp/ExtRoot
reboot
Добавить его в прошивку можно 4 способами:
1. Добавить в каталог ...../package/base-files/files/<путь к файлу в прошивке> или ...../package/base-files/files/<название платформы, например mr3020>/<путь к файлу в прошивке>.
2. Создать каталог ....../files/<путь к файлу в прошивке>, и в него поместить свой файл.
3. Создать каталог с файловой системой добавляемой прошивку и запустить сборку командой make image Files=<путь к папке>/
4. Создать свой пакет с этим файлом.
Первые три способа затруднений не вызывают, но они не позволяют управлять включением файла в прошивку из make menuconfig. Поэтому я предпочитаю способ с помощью создания своего пакета.
Далее на примере скрипта для расширения корневого каталога и создания раздела подкачки на USB диске, я опишу как это сделать.
1. Для этого необходимо создать папку в каталоге ...../packages. Я создал папку 0-prepareflsh. Приставку "0-" добавил для простаты навигации к этой папке из файловых менеджеров.
2. Создал в ней каталог files.
3. Поместил в него свой файл со скриптом. Я его назвал prepareflash.sh.
4. В каталоге ...../feeds/packages создал текстовый файл Makefiles со следующим текстом.
Только из него надо удалить все комментарии, ибо русские буквы система сборки не понимает и выдает ошибку отсутствия разделителя.
#************************************************************************
#* Скрипт автоматизирующий перенос /overlay (изменяемой части прошивки) *
#* на USB диск. Запускается командой "prepareflash.sh" с установленным *
#* USB накопителем. *
#* 17 декабря 2013 года zepete.livejournal.com *
#************************************************************************
include $(TOPDIR)/rules.mk
# имя пакета, я добавил в начале "0-" для удобства навигации в катологе
# /package
# !!!ВНИМАНИЕ!!! имя пакета должно совпадать с именем директории,
# иначе будет возникать ошибка *** No rule to make target
PKG_NAME:=0-prepareflash
# версия пакета
PKG_VERSION:=1
# версия Makefile
PKG_RELEASE:=1
#на каких устройствах может запускаться
#PKGARCH:=all
include $(INCLUDE_DIR)/package.mk
#описание пакета для "make menuconfig"
#слово после '/' должно совпадать с PKG_NAME
define Package/0-prepareflash
#зарезервировано
SECTION:=1
#название меню, в котором будет находиться скрипт
CATEGORY:=my scripts
# какие пакеты необходимо установить дополнительно
# DEPENDS:=+
#краткое описание пакета, в конце необходимо добавить
# несколько пробелов для корректного отображения
# в make menuconfig
TITLE:=create extenal overlay
#к кому обращаться за помощью
MAINTAINER:=zepete
#адресс пакета в интернете
URL:=zepete.livejournal.com
# опция make menuconfig по умолчанию
# n - не компилировать
# m - компилировать
# y - компилировать и внедрять
DEFAULT:=y
endef
#подробное описание пакета
define Package/0-prepareflash/description
0-prepareflash delete all partition on /dev/sda,
make there swap partition size more 256K
and partition type ext2 on witch place /overlay.
For run need execute command line "prepareflash".
endef
#обязательный раздел
#без него будет возникать ошибка
# 'No targets specified and no makefile found'
#нужен для компиляции пакета из исходных кодов
define Build/Compile
endef
#обязательный и бесполезный раздел
# него будет возникать ошибка
# 'No targets specified and no makefile found'
define Build/Configure
endef
#скрипт bash без '#!/bin/sh' описывающий установку пакета,
# то есть какие файлы надо копировать
# !!!ВНИМАНИЕ!!! первым символом в строке должен быть '<tab>'
# пробел вызовет ошибку при компиляции: '*** missing separator'
define Package/0-prepareflash/install
#создание директории.
#Создавать директорию обязательно, иначе не смогут скопироваться файлы
# '$(INSTALLDIR)' - это псевдоним "install -d -m0755" (читать, писать и
# выполнять может хозяин, а все остальные только читать и писать
$(INSTALL_DIR) $(1)/sbin
# копирование файла
# копирование файлов по одному с заданными атрибутами
# '$(INSTALL_BIN)' - псевдоним для "install -m0755" (читать, писать и
# выполнять может хозяин, а все остальные только читать и писать)
# '$(INSTALL_DATA)' - псевдоним для "install -m0644" (хозяин может читать и
# изменять, а все остальные только читать
# '$(INSTALL_CONF)' - псевдоним для "install -m0600" (хозяин может читать и
#изменять, а все остальные не имеют прав.
$(INSTALL_BIN) ./files/prepareflash.sh $(1)/sbin/prepareflash.sh
#альтернативный способ копирования файлов группой сразу
# cp ./files/* $(1)/sbin
# chmod 755 *
endef
$(eval $(call BuildPackage,0-prepareflash))
:)
Date: 2014-01-07 03:12 am (UTC)