NAME
Sys::Export::CPIO - Write CPIO archives needed for Linux initrd
SYNOPSIS
my $cpio= Sys::Export::CPIO->new($file_name_or_handle, %attrs);
$cpio->add(\%stat_name_and_data);
$cpio->add(\%stat_name_and_data);
$cpio->add(\%stat_name_and_data);
...
# close the file yourself
DESCRIPTION
This module writes out the cpio "New ASCII Format", as required by Linux initrd. It does very little aside from packing the data, but has support for:
- hardlinks
-
If you add a file with
nlink > 1
, it will note the dev/ino and write the data. If you record a second file also havingnlink > 1
with the same dev/ino, the size will be written as zero and the data will be skipped. (this is the way cpio stores hardlinks) - rdev
-
You can pass the
rdev
received fromstat
, and this module makes a best-effort to break that down into the major/minor numbers needed for cpio, but perl doesn't have access to the real major/minor functions of your platform unless you install Unix::Mknod. If you were trying to creaate a device node from pure configuration rather than the filesystem, just passrdev_major
andrdev_minor
instead ofrdev
. - virtual_inodes
-
Since the original device and inode are not relevant to the initrd loading, this module can replace the device with 0 and the inode with an incrementing sequence, which should compress better.
Pass
(virtual_inodes => 0)
to the constructor to disable this feature.
CONSTRUCTORS
new
my $cpio= Sys::Export::CPIO->new($fh_or_filename, %attrs);
The first argument is either a file handle object implementing 'print', or a file name. If it is a file name, it is immediately opened in 'raw' mode and dies on failure.
The rest of the arguments can be used to initialize attributes.
ATTRIBUTES
virtual_inodes
This is enabled by default, and rewrites the device_major/device_minor with zeroes and generates a linear sequence for a virtual inode on each file.
METHODS
add
$cpio->add({
dev => # or, ( dev_major =>, dev_minor => )
ino => #
mode => #
nlink => # same as stat()
uid => #
gid => #
mtime => #
rdev => # or, ( rdev_major =>, rdev_minor => )
name => # full path name, no leading '/'
data => # full content of file or symlink
});
This simply packs the file metadata into a CPIO header, then writes the header, filename, and data to the stream, padding as necessary.
finish
No-op. Provided to fufill the interface for an exporter destination.
VERSION
version 0.001
AUTHOR
Michael Conrad <mike@nrdvana.net>
COPYRIGHT AND LICENSE
This software is copyright (c) 2025 by Michael Conrad.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.