diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # libarchive
 
+## 2.2.3.0
+
+  * Add convenience functions for working with `.cpio` archives
+
 ## 2.2.2.0
 
   * Add `Ord` instance to `Entry`, `Symlink`, `EntryContent`, `Ownership`
diff --git a/libarchive.cabal b/libarchive.cabal
--- a/libarchive.cabal
+++ b/libarchive.cabal
@@ -1,6 +1,6 @@
 cabal-version:   1.18
 name:            libarchive
-version:         2.2.2.0
+version:         2.2.3.0
 license:         BSD3
 license-file:    LICENSE
 copyright:       Copyright: (c) 2018-2020 Vanessa McHale
@@ -37,6 +37,10 @@
     description: Run low-memory version of test suite
     default:     False
 
+flag single-threaded
+    description: Run test suite without the threaded runtime
+    default:     False
+
 library
     exposed-modules:
         Codec.Archive
@@ -94,8 +98,8 @@
     default-language:   Haskell2010
     other-extensions:   OverloadedStrings
     ghc-options:
-        -threaded -rtsopts -with-rtsopts=-N -Wall -Wincomplete-uni-patterns
-        -Wincomplete-record-updates -Wredundant-constraints
+        -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
+        -Wredundant-constraints
 
     build-depends:
         base -any,
@@ -109,6 +113,9 @@
         dir-traverse -any,
         composition-prelude >=2.0.5.0,
         pathological-bytestrings -any
+
+    if !flag(single-threaded)
+        ghc-options: -threaded -rtsopts -with-rtsopts=-N
 
     if flag(low-memory)
         cpp-options: -DLOW_MEMORY
diff --git a/src/Codec/Archive.hs b/src/Codec/Archive.hs
--- a/src/Codec/Archive.hs
+++ b/src/Codec/Archive.hs
@@ -9,21 +9,25 @@
     , entriesToFile
     , entriesToFileZip
     , entriesToFile7Zip
+    , entriesToFileCpio
     , entriesToBS
     , entriesToBS7zip
     , entriesToBSzip
     , entriesToBSL
     , entriesToBSLzip
     , entriesToBSL7zip
+    , entriesToBSLCpio
     , readArchiveFile
     , readArchiveBS
     , readArchiveBSL
     , packFiles
     , packFilesZip
     , packFiles7zip
+    , packFilesCpio
     , packToFile
     , packToFileZip
     , packToFile7Zip
+    , packToFileCpio
     -- * Concrete (Haskell) types
     , ArchiveResult (..)
     , Entry (..)
diff --git a/src/Codec/Archive/Pack.hs b/src/Codec/Archive/Pack.hs
--- a/src/Codec/Archive/Pack.hs
+++ b/src/Codec/Archive/Pack.hs
@@ -1,6 +1,7 @@
 module Codec.Archive.Pack ( entriesToFile
                           , entriesToFileZip
                           , entriesToFile7Zip
+                          , entriesToFileCpio
                           , entriesToBS
                           , entriesToBSzip
                           , entriesToBS7zip
@@ -9,6 +10,7 @@
                           , packToFile
                           , packToFileZip
                           , packToFile7Zip
+                          , packToFileCpio
                           ) where
 
 import           Codec.Archive.Foreign
@@ -153,6 +155,13 @@
                -> ArchiveM ()
 packToFile7Zip = filePacker entriesToFile7Zip
 
+-- | @since 2.2.3.0
+packToFileCpio :: Traversable t
+               => FilePath
+               -> t FilePath
+               -> ArchiveM ()
+packToFileCpio = filePacker entriesToFileCpio
+
 -- | Write some entries to a file, creating a tar archive. This is more
 -- efficient than
 --
@@ -176,6 +185,12 @@
 -- @since 1.0.0.0
 entriesToFile7Zip :: Foldable t => FilePath -> t Entry -> ArchiveM ()
 entriesToFile7Zip = entriesToFileGeneral archiveWriteSetFormat7zip
+
+-- | Write some entries to a file, creating a @.cpio@ archive.
+--
+-- @since 2.2.3.0
+entriesToFileCpio :: Foldable t => FilePath -> t Entry -> ArchiveM ()
+entriesToFileCpio = entriesToFileGeneral archiveWriteSetFormatCpio
 
 entriesToFileGeneral :: Foldable t => (Ptr Archive -> IO ArchiveResult) -> FilePath -> t Entry -> ArchiveM ()
 entriesToFileGeneral modifier fp hsEntries' =
diff --git a/src/Codec/Archive/Pack/Lazy.hs b/src/Codec/Archive/Pack/Lazy.hs
--- a/src/Codec/Archive/Pack/Lazy.hs
+++ b/src/Codec/Archive/Pack/Lazy.hs
@@ -1,9 +1,11 @@
 module Codec.Archive.Pack.Lazy ( entriesToBSL
                                , entriesToBSL7zip
                                , entriesToBSLzip
+                               , entriesToBSLCpio
                                , packFiles
                                , packFilesZip
                                , packFiles7zip
+                               , packFilesCpio
                                ) where
 
 import           Codec.Archive.Foreign
@@ -42,6 +44,10 @@
 packFiles7zip :: Traversable t => t FilePath -> IO BSL.ByteString
 packFiles7zip = packer entriesToBSL7zip
 
+-- | @since 2.2.3.0
+packFilesCpio :: Traversable t => t FilePath -> IO BSL.ByteString
+packFilesCpio = packer entriesToBSLCpio
+
 -- | @since 1.0.5.0
 entriesToBSLzip :: Foldable t => t Entry -> BSL.ByteString
 entriesToBSLzip = unsafeDupablePerformIO . noFail . entriesToBSLGeneral archiveWriteSetFormatZip
@@ -51,6 +57,11 @@
 entriesToBSL7zip :: Foldable t => t Entry -> BSL.ByteString
 entriesToBSL7zip = unsafeDupablePerformIO . noFail . entriesToBSLGeneral archiveWriteSetFormat7zip
 {-# NOINLINE entriesToBSL7zip #-}
+
+-- | @since 2.2.3.0
+entriesToBSLCpio :: Foldable t => t Entry -> BSL.ByteString
+entriesToBSLCpio = unsafeDupablePerformIO . noFail . entriesToBSLGeneral archiveWriteSetFormatCpio
+{-# NOINLINE entriesToBSLCpio #-}
 
 -- | In general, this will be more efficient than 'entriesToBS'
 --
