А можно попросить вариант скрипта для моего случая?
Имеется USB-flash с двумя разделами. Один swap монтируется в /swap.
Второй ext2 монтируется в /opt
Винт имеет один раздел, монтируется в /userdata
никак. Но можно сделать генерацию fstab при загрузке. Примерно так:как жестко прописать их монтирование на роутере?
http://wl500g.info/showpost.php?p=79119&postcount=249
http://www.wl500g.info/showpost.php?p=80436&postcount=3
http://wl500g.info/showthread.php?t=18485
А можно попросить вариант скрипта для моего случая?
Имеется USB-flash с двумя разделами. Один swap монтируется в /swap.
Второй ext2 монтируется в /opt
Винт имеет один раздел, монтируется в /userdata
DIXI
alien, а чем плох тот скрипт, что выше? Который "со свопом"?
Только в hdd_guid вписать GUID от флешки, а в flash_guid - GUID от винчестера. Точки монтирования отредактировать вроде несложно.
З.Ы. Ради эстетики можно напрячься и поменять имена переменных самостоятельно.
З.З.Ы. Это плохая идея: своп на флешке, особенно если есть винт.
Так посели swap на отдельную флешку.
Обидно будет, когда сдохнет флешка с настроенныем софтом.
PS: может мне не повезло с флешкой. Я тоже хотел поместить opt и swap на одну флешку. Так после установки некоторого колличества пакетов - все рушилось. После переноса swap на винт, все стало работать.
[ASUS wl-500gP (v1) 1.9.2.7-rtn-r7438M 128Mb 300MHz 2+2usb] + [2Гб USBFlash] + [USB-HDD] + [xinetd] + [samba3] + [Download Engine] + [rTorrent] + [3proxy] + [nShaper] + [mcabber] + [apcupsd] + [mpd]; Было: [openvpn&udhcpc]; [privoxy] + [polipo];
Вывод с консоли в студию.
Угу, а что говорит ls -al /opt/tmp ?
vladniktep, не знаю. Возможно, пробел в конце имени файла.
Сделал скрипт, которым подменяю /sbin/hotplug.
По пунктам:
1. Когда происходит событие подключения/отключения железа, например usb девайса, ядро смотрит в некоторую внутреннюю переменную, и если там есть путь к исполняемому файлу, то запускает этот файл, передавая ему в переменных окружения данные о происшедшем событии.
2. Данная переменная экспортируется через /proc/sys/kernel/hotplug Туда можно писать пути к нашим файлам. По умолчанию туда прописан путь /sbin/hotplug
3. Идея в том, чтобы для интересующих нас событий выполнялся наш скрипт, а для всех остальных - бинарный файл из прошивки. После изучения исходников прошивочного варианта у меня сложисломь впечатление, что никакого особенного разума там нет. Но для совместимости с будущими версиями прошивок, где этот разум может появиться, я запускаю на исполнение прошивочный вариант.
4. Я разложил всё на три куска: файл /usr/local/sbin/hotplug - собственно парсер событий и конфигурации, файл настроек /ets/usbmassplug.conf и добавка в скрипт /usr/local/sbin/post-boot, которая прописывает путь к нашему скрипту в переменную ядра.
5. После добавления файла /ets/usbmassplug.conf не забываем его дописать в /usr/local/.files
Содержимое файлов - отдельным постом.
В аттаче - архив, в котором дебаг местами раскомментирован. Для удобства.Code:#!/bin/sh SYSHOTPLUG=/sbin/hotplug DEVICES=/proc/bus/usb/devices #mkdir -p /tmp/debug/ #echo "=======================================" >> /tmp/debug/hotplug.log #date >> /tmp/debug/hotplug.log # We process hotplugging for usb only if [ "$1" != "usb" ]; then #echo "Not an usb event: $1" >> /tmp/debug/hotplug.log exec $SYSHOTPLUG; fi # INTERFACE we are going to process is 8 for mass storage and 6 for SCSI if [ "$INTERFACE" != "8/6/80" ]; then #echo "Not a mass-storage event: $INTERFACE" >> /tmp/debug/hotplug.log exec $SYSHOTPLUG; fi # We process only addition if [ "$ACTION" != "add" ]; then #echo "Not an add event: $ACTION" >> /tmp/debug/hotplug.log exec $SYSHOTPLUG; fi # Sleep a little to let device to settle sleep 1 # Now we are going to construct `Bus:' string to match in # /proc/scsi/usb-storage-X/X. Thus we will now what device initiated event # After split Bus=fds[3], Level=fds[5], Parent=fds[7], Port=fds[9] and # DeviceId=fds[13]. Lines array indexed by strings bus/devid with values # level/port/parent. cat $DEVICES | awk '/^T:/ { split($0,fds,/[ =\t\n]+/); lines[sprintf("%d/%d",fds[3],fds[13])]=sprintf("%d/%d/%d",fds[5],fds[9],fds[7]) } END { split(ENVIRON["DEVICE"],dvals,"/"); rbus=dvals[5];dnum=dvals[6]; tlvl=0; do { if(!sprintf("%d/%d",rbus,dnum) in lines) exit 1; split(lines[sprintf("%d/%d",rbus,dnum)],lvals,"/"); ++tlvl; ports[tlvl]=lvals[2]; clvl=lvals[1]; dnum=lvasl[3] }while(clvl>1); res=sprintf("Bus: 01:%02d.2-%d",rbus,ports[tlvl]+1); for(i=tlvl-1;i>0;--i) res=sprintf("%s.%d",res,ports[i]+1); #print "USB:",res >> "/tmp/debug/hotplug.log"; hostnum=-1; for(i=0;i<4 && hostnum==-1;++i) { file=sprintf("/proc/scsi/usb-storage-%d/%d",i,i); #print "Processing file:",file >> "/tmp/debug/hotplug.log"; while(0 < getline ums < file) { #print "\tLooking in string:",ums >> "/tmp/debug/hotplug.log"; if(index(ums,"GUID:")) { split(ums,gid," "); guid=gid[2]; } if(index(ums,res)) { hostnum=i; break; } } } #print "Host number",hostnum,"GIUD:",guid >> "/tmp/debug/hotplug.log"; if(hostnum==-1) exit 0; guidstr=sprintf("^GUID:%s",guid); #print "Looking for: ",guidstr >> "/tmp/debug/hotplug.log"; while(0 < getline conf < "/etc/usbmassplug.conf") { #print "Processing:",conf >> "/tmp/debug/hotplug.log"; if(conf ~ guidstr) { #print "Found match!" >> "/tmp/debug/hotplug.log"; split(conf,mp," "); if(mp[3]=="swap") { #printf("swapon /dev/scsi/host%d/bus0/target0/lun0/part%d\n",hostnum,mp[2]) >> "/tmp/debug/hotplug.log"; system(sprintf("swapon /dev/scsi/host%d/bus0/target0/lun0/part%d",hostnum,mp[2])); } else { #printf("mount -t %s -o %s /dev/scsi/host%d/bus0/target0/lun0/part%d %s\n",mp[4],mp[5],hostnum,mp[2],mp[3]) >> "/tmp/debug/hotplug.log"; system(sprintf("mount -t %s -o %s /dev/scsi/host%d/bus0/target0/lun0/part%d %s",mp[4],mp[5],hostnum,mp[2],mp[3])); } } } }'
Пояснения: по большей части поведение скрипта объяснено в комментариях. Скрипт парсит /proc/bus/usb/devices, восстанавливает по этому файлу топологию подключения девайсов, находит точку подключения для девайса, сгенерировавшего событие и ищет среди mass-storage девайсов свеже подключённого. После этого вынимает из конфигурации все точки монтирования и выполняет mount и swapon.
Интересующие строчки в /usr/local/sbin/post-boot выглядят следующим образом:
Файл конфигурации /etc/usbmassplug.conf выглядит следующим образом:Code:# make sure mass-storage modules loaded insmod scsi_mod insmod sd_mod insmod usb-storage # redirect mass-storage addition to our script echo "/usr/local/sbin/hotplug" > /proc/sys/kernel/hotplug
Вольный перевод: формат строчек следующийCode:# Add lines in following format: # GUID:guid part_num mount_point type options # guid is value from string GUID: from /proc/scsi/usb-storage-X/X # part_num is a number of partition starting with 1 # mount_point is mount point dir or special value `swap' # type is filesystem type (for swap mount points is ignored) # options are mount options as passed to mount (ignored for swap) GUID:152d232900005e07ffffffff 1 /mnt ext3 rw,noatime GUID:058f63870000000195631602 1 /opt ext3 rw,noatime GUID:058f63870000000195631602 2 swap
GUID:идентификатор_устройства номер_части точка_монтирования тип_системы параметры
идентификатор_устройства читаем для наших устройств из файлов /proc/scsi/usb-storage-X/X в строчке, начинающейся с GUID:
номер_части - номер раздела на нашем устройстве, начиная с единицы
точка_монтирования - путь к дирректории или специальное значение swap для своп разделов
тип_системы - тип файловой системы, например ext3
параметры - параметры монтирования, например rw,noatime
Для своп разделов тип_системы и параметры игнорируются