Как вручную смонтировать виртуальные файловые системы, скопировать разделы MTD

Это немного сложно, но выполнимо:

function die {
        print -ru2 -- "E: $*"
        exit 1
}

function psubin {
        local stdin=$(cat; echo .) pipe

        pipe=$(mktemp /tmp/psub.XXXXXXXXXX) || die mktemp

        # this is racy
        rm -f "$pipe"
        mkfifo "$pipe" || die mkfifo

        (
                # don’t block parent
                exec <&- >&- 2>&-
                # write content to FIFO
                print -nr -- "${stdin%.}" >"$pipe"
                # signal EOF to reader, ensure it’s not merged
                sleep 0.1
                :>"$pipe"
                # clean up
                (sleep 1; rm -f "$pipe") &
        ) &
        print -nr -- "$pipe"
}

diff -u $(echo abc | psubin) $(echo def | psubin)

Проблемы, с которыми мы столкнулись здесь, следующие:

  • mkfifo жалуется, если вы rm mktemp не выведете первые
  • блоки mksh для фоновый процесс, если он по-прежнему разделяет какие-либо файловые дескрипторы (stdin, stdout, stderr) с родительским (Примечание: это, вероятно, единственный допустимый вариант использования для использования > & - вместо > / dev / null , и только потому, что мы можем гарантировать, что эти fds больше не будут использоваться или заменены какими-либо новыми fds)
  • , поскольку у нас нет stdin в фоновом процессе, нам нужно кэшировать его содержимое, с точностью до байта
  • EOF с FIFO (именованными каналами) нетривиален. Давайте просто оставим это… (мы могли бы проделать некоторые трюки, пытаясь открыть неблокирующий FIFO, чтобы проверить, есть ли читатель, и сигнализировать EOF, пока читатель не умрет, но это работает достаточно хорошо на данный момент )
  • будет лучше, если FIFO будет удален после использования…

С другой стороны: хорошо, что мы делаем это сейчас, потому что в конечном итоге я захочу реализовать <(…) в самом mksh , а затем мне нужно знать, чего следует остерегаться, поскольку мы не можем использовать / dev / fd / , как это делает GNU bash, потому что это недостаточно переносимо.

1
19.04.2019, 18:03
1 ответ

Как правило, также будет устройство /dev/mtdblockN, по одному на каждый раздел MTD. Это блочные устройства, которые вы можете использовать с nanddump, dd, mount и т. д.

Вам нужно создать каталог точки монтирования, например, (mkdir -p /media/mnt ). Тогда это зависит от того, какую файловую систему использует ваш раздел NAND. Например, у меня есть два раздела UBIFS NAND, и я буду использовать такие команды, как:

/usr/bin/ubiattach /dev/ubi_ctrl -m <MTD_partition> -O <block_size>
/bin/mount -t ubifs ubi1:rootfs0 /media/mnt

Если раздел не имеет файловой системы (, такой как образ ядра ), то nanddump будет работать.

nanddump -f /tmp/mtd0.bin /dev/mtdblock0

Если раздел представляет собой флэш-память данных (ИЛИ ), тогда dd будет работать.

dd if=/dev/mtdblock1 of=/tmp/mtd1.bin
3
28.01.2020, 00:14

Теги

Похожие вопросы