異なる絶対ディレクトリを使用してcpioファイルを作成する

異なる絶対ディレクトリを使用してcpioファイルを作成する

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レガシーユーティリティを置き換えますtarcpio一部のLinuxディストリビューションではデフォルトではインストールされませんが、常にパッケージとして使用できます。

pax -w -x cpio -s '~^[/]*~~' root-directory >archive.cpio

関連情報