Feature #317

Загрузка с LiveCD/LiveFlash при ином расположении файлов систеы

Added by Михаил Гагауз almost 13 years ago. Updated over 11 years ago.

Status:New Start:06/25/2011
Priority:Normal Due date:
Assignee:Mikhail Hiretsky % Done:

0%

Category:Calculate Linux Spent time: -
Target version:-
Votes: 1

Description

Давно уже не видел флешки меньше 2G
В связи с этим на своей флешке храню несколько версий кальки в разных директориях следующим образом

# ls -lA /mnt/cdrom/
итого 32
lrwxrwxrwx 1 root root     1 Ноя 13  2010 boot -> .
lrwxrwxrwx 1 root root    17 Май 12 17:58 CDS-11.3-i686 -> CDS-20110512-i686
dr-xr-xr-x 5 root root  4096 Май 12 14:08 CDS-20110512-i686
lrwxrwxrwx 1 root root    13 Май 12 17:59 CDS-i686 -> CDS-11.3-i686
lrwxrwxrwx 1 root root    18 Май 29 15:24 CLDG-11.6-i686 -> cldg-20110519-i686
dr-xr-xr-x 5 root root  4096 Май 19 12:59 cldg-20110519-i686
lrwxrwxrwx 1 root root    14 Май 29 15:24 CLDG-i686 -> CLDG-11.6-i686
drwxr-xr-x 2 root root  4096 Сен 22  2010 grub
-rw-r--r-- 1 root root     9 Янв 20 01:02 livecd
drwx------ 2 root root 16384 Май 20 12:43 lost+found
# ls -lA /mnt/cdrom/cldg-20110519-i686/
итого 1390432
dr-xr-xr-x 2 root root       4096 Май 19 12:59 boot
dr-xr-xr-x 2 root root       4096 Май 19 12:59 isolinux
-r-xr-xr-x 1 root root          9 Май 19 12:59 livecd
-r-xr-xr-x 1 root root 1422389248 Май 19 12:59 livecd.squashfs
dr-xr-xr-x 2 root root       4096 Май 19 12:59 syslinux
# # Тут банально распакованные iso-образы кальки
# cat /mnt/cdrom/livecd 
calculate

это позволяет загружаться с одной флешки в разные системы, а также (в перспективе) упрощает обновление системы на флешке при scratch-загрузке - достаточно будет указать директорию на флешке (к приеру /mnt/flash/cldg-$(date '%Y%m%d')i686) в которую собирать новый образ и изменить симлинк на нее (в данном случае ln --symbolic --force cldg$(date '%Y%m%d')-i686 /mnt/flash/CLDG-i686) не трогая конфиг grub-а

При этом возникает две трудноси:
  1. В утилиту cl-install путь до squash-файла забит жестко, чтоб это побороть необходимо путь брать следующей python-командой
    filter((lambda x: 'loop=' == x[:5]) ,open('/proc/cmdline').readline().split() )[0][5:]

    Не особо заморачиваясь обошел это ограничение следующим образом
    mount -v --bind /mnt/cdrom/{CLDG-i686/,}
  2. Параметр docache не работает.
    Связано это с тем, что среди прочего в init-скрипте происходит (в моем случае) попытка выполнить следующее
    cp -a ${NEW_ROOT}/mnt/cdrom/${LOOP} ${NEW_ROOT}/mnt/squash/${LOOP}
    ## что равносильно
    cp -a /newroot/mnt/cdrom//CLDG-i686/livecd.squashfs /mnt/squash//CLDG-i686/livecd.squashfs
    

    и поскольку директории /mnt/squash//CLDG-i686/ пока не существует, это действие заканчивается ошибкой

С этим побороться не внося изменения в код не удалось, так что пришлось слегка поковырять genkernel/calckernel , результаты этого и выкладываю:

# diff -su /usr/share/genkernel/defaults/initrd.scripts{_orig,}
--- /usr/share/genkernel/defaults/initrd.scripts_orig    2011-06-25 17:37:37.095401886 +0300
+++ /usr/share/genkernel/defaults/initrd.scripts    2011-06-25 18:33:34.302526754 +0300
@@ -210,10 +210,10 @@
             if [[ $((${imagesize} + $addon)) -lt ${allmemory} ]];
             then
                 mount -o remount,size=${addon}000 -t tmpfs tmpfs ${NEW_ROOT}
-                mkdir ${NEW_ROOT}/mnt/squash
-                mount -o size=${imagesize}000 -t tmpfs tmpfs ${NEW_ROOT}/mnt/squash
+                mkdir -pv "${NEW_ROOT}/mnt/squash/`dirname "${LOOP}"`" 
+                mount -o size=${imagesize}000 -t tmpfs tmpfs "${NEW_ROOT}/mnt/squash/`dirname "${LOOP}"`" 
                 good_msg "Copying loop file for caching..." 
-                cp -a ${NEW_ROOT}/mnt/cdrom/${LOOP} ${NEW_ROOT}/mnt/squash/${LOOP}
+                cp -a "${NEW_ROOT}/mnt/cdrom/${LOOP}" "${NEW_ROOT}/mnt/squash/${LOOP}" 
                 if [ $? -ne 0 ]
                 then
                     bad_msg "Failed to cache the loop file! Lack of space?" 

К сожалению ПОКА проверить работоспособность этого варианта я не могу (загрузился с той самой флешки в обычном режиме и пока перезагрузиться нельзя), но выкладываю сюда решение (как минимум чтоб не изобретать эти две строки поновому) т.к. уверен в его работоспособности на 100%. Тем не менее проверю и отпишусь поновому.

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

grub.conf - /mnt/cdrom/boot/grub/grub.conf (2.6 KB) Михаил Гагауз, 06/25/2011 07:53 pm

History

Updated by Михаил Гагауз almost 13 years ago

ПОЧТИ оказался прав.
К сожалению mkdir из busybox не знает ключа -v Поэтому правильный вариант такой

 1 
# diff -su /usr/share/genkernel/defaults/initrd.scripts{_orig,}
2
--- /usr/share/genkernel/defaults/initrd.scripts_orig 2011-06-28 18:48:17.000000000 +0300
3
+++ /usr/share/genkernel/defaults/initrd.scripts 2011-06-28 18:50:10.000000000 +0300
4
@@ -210,10 +210,10 @@
5 if [[ $((${imagesize} + $addon)) -lt ${allmemory} ]]; 6 then 7 mount -o remount,size=${addon}000 -t tmpfs tmpfs ${NEW_ROOT} 8
- mkdir ${NEW_ROOT}/mnt/squash
9
- mount -o size=${imagesize}000 -t tmpfs tmpfs ${NEW_ROOT}/mnt/squash
10
+ mkdir -p "${NEW_ROOT}/mnt/squash/`dirname "${LOOP}"`"
11
+ mount -o size=${imagesize}000 -t tmpfs tmpfs "${NEW_ROOT}/mnt/squash/`dirname "${LOOP}"`"
12 good_msg "Copying loop file for caching..." 13
- cp -a ${NEW_ROOT}/mnt/cdrom/${LOOP} ${NEW_ROOT}/mnt/squash/${LOOP}
14
+ cp -a "${NEW_ROOT}/mnt/cdrom/${LOOP}" "${NEW_ROOT}/mnt/squash/${LOOP}"
15 if [ $? -ne 0 ] 16 then 17 bad_msg "Failed to cache the loop file! Lack of space?"

Нормальной работе с CD это никак повредить не может, лишь расширит возможности.
В связи с этим предлагаю внести данные изменения в апстрим.

Updated by Mikhail Hiretsky over 11 years ago

  • Assignee set to Mikhail Hiretsky

Also available in: Atom PDF

Thank you!