Сборка и модификация kernel


Recommended Posts

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

Раздел 1. Подготовка исходников и сборка проекта.

 

Шаг 1. Установка VirtualBox и Ubuntu

Установите VirtualBox (http://www.virtualbox.org/) и создайте виртуальную машину для установки Ubuntu.

Я использовал следующие параметры виртуальной машины для комфортной работы: RAM 4 gb, 2 CPU, HDD 50 Gb

В качестве операционной системы, я выбрал Ubuntu 12.10 x64 (http://www.ubuntu.com)

 

Шаг 2. Инструменты и исходные коды

Скачайте инструменты компиляции и исходные коды, предоставляемые Synology, согласно лицензии GPL (http://sourceforge.net/projects/dsgpl/files/)

Все действия производились с исходными кодами для процессоров Intel (серия Bromolow). Это не значит, что полученное ядро будет работать только на Bromolow процессорах.

Эксперименты показали, что проект успешно запускается на AMD, Atom, Cedarview, Pineview процессорах.

Вам понадобятся:

DSM 4.1 Tool Chains (gcc420_glibc236_x64_bromolow-GPL.tgz)

Synology NAS GPL Source (synogpl-2636-bromolow.tbz)

На момент написания этого руководства были актуальны версия DSM 4.1 и исходные коды ядра (2636 сборка).

 

Шаг 3. Распаковка исходных кодов

Установка инструментов и исходных кодов сводится к простой распаковке.

Распакуйте архивы.

tar -xvzf gcc420_glibc236_x64_bromolow-GPL.tgz -C /usr/local/ 

tar -xvjf synogpl-2636-bromolow.tbz -C /usr/local/x86_64-linux-gnu/

 

Важное замечание! Если вы используете 64-разрядную версию Ubuntu, необходимо установить 64-битные библиотеки.

sudo apt-get install libc6-i386

 

Для запуска конфигуратора ядра, необходимо установить Ncurses

sudo apt-get install build-essential ncurses-dev

 

Шаг 4. Сборка проекта.

Для сборки проекта необходимо:

переписать файл конфигурации "bromolow" из каталога "x86_64-linux-gnu/source/linux-3.x/synoconfigs" в каталог "x86_64-linux-gnu/source/linux-3.x" с именем ".config"

отредактировать "makefile" и установить значения переменным ARCH и CROSS_COMPILE

ARCH ?= x86_64
CROSS_COMPILE ?= /usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu-

Способ редактирования файла "makefile" не является верным. Более правильным способом является указание переменных с необходимыми значениями в командной строке вызова "make". Например: "make ARCH=x86_64 CROSS_COMPILE=/usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu- modules"

 

Перед сборкой модулей необходимо сконфигурировать ядро. Делается это командой "make menuconfig". Вам будет предложено невероятно огромное количество настроек ядра. По умолчанию загрузится конфигурация "bromolow", которую вы скопировали из каталога "x86_64-linux-gnu/source/linux-3.x/synoconfigs" с имеем ".config"

 

Стоит отметить, что на этом этапе необходимо как минимум включить поддержку сетевых контроллеров Realtek. Иначе собранное ядро будет искать только определенную модель контроллера Intel.

 

Далее выполните команду "make oldconfig". Теперь настало время собрать объектные модули. Выполните команду "make modules".

Сборка модулей достаточно затяжной процесс, и на медленных машинах может занять до 15 минут.

Если все вышеуказанные шаги были сделаны верно, сборка объектных модулей пройдет без ошибок.

 

Сборка ядра является так-же достаточно простой операцией. Введите команду "make bzImage". Результатом будет собранное ядро, находящееся в каталоге "/usr/local/x86_64-linux-gnu/source/linux-3.x/arch/x86/boot" с именем "bzImage". В последствии его нужно переименовать в "zImage".

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

 

Раздел 2. Модификация ядра.

Сразу оговорюсь, я произвел модификацию на скорую руку, и вполне вероятно, она не является правильной и корректной. Однако необходимого эффекта я добился.

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

 

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

Сердцем DSM является модуль "synobios.ko". Этот модуль содержится в двух местах: 1) на RAM диске (файл rd.gz) 2) на hda1 (файл hda1.tgz)

Если попытаться запустить систему с вновь собранным ядром, модуль synobios.ko не загрузится, и запускаться не будет.

Этому есть несколько причин:

1) В ядре отсутствуют функции "funcSynoSendEboxRefreshEvent" и "funcSynoEunitPowerctlType".

Эту неприятность можно легко поправить в файлах "/usr/local/x86_64-linux-gnu/source/linux-3.x/drivers/ata/libata-core.c" и "/usr/local/x86_64-linux-gnu/source/linux-3.x/kernel/sysctl.c".

//#ifdef MY_DEF_HERE  // закомментировать
int (*funcSYNOSendEboxRefreshEvent)(int portIndex) = NULL;
EXPORT_SYMBOL(funcSYNOSendEboxRefreshEvent);
//#endif  // закомментировать

//#ifdef MY_DEF_HERE  // закомментировать
EUNIT_PWRON_TYPE (*funcSynoEunitPowerctlType)(void) = NULL;
EXPORT_SYMBOL(funcSynoEunitPowerctlType);
//#endif  // закомментировать

2) Если собрать ядро с вышеуказанными изменениями, то при загрузки ядра будет падать функция syno_sata_mv_gpio_write(), я не стал глубоко вдаваться о её назначении (на первый взгляд она занимается получением состояния SATA диска, чтобы радостно мигать светодиодом на передней панели корпуса, при обращениях к диску), а просто закомментировал её содержимое в файле "/usr/local/x86_64-linux-gnu/source/linux-3.x/drivers/ata/sata_mv.c"

#ifdef MY_ABC_HERE
/*FIXME - Too brutal and directly, should separate into levels*/
void syno_sata_mv_gpio_write(u8 blFaulty, const unsigned short hostnum)
{
/*
struct Scsi_Host *shost = scsi_host_lookup(hostnum);
struct ata_port *ap = NULL;
void __iomem *host_mmio = NULL;
u32 gpio_value = 0;
int led_idx;

if(NULL == shost) {
	goto END;
}

if(NULL == (ap = ata_shost_to_port(shost))) {
	scsi_host_put(shost);
	goto END;
}

if(NULL == (host_mmio = mv_host_base(ap->host))) {
	scsi_host_put(shost);
	goto END;
}

led_idx = ap->print_id - ap->host->ports[0]->print_id;

gpio_value = readl(host_mmio + GPIO_CTL_DATA);

if(blFaulty) {
	gpio_value |= (1 << led_idx);
}else {
	gpio_value &= ~(1 << led_idx);
}

writel(gpio_value, host_mmio + GPIO_CTL_DATA);
scsi_host_put(shost);

END:
*/
return;
}
EXPORT_SYMBOL(syno_sata_mv_gpio_write);
#endif

После пересборки ядра с новыми изменениями, модуль synobios.ko уже не будет ругаться на отсутствующие функции, и не будет падать на вызове "syno_sata_mv_gpio_write()". Однако загружаться и рапортовать о своей готовности synobios.ko также не будет. Причиной всего является отсутствие на последовательном порту COM1 разработанного компанией Synology монитора (основанного на серийном микроконтроллере). Монитор занимается включением и выключением светодиодов, подачей звуковых сигналов, контролем температуры и системы охлаждения NAS. Одной из функций монитора является идентификация оборудования.

В качестве примера, я буду рассматривать synobios.ko (размер файла 52840 байт).

.text:0000000000002370                                         public SetMicropId
.text:0000000000002370                         SetMicropId     proc near               ; DATA XREF: .data:synobios_ops_0o
.text:0000000000002370
.text:0000000000002370                         var_18          = qword ptr -18h
.text:0000000000002370
.text:0000000000002370 48 83 EC 18                             sub     rsp, 18h
.text:0000000000002374 0F B6 15 1D 33 00 00                    movzx   edx, cs:syno_module+8
.text:000000000000237B 0F B6 05 17 33 00 00                    movzx   eax, cs:syno_module+9
.text:0000000000002382 48 C7 04 24 00 00 00 00                 mov     [rsp+18h+var_18], 0
.text:000000000000238A C0 EA 04                                shr     dl, 4
.text:000000000000238D 83 E0 0F                                and     eax, 0Fh
.text:0000000000002390 48 C1 E0 04                             shl     rax, 4
.text:0000000000002394 0F B6 D2                                movzx   edx, dl
.text:0000000000002397 48 09 D0                                or      rax, rdx
.text:000000000000239A 04 01                                   add     al, 1
.text:000000000000239C 74 15                                   jz      short loc_23B3
.text:000000000000239E 31 D2                                   xor     edx, edx
.text:00000000000023A0 81 3D F2 32 00 00 FF 00+                cmp     cs:MpId_20729, 0FFh
.text:00000000000023AA 74 1C                                   jz      short loc_23C8
.text:00000000000023AC
.text:00000000000023AC                         loc_23AC:                               ; CODE XREF: SetMicropId+56j
.text:00000000000023AC                                                                 ; SetMicropId+76j ...
.text:00000000000023AC 89 D0                                   mov     eax, edx
.text:00000000000023AE 48 83 C4 18                             add     rsp, 18h
.text:00000000000023B2 C3                                      retn
.text:00000000000023B3                         ; ---------------------------------------------------------------------------
.text:00000000000023B3
.text:00000000000023B3                         loc_23B3:                               ; CODE XREF: SetMicropId+2Cj
.text:00000000000023B3 48 C7 C7 FE 45 00 00                    mov     rdi, offset aGetMicropFail ; "get microp fail\n"
.text:00000000000023BA 31 C0                                   xor     eax, eax
.text:00000000000023BC E8 9B 42 00 00                          call    printk
.text:00000000000023C1 BA FF FF FF FF                          mov     edx, 0FFFFFFFFh
.text:00000000000023C6 EB E4                                   jmp     short loc_23AC
.text:00000000000023C8                         ; ---------------------------------------------------------------------------
.text:00000000000023C8
.text:00000000000023C8                         loc_23C8:                               ; CODE XREF: SetMicropId+3Aj
.text:00000000000023C8 48 C7 C6 13 46 00 00                    mov     rsi, offset aR  ; "R"
.text:00000000000023CF 48 89 E2                                mov     rdx, rsp
.text:00000000000023D2 B9 08 00 00 00                          mov     ecx, 8
.text:00000000000023D7 48 89 F7                                mov     rdi, rsi
.text:00000000000023DA E8 81 FE FF FF                          call    ReadUart
.text:00000000000023DF 85 C0                                   test    eax, eax
.text:00000000000023E1 BA FF FF FF FF                          mov     edx, 0FFFFFFFFh
.text:00000000000023E6 75 C4                                   jnz     short loc_23AC
.text:00000000000023E8 0F BE 04 24                             movsx   eax, byte ptr [rsp+18h+var_18]
.text:00000000000023EC 31 D2                                   xor     edx, edx
.text:00000000000023EE 89 05 A8 32 00 00                       mov     cs:MpId_20729, eax
.text:00000000000023F4 EB B6                                   jmp     short loc_23AC
.text:00000000000023F4                         SetMicropId     endp
.text:00000000000023F4
.text:00000000000023F4                         ; ---------------------------------------------------------------------------
.text:00000000000023F6 66 66 66 90 66 66 90 66+                align 20h

Выше представлена функция SetMicropId в которой по адресу .text:00000000000023E8 производиться чтение из монитора ID NAS.

Результат чтения будет помещен в регистр EAX. Так как монитора у нас нет, то необходимо произвести некоторую модификацию кода.

В нашем случае мы принудительно загрузим в регистр EAX необходимое значение.

 

text:00000000000023C8 48 C7 C6 13 46 00 00                    mov     rsi, offset aR  ; "R"
.text:00000000000023CF 48 89 E2                                mov     rdx, rsp
.text:00000000000023D2 B9 08 00 00 00                          mov     ecx, 8
.text:00000000000023D7 48 89 F7                                mov     rdi, rsi
.text:00000000000023DA E8 81 FE FF FF                          call    ReadUart
.text:00000000000023DF 85 C0                                   test    eax, eax
.text:00000000000023E1 BA FF FF FF FF                          mov     edx, 0FFFFFFFFh
.text:00000000000023E6 90                                      nop
.text:00000000000023E7 B8 42 00 00 00                          mov     eax, 42h ; 'B'
.text:00000000000023EC 31 D2                                   xor     edx, edx
.text:00000000000023EE 89 05 A8 32 00 00                       mov     cs:MpId_20729, eax
.text:00000000000023F4 EB B6                                   jmp     short loc_23AC
.text:00000000000023F4                         SetMicropId     endp

P.S. Изначально этот хак был мной подсмотрен у уважаемого vortex'a, курирующего проект QNology (http://qnology.xvtx.ru/).

 

Итак, регистр EAX должен содержать код модели, который можно подсмотреть в файле "/usr/local/x86_64-linux-gnu/source/linux-3.x/include/linux/synobios.h или ниже:

typedef enum {
MICROP_ID_710p = 0x31, /* '1' */
MICROP_ID_411p = 0x33, /* '3' 411+II is the same*/
MICROP_ID_1010p = 0x32, /* '2' */
MICROP_ID_1511p = 0x36, /* '6' */
MICROP_ID_810p = 0x35, /* '5' */
MICROP_ID_810rp = 0x34, /* '4' */
MICROP_ID_2211p = 0x37, /* '7' */
MICROP_ID_2211rp = 0x38, /* '8' */
MICROP_ID_2411p = 0x39, /* '9' */
MICROP_ID_3411xs = 0x43, /* 'C' 3412xs is the same */
MICROP_ID_3411rpxs = 0x41, /* 'A' 3412rpxs is the same */
MICROP_ID_3611xs = 0x42, /* 'B' 3612xs is the same*/
MICROP_ID_712p = 0x44, /* 'D' */
MICROP_ID_412p = 0x45, /* 'E' */
MICROP_ID_1512p = 0x47, /* 'G' */
MICROP_ID_1812p = 0x46, /* 'F' */
MICROP_ID_812p = 0x48, /* 'H' */
MICROP_ID_812rp = 0x49, /* 'I' */
MICROP_ID_2212p = 0x4A, /* 'J' */
MICROP_ID_2212rp = 0x4B, /* 'K' */
MICROP_ID_2413p = 0x4C, /* 'L' */
MICROP_ID_10613xsp = 0x4d, /* 'M' */
MICROP_ID_3413xsp = 0x4e, /* 'N' */
MICROP_ID_913p = 0x4f, /* 'O' */
MICROP_ID_713p = 0x50, /* 'P' */
MICROP_ID_UNKNOW = 0xFF,
} SYNO_MICROP_ID;

Уже в процессе эксплуатации мода, я столкнулся с постоянно вываливающимся в консоль, предупреждением: "synobios: buzzer stop button pressed"

Решил проблему с ним достаточно быстро, пропатчив одну функцию

.text:0000000000000395 80 7C 24 17 00                          cmp     [rsp+28h+var_11], 0
.text:000000000000039A EB D4                                   jmp     short loc_370 // JZ изменил на JMP

 

На этом, процесс модификации ядра и модуля synobios.ko можно считать завершенным.

 

Раздел 3. Сборка комплекта для инсталляции.

Шаг 1. Модификация rd.gz и hda1.tgz

Теперь, имея исправленный synobios.ko, необходимо поместить его на своё законное место.

В качестве подопытного, я ипользовал прошивку от DS3612xs (файл DSM_DS3612xs_2668.pat). Файл, с расширением .PAT представляет собой tar архив и содержит в себе достаточно большой набор файлов некоторое количество из которых нам никогда не понадобятся. Удаляем лишнее, и получаем минимально необходимый комплект:

checksum.syno		// содержит контрольные суммы всех, перечисленных ниже файлов
grub_cksum.syno	// содержит контрольную сумму файлов zImage и rd.gz (используется в загрузчике GRUB)
hda1.tgz			// образ системы
rd.gz				// RAM диск
updater			// WEB версия установщика (вместо Synology Assistent)
VERSION			// Файл, содержащий версию DSM
zImage			// Образ ядра

 

Первым делом нужно поместить новый "synobios.ko" на RAM диск в файле "rd.gz".

Для этого его необходимо распаковать и смонтировать

gunzip /tmp/rd.gz
sudo mount -t ext2 -o loop rd /mnt/ramdisk

Перезаписываем "synobios.ko" в каталоге /mnt/ramdisk/lib/modules

 

Пакуем RAM диск

sudo umount /mnt/ramdisk
gzip /tmp/rd

 

Вторым делом, нужно заменить "synobios.ko" в образе системы (файл hda1.tgz)

Для этого я использовал вспомогательную утилиту Archivemount (http://en.wikipedia.org/wiki/Archivemount). Её необходимо предварительно установить.

Копируем hda1.tgz в /tmp и монтируем командой:

sudo archivemount /tmp/hda1.tgz /mnt/hdd

Перезаписываем "synobios.ko" в каталоге /mnt/hdd/lib/modules

Размонтируем командой:

sudo umount /mnt/hdd

В каталоге /tmp появится обновленный файл hda1.tgz

Его необходимо переименовать в hda1 и запаковать архиватором xz командой: xz -z9 hda1

Полученный файл "hda1.xz" переименовать в "hda1.tgz"

 

Шаг 2. Пересчет контрольной суммы

Теперь мы имеем собранный zImage, модифицированные rd.gz и hda1

Настало время собрать валидный PAT файл, который можно использовать для установки системы.

Чтобы PAT файл был валидным, необходимо пересчитать контрольную сумму файлов и поместить их в checksum.syno

Для этих целей есть генератор файла контрольных сумм: Раздел 4. Загрузочный диск. Модификация GRUB[/size]

Шаг 1. Структура загрузочного диска.

Загрузочный диск состоит из двух разделов. На первом разделе находится загрузчик модифицированный загрузчик GRUB.

Функции, которые производит загрузчик являются достаточно ключевыми:

1) Проверка контрольных сумм файлов ядра системы (zImage) и RAM диска (rd.gz) и сверка их со значениями, хранящимися в файле grub_cksum.syno с второго раздела загрузочного диска.

2) Идентификация оборудования (чтение из монитора, висящего на COM1) аналогично функции SetMicropId в synobios.ko

3) Чтение конфигурации железа (MAC адрес сетевых карт и серийный номер) из файла vender

 

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

Описывать этот процесс не имеет смысла, так как готовый к употреблению загрузчик содержится в сборке XPEnology. Стоит отметить, что код устройства можно изменить по адресу:

seg000:0000DEF7 E8 F1 38 01 00                          call    serial_port_READ
seg000:0000DEFC B8 36 00 00 00                          mov     eax, 42h

Регистр EAX должен содержать код оборудования, согласно таблицы, представленной выше.

Эта инструкция содержится по смещению 0x5efc модуля stage2 загрузчика.

 

Для расчета контрольной суммы файлов zImage и rd.gz можно воспользоваться встроенной в загрузчик функцией проверки контрольных сумм.

Если контрольная сумма zImage не верная, загрузчик сообщит об этом и покажет корректную. Перепишите корректную в файл grub_cksum.syno и запустите загрузчик повторно. Он рассчитает соответственно вторую контрольную сумму для файла rd.gs

 

Желающие копнуть глубже могут выудить алгоритм из загрузчика (stage2). Он основан на алгоритме MD5 c небольшими изменениями.

 

Шаг 2. Изменение MAC адреса и серийного номера.

файл vender

0000000000: 00 11 32 08 D6 2A 4B 00 │ 11 32 08 D6 2B 4C 00 00   ◄2◘Ц*K ◄2◘Ц+L
0000000010: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000020: 42 33 4A 34 4E 30 30 30 │ 30 30 31 00 00 00 00 00  B3J4N000001
0000000030: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000040: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000050: 00 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00
0000000060: 00 00 00 00 5B 00 00 00 │ 69 00 00 00 01 01 00 00      [   i   ☺☺
0000000070: 00 00 00 00 00 00 00 00 │ 00 00 00 00 01 01 01 01              ☺☺☺☺
0000000080: 00 00 00 00 00 00 00 00 │ 00 00 00 00 01 01 01 01              ☺☺☺☺
0000000090: 01 01 01 01 01 01 01 00 │ 00 01 00 00 00 00 00 00  ☺☺☺☺☺☺☺  ☺
00000000A0: 00 00 00 00 00 00 00 00 │ 00 00 00 00 01 01 01 00              ☺☺☺
00000000B0: 01 00 00 00 00 00 00 00 │ 00 00 00 00 00 00 00 00  ☺

Смещение 0x0001 - MAC адрес 1

Смещение 0x0008 - MAC адрес 2

Смещение 0x000F - MAC адрес 3

Смещение 0x0017 - MAC адрес 4

Смещение 0x0020 - серийный номер

 

На этом данное описание можно считать завершенным.

 

Благодарю за внимание. В ближайшие дни инструкция будет дополнена и переведена на английский.

Принимаю любые дополнения и предложения !

 

С Уважением, Andy хренолог :smile:

 

В планах:

1) Нарисовать эмулятор монитора и встроить его в ядро. Либо выполнить его в виде демона.

2) Адаптировать какой-нибудь китайский девайс, типа (http://www.aliexpress.com/item/4-Fan-Sp ... 36498.html) для вывода информации о дисках и т.д...

synologychecksum.zip

Link to post
Share on other sites

Cпасибо!

Ещё хочу добавить:

При попытке запустить на AMD железе, ядро виснет.

Нужно включить поддержку AMD процессоров в ваш .config:

CONFIG_CPU_SUP_AMD=y

Далее ядро скорее всего начнет сыпать ошибками в лог:

[   14.166781] parameter error. gpiobase=00000000, pin=16, pValue=ffff88041c0a1d9c
[   14.175453] parameter error. gpiobase=00000000, pin=18, pValue=ffff88041c0a1d8c
[   14.184580] parameter error. gpiobase=00000000, pin=20, pValue=ffff88041c0a1d9c

Для подавления вывода этих ошибок можно в файле drivers/pci/quirks.c закомментировать строку "printk("parameter error. gpiobase=%08X, pin=%d, pValue=%p\n", gpiobase, pin, pValue);" так:

   if ( 0 == gpiobase ||
        ( pin < 0 || pin >= 96 ) ||
        NULL == pValue )
   {
       //printk("parameter error. gpiobase=%08X, pin=%d, pValue=%p\n", gpiobase, pin, pValue);
       goto END;
   }

 

Для подавления ругани "Unknown cmd fd блаблабла" закомментировать в файле compat_ioctl.c с 1606 по 1611 строку вот так:

	 sprintf(buf,"'%c'", (cmd>>_IOC_TYPESHIFT) & _IOC_TYPEMASK);
if (!isprint(buf[1]))
	sprintf(buf, "%02x", buf[1]);
//compat_printk("ioctl32(%s:%d): Unknown cmd fd(%d) "
//		"cmd(%08x){t:%s;sz:%u} arg(%08x) on %s\n",
//		current->comm, current->pid,
//		(int)fd, (unsigned int)cmd, buf,
//		(cmd >> _IOC_SIZESHIFT) & _IOC_SIZEMASK,
//		(unsigned int)arg, fn);

Edited by Guest
Link to post
Share on other sites

Далее нужно поискать, как решить проблему с определением usb устройств и назначением нашей usb флешки как /dev/synoboot

У меня на реальном железе флешка правильно встала. Виной тому, какие-то настройки в BIOS. Не могу вспомнить точно. Попробую завтра изучить железо.

 

Еще в планах написать на PC тулзу, которая бы вставляла synobios.ko куда надо и пересчитывала бы контрольки.

А то слишком много ручной работы.

Link to post
Share on other sites
Еще в планах написать на PC тулзу, которая бы вставляла synobios.ko куда надо и пересчитывала бы контрольки.

А то слишком много ручной работы.

Можно зашить подмену модуля в рамдиск в скрипт обновления или после него, чтобы использовать оригинальный pat файл. Это будет удобно для обновления.

Нужно попробовать на выходных на тестбоксе.

Link to post
Share on other sites
Можно зашить подмену модуля в рамдиск в скрипт обновления или после него, чтобы использовать оригинальный pat файл. Это будет удобно для обновления. Нужно попробовать на выходных на тестбоксе.

Предполагаю что за несколько месяцев тут соберется отличная команда, и общими усилиями мы сделаем "конфетку" :wink:

 

Кстати, рассматривая сорцы, я заметил что есть некоторое количество кода, спрятанное за дефайном "ifdef MY_DEF_HERE"

Данный код не собирается и этот дефайн нигде не устанавливается. Очень любопытно, что это за ветка кода такая....

Link to post
Share on other sites
перебилдил ядро. включив несколько опций.

увы, не работает.

ошибка на скриншоте...

где копать ?

 

Покажите весь лог загрузки ядра.

Link to post
Share on other sites
подскажите пожалуйста как ?

я забросил модифицированое ядро на synoboot.img

Откуда там можно выдрать лог загрузки ?

 

Включите виртуальный последовательный порт COM1. Все логи падают на него.

Link to post
Share on other sites
рассматривая сорцы, я заметил что есть некоторое количество кода, спрятанное за дефайном "ifdef MY_DEF_HERE"

Данный код не собирается и этот дефайн нигде не устанавливается. Очень любопытно, что это за ветка кода такая....

Задефайнил, пересобралось несколько файлов, визуально ничего не поменялось, ничего не отвалилось.

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

 

Да, если надоела ругань на Unknown cmd fd ... - во втором посте этого треда добавил ещё один грубый хак.

Link to post
Share on other sites

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

Link to post
Share on other sites
  • 1 month later...

Спасибо за статью. В vendor поменял мак на мак карты (с х01 6 байтов и с 0х08 обнулил второй мак) и загрузился с флэшки. ДСМ ассистент ПК засек, есть опция установить, но на ПК во время загрузки написано у МАК1 Empty or invalid checksum (Random 'случайныймак'). И в ассистенте виден этот случайный мак. Что может быть не так? Если теперь установить pat, будет работать с таким нюансом?

Link to post
Share on other sites
  • 4 weeks later...

Подскажите можно ли как-то добавить драйвера в систему без сборки ядра. Собрать ядро пробовал, но неосилил.

Драйвера нужны для внутренней  DVB-S карты. Поскольку TVheadend (тв-сервер) для synology уже существует и работает в виде плагина очень не хочется городить отдельную систему.

XPEnology установлена на HP Microserver.

Link to post
Share on other sites
  • 4 weeks later...
  • 6 months later...
Спасибо за статью. В vendor поменял мак на мак карты (с х01 6 байтов и с 0х08 обнулил второй мак) и загрузился с флэшки. ДСМ ассистент ПК засек, есть опция установить, но на ПК во время загрузки написано у МАК1 Empty or invalid checksum (Random 'случайныймак'). И в ассистенте виден этот случайный мак. Что может быть не так? Если теперь установить pat, будет работать с таким нюансом?

Нужно еще пересчитать и правильно заменить контрольную сумму, которая идет сразу за MAC адресом.

Почитай внимательно здесь viewtopic.php?f=5&t=584

Link to post
Share on other sites
  • 2 months later...

Здравствуйте!

 

Пересобрал ядро 3.2.40 для DS414 (armadaxp), включил драйверы DVB, родные из videostation работают некорректно для skystar usb hd. Запнулся на synobios.ko. Во-первых не знаю как корректно его разобрать и отредактировать, а во-вторых понятия не имею какие значения и на что нужно там менять. Не могли бы Вы помочь в данном вопросе? Спасибо! На всяк случай прикладываю модуль.

synobios.rar

Link to post
Share on other sites
Can you Translate it to Eng please Thanks :wink:

 

Please wait 2-3 days.

Этот план еще в силе? Есть желание самому "пофтыкать" ну и howto запилить на английском.

Link to post
Share on other sites
  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.