includeを修正しようとしていますcpio
。したがって、まず画像を抽出してから画像をパッケージ化する必要があります。イメージには、すべてのファイルが絶対ファイル名で指定されたファイルシステム全体が含まれているため、自分のシステムのルートシステムと競合する可能性があるため、直接圧縮または解凍することはできません。
だから、解凍するときは、通常、目的の--no-absolute-filenames
作業ディレクトリに解凍します。もう荷物を安くしたいです。ただパッケージすると、次のようなファイルが得られます。
/path/to/working/directory/file1
/path/to/working/directory/file2
/path/to/working/directory/file3
または
./file1
./file2
./file3
変える
/file1
/file2
/file3
希望の出力を取得する方法を知っている人はいますか? Googleはこれまで私を助けていませんでした。
u-boot uImage ファイルシステムイメージに使用しているため、出力ファイルに絶対パス名が必要です。それ以外の場合は起動しません。
答え1
Pythonがあり、次のものがある場合:
- インストールするlibarchive-c(例:使用
pip install libarchive-c
) - すべてのファイルを
root
現在のディレクトリの下のディレクトリに置きます(私はこれを使用しました
mkdir -p root/xyz ; echo 1 > root/abc.txt ; echo 2> root/xyz/def.txt
)。 以下を別の名前で保存し
abscpio
て実行可能にします(chmod 755 abscpio
)。#! /usr/bin/env python import os import sys from libarchive import ffi from libarchive.write import ( new_archive_write, ArchiveWrite, new_archive_read_disk) from libarchive.entry import new_archive_entry, ArchiveEntry from libarchive.ffi import ( ARCHIVE_EOF, entry_sourcepath, entry_clear, read_next_header2, read_disk_descend, write_header, write_data, write_finish_entry, ) class AbsArchiveWrite(ArchiveWrite): def add_abs_file(self, path, store_path): """Read the given paths from disk and add them to the archive. """ write_p = self._pointer block_size = ffi.write_get_bytes_per_block(write_p) if block_size <= 0: block_size = 10240 # pragma: no cover with new_archive_entry() as entry_p: entry = ArchiveEntry(None, entry_p) with new_archive_read_disk(path) as read_p: while 1: r = read_next_header2(read_p, entry_p) if r == ARCHIVE_EOF: break entry.pathname = store_path read_disk_descend(read_p) write_header(write_p, entry_p) try: with open(entry_sourcepath(entry_p), 'rb') as f: while 1: data = f.read(block_size) if not data: break write_data(write_p, data, len(data)) except IOError as e: if e.errno != 21: raise # pragma: no cover write_finish_entry(write_p) entry_clear(entry_p) if os.path.isdir(path): break base_dir = sys.argv[2] with new_archive_write('cpio', None) as archive_p: ffi.write_open_filename_w(archive_p, sys.argv[1]) a = AbsArchiveWrite(archive_p) for root, dir_names, file_names in os.walk(base_dir): for dir_name in dir_names: full_name = os.path.join(root, dir_name) a.add_abs_file(full_name, full_name.replace(base_dir, '/', 1)) for file_name in file_names: full_name = os.path.join(root, file_name) a.add_abs_file(full_name, full_name.replace(base_dir, '/', 1)) print '----- listing ' + sys.argv[1] os.system('cpio -itv -I ' + sys.argv[1])
あなたはできます:
abscpio my_arch.cpio root/
出力は次のようになります。
----- listing my_arch.cpio
drwxrwxr-x 2 anthon users 0 Jun 25 18:59 /xyz
-rw-rw-r-- 1 anthon users 2 Jun 25 18:59 /abc.txt
-rw-rw-r-- 1 anthon users 0 Jun 25 18:59 /xyz/def.txt
本番環境では、スクリプトから最後の2行を削除できます。
リンクも保存されていますが、他の「ファイル」形式は試していません。
答え2
使用公園-s
アーカイブにファイルを追加するときにファイル名を変更するオプションもあります。 PaxはPOSIXレガシーユーティリティを置き換えますtar
。cpio
一部のLinuxディストリビューションではデフォルトではインストールされませんが、常にパッケージとして使用できます。
pax -w -x cpio -s '~^[/]*~~' root-directory >archive.cpio