rootfs.jffs2 ファイルシステムは mtd3 には適していません。

rootfs.jffs2 ファイルシステムは mtd3 には適していません。

Flash mtd3パーティションに入れたいファイルシステムがあります。まず、ubootを使用して起動し、run sdboot次のようにSDカードを使用しました。

U-Boot-PetaLinux>
U-Boot-PetaLinux> printenv mtdparts
mtdparts=mtdparts=0:5M(boot),128K(bootenv),10752K(image),4M(spare)
U-Boot-PetaLinux>run sdboot

今私はLinuxシステムを運営しています。

.
.
.
.
root@Xilinx-ZC702-14_7:/mnt/flashboot# nandwrite -p /dev/mtd3 rootfs.jffs2
Image 3513340 bytes, NAND page 1 bytes, OOB area 0 bytes, device size 393216 bytes
nandwrite: error!: Input file does not fit into device
           error 0 (Success)
nandwrite: error!: Data was only partially written due to error
           error 0 (Success)

では、なぜ表示されますか?

ナンドライト:エラー! :入力ファイルがデバイスに収まりません。

最初の行で私の環境変数を見ることができます。 4MBの十分なスペースを提供しましたが、なぜ3513340バイト(3.35MB)サイズの画像がデバイスに収まらないのですか?そしてこれはどこから来たのですか?

デバイスサイズは393216バイトになりますか?

追加情報

#cat /proc/cmdline
console=ttyPS0,115200

MTD情報:

Count of MTD devices:           4
Present MTD devices:            mtd0, mtd1, mtd2, mtd3
Sysfs interface supported:      yes

分割

root@Xilinx-ZC702-14_7:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00500000 00010000 "boot"
mtd1: 00020000 00010000 "bootenv"
mtd2: 00a80000 00010000 "image"
mtd3: 00060000 00010000 "spare"

また見ることができます:

root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd0
mtd0
Name:                           boot
Type:                           nor
Eraseblock size:                65536 bytes, 64.0 KiB
Amount of eraseblocks:          80 (5242880 bytes, 5.0 MiB)
Minimum input/output unit size: 1 byte
Sub-page size:                  1 byte
Character device major/minor:   90:0
Bad blocks are allowed:         false
Device is writable:             true

root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd1
mtd1
Name:                           bootenv
Type:                           nor
Eraseblock size:                65536 bytes, 64.0 KiB
Amount of eraseblocks:          2 (131072 bytes, 128.0 KiB)
Minimum input/output unit size: 1 byte
Sub-page size:                  1 byte
Character device major/minor:   90:2
Bad blocks are allowed:         false
Device is writable:             true

root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd2
mtd2
Name:                           image
Type:                           nor
Eraseblock size:                65536 bytes, 64.0 KiB
Amount of eraseblocks:          168 (11010048 bytes, 10.5 MiB)
Minimum input/output unit size: 1 byte
Sub-page size:                  1 byte
Character device major/minor:   90:4
Bad blocks are allowed:         false
Device is writable:             true

root@Xilinx-ZC702-14_7:/mnt/flash# mtdinfo /dev/mtd3
mtd3
Name:                           spare
Type:                           nor
Eraseblock size:                65536 bytes, 64.0 KiB
Amount of eraseblocks:          6 (393216 bytes, 384.0 KiB)
Minimum input/output unit size: 1 byte
Sub-page size:                  1 byte
Character device major/minor:   90:6
Bad blocks are allowed:         false
Device is writable:             true

システム

ARM Cortex A9で実行されているpetalinux

http://www.wiki.xilinx.com/Linux

https://github.com/Xilinx

デバイスツリー http://git.yoctoproject.org/cgit/cgit.cgi/meta-xilinx/plain/conf/machine/boards/zedboard/zedboard-zynq7-board.dtsi

構成ツールのパーティション これは、image.ubを構築する前に使用した設定ツールです。 jffs2のサイズを見ると、rootfs.jffs2ファイルの実際のサイズより大きいです。

ここに画像の説明を入力してください。

/sys/クラス/mtd

root@Xilinx-ZC702-14_7:/sys/class/mtd# ls -ld *
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd0 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd0
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd0ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd0ro
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd1 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd1
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd1ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd1ro
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd2 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd2
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd2ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd2ro
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd3 -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd3
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 mtd3ro -> ../../devices/amba.0/e000d000.ps7-qspi/spi_master/spi32766/spi32766.0/mtd/mtd3ro
root@Xilinx-ZC702-14_7:/sys/class/mtd#

ドライバー

root@Xilinx-ZC702-14_7:~# ls /sys/bus/*/drivers

/sys/bus/amba/drivers:

/sys/bus/clocksource/drivers:

/sys/bus/cpu/drivers:

/sys/bus/hid/drivers:
hid-generic

/sys/bus/i2c/drivers:
at24     dummy    pca954x

/sys/bus/mdio_bus/drivers:
Generic PHY

/sys/bus/mmc/drivers:
mmcblk

/sys/bus/platform/drivers:
alarmtimer       vexpress-sysreg  xilinx-gpio      xusbps-dr
of-flash         xadcps           xilinx_emaclite  xusbps-ehci
physmap-flash    xdevcfg          xqspips          xusbps-otg
sdhci-zynq       xemacps          xslcr            xusbps-udc
uio_pdrv_genirq  xgpiops          xsmcps           xwdtps
vexpress-reset   xi2cps           xuartps          zynq_remoteproc

/sys/bus/rpmsg/drivers:
rpmsg_proto          rpmsg_server_sample

/sys/bus/scsi/drivers:
ch    osst  sd    sr    st

/sys/bus/sdio/drivers:

/sys/bus/serio/drivers:

/sys/bus/spi/drivers:
m25p80

/sys/bus/usb/drivers:
hub          usb          usb-storage  usbfs        usbhid

/sys/bus/virtio/drivers:
virtio_rpmsg_bus
root@Xilinx-ZC702-14_7:~#

mmカードドライバ

root@Xilinx-ZC702-14_7:/# cd /sys/bus/mmc/drivers/mmcblk/
root@Xilinx-ZC702-14_7:/sys/bus/mmc/drivers/mmcblk# ls
bind       mmc0:1234  uevent     unbind
root@Xilinx-ZC702-14_7:/sys/bus/mmc/drivers/mmcblk# cd mmc0\:1234/
root@Xilinx-ZC702-14_7:/sys/devices/amba.0/e0100000.ps7-sdio/mmc_host/mmc0/mmc0:1234# ls
cid                   hwrev                 scr
csd                   manfid                serial
date                  name                  subsystem
driver                oemid                 type
erase_size            power                 uevent
fwr

解決策

設定ツールを使用し、以前に選択していなかった次の項目を選択して問題を解決しました。

File systems  ---> 
-*- Native language support  --->
    <*>   Codepage 437 (United States, Canada)
    ...
    <*>   NLS ISO 8859-1  (Latin 1; Western European Languages)
    ... 

答え1

まず、mtdparts環境変数が実際のパーティションサイズに関する意味のある情報を渡さないと思います。mtdparts環境変数ではなくカーネル起動パラメーターでなければなりません。 PetaLinux は起動時にこれらの値を環境に入れることができます。しかし、それでもフォーマットが間違っているようです。カーネルブートパラメータを表示するには、次の手順を実行できますcat /proc/cmdline

カーネルが作成するパーティションのサイズを確認するには、/proc/mtd他の質問を参照してください。実際に生成されたブロックデバイスのサイズをバイト単位で確認するには、次の手順を実行できますblockdev --getsize64 /dev/mtd3(root権限が必要)。すべてが順調に進むなら、二人は良い相性を実現します!

パーティションサイズが小さすぎると仮定すると、パーティションサイズを増やす必要があります。 (他の質問でもそうでした!)mtdpartsこれを行う正しい方法は、起動時にパラメータを指定することです。drivers/mtd/cmdlinepart.cカーネルソースコードでは、(drivers/mtd/Kconfig以前に使用されていたほぼ同じコードスニペットよりも少し多くの情報を提供することに注意してください)、正しいフォーマット仕様は次のとおりです。

 * The format for the command line is as follows:
 *
 * mtdparts=<mtddef>[;<mtddef]
 * <mtddef>  := <mtd-id>:<partdef>[,<partdef>]
 * <partdef> := <size>[@<offset>][<name>][ro][lk]
 * <mtd-id>  := unique name used in mapping driver/device (mtd->name)
 * <size>    := standard linux memsize OR "-" to denote all remaining space
 *              size is automatically truncated at end of device
 *              if specified or trucated size is 0 the part is skipped
 * <offset>  := standard linux memsize
 *              if omitted the part will immediately follow the previous part
 *              or 0 if the first part
 * <name>    := '(' NAME ')'
 *              NAME will appear in /proc/mtd
 *
 * <size> and <offset> can be specified such that the parts are out of order
 * in physical memory and may even overlap.
 *
 * The parts are assigned MTD numbers in the order they are specified in the
 * command line regardless of their order in physical memory.
 *
 * Examples:
 *
 * 1 NOR Flash, with 1 single writable partition:
 * edb7312-nor:-
 *
 * 1 NOR Flash with 2 partitions, 1 NAND with one
 * edb7312-nor:256k(ARMboot)ro,-(root);edb7312-nand:-(home)

それが正確に何を意味するのかstandard linux memsizeは不明です。Documentation/kernel-parameters.txt次の段落を見ると:

Finally, the [KMG] suffix is commonly described after a number of kernel
parameter values. These 'K', 'M', and 'G' letters represent the _binary_
multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30
bytes respectively. Such letter suffixes can also be entirely omitted.

これは予想される大文字の使用ですが、k例で使用されている小文字が同じ能力を指定するのか、それとも別の能力を指定するのかについては言及していませんK(これを無視して状況に応じて大文字を使用するのが最善です)。

質問した内容で見ると、このmtdparts=mtdparts=部分が間違っているようです。通常、環境変数の場合、変数名は変数値の一部ではありません。それ0も効果的ではないようですmtd-id

あなたが与えた他のすべてはmtdparts大丈夫だと思います。パーティションのサイズは削除ブロックと同じサイズになるように慎重に選択する必要がありますが、/proc/mtd他の質問の削除ブロックサイズが64KiBであることを考慮するとそうです。

正しいものを探すmtd-id

実行中のシステムではこれを確認する方法がないようです。 MTDデバイスに関するさまざまな情報は以下で確認できますが、/sys/class/mtd現在この情報は利用できません。このmtdinfoコマンドは、この情報を読み込んで書式設定する以外に何もしないように見えるため、あまり役に立ちません。

ただし、使用されているドライバの場合は、カーネルソースコードを見るとそれを見つけることができます。これを行うには、次のコマンドを使用して安定した最新のソースツリーを表示できます。

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

あるいは、ディストリビューションで使用されているカーネルバージョンのコードを使用することをお勧めします。デバイス自体には約1.4 GBをダウンロードするのに十分なスペースがない可能性があることに注意してください。ソースツリーのルート内で、次のコマンドは値が設定されたほとんどの場所を示しています(コードは構造の名前をmtd->name使用する必要はありませんが、一般的に使用します)。mtd

grep -rE 'mtd(\.|->|-)name[[:space:]]*='

ほとんどの場合、ドライバにハードコードされているか、情報がファイルにあります.dts。これはまた、私たちが探しているドライバーがここにいる可能性があることを示していますdrivers/mtd。詳しくは、次のコマンドを使用してください。

for drv in a bunch of drivers; do
  find . -iname "*$drv*"
done | grep mtd

ディスプレイMTDドライバは、m25p80SPIを介して通信するさまざまなフラッシュデバイスで動作します(PCI関連の項目を見つけることが役に立たない理由を説明します)。ソースファイルを見ると、次のコードスニペットに設定されているdrivers/mtd/devices/m25p80.cことがわかります。mtd->name

  if (data && data->name)
    flash->mtd.name = data->name;
  else
    flash->mtd.name = dev_name(&spi->dev);

残念ながら、ドライバは単一の特定の名前を使用せず、代わりに名前が異なる場所で定義され、使用されるハードウェアによって異なります。もっと詳しく調べてみると、これが構造であることがdataわかりましたflash_platform_data。定義を調べると、次のような意見がありますinclude/linux/spi/flash.h

 * struct flash_platform_data: board-specific flash data
 * @name: optional flash device name (eg, as used with mtdparts=)
 * @parts: optional array of mtd_partitions for static partitioning
 * @nr_parts: number of mtd_partitions for static partitoning
 * @type: optional flash device type (e.g. m25p80 vs m25p64), for use
 *  with chips that can't be queried for JEDEC or other IDs
 *
 * Board init code (in arch/.../mach-xxx/board-yyy.c files) can
 * provide information about SPI flash parts (such as DataFlash) to
 * help set up the device and its appropriate default partitioning.
 *
 * Note that for DataFlash, sizes for pages, blocks, and sectors are
 * rarely powers of two; and partitions should be sector-aligned.

mtd-idフラッシュ自体ではなくマザーボードに固有のようです。この構造の使用法は、-A 2一致後に2行を印刷し、使用されたほとんどの名前を表示します。

grep -rA 2 '[[:space:]]flash_platform_data'

ファイル名にはボード名も反映されますので、ボードがそこにあることを願っています。よく使われていたので、m25p80おそらくmtd-idそうです。

失敗した場合、コードスニペットの他のブランチはデバイスを再追跡しinit_nameますが、デバイスを見つける方法はわかりません(dmesg?)。

m25p80yesと仮定すると、mtd-idカーネルパラメータは次のようになります。

mtdparts=m25p80:5M(boot),128K(bootenv),10752K(image),4M(spare)

残りはU Bootを再設定してbootargsパラメータに追加することです。再起動すると、必要なパーティションサイズが得られます。

関連情報