def METHOD_NAME(
    vm,
    target_version=None,
    drives=None,
    balloon=False,
    diff_snapshots=False,
):
    """Create a snapshot with many devices."""
    if diff_snapshots is False:
        snapshot_type = SnapshotType.FULL
    else:
        # Version 0.24 and greater has Diff and balloon support.
        snapshot_type = SnapshotType.DIFF
    if balloon:
        # Add a memory balloon with stats enabled.
        vm.api.balloon.put(
            amount_mib=0, deflate_on_oom=True, stats_polling_interval_s=1
        )
    test_drives = [] if drives is None else drives
    # Add disks.
    for scratch in test_drives:
        # Add a scratch 64MB RW non-root block device.
        scratchdisk = drive_tools.FilesystemFile(tempfile.mktemp(), size=64)
        vm.add_drive(scratch, scratchdisk.path)
        # Workaround FilesystemFile destructor removal of file.
        scratchdisk.path = None
    for _ in range(4):
        vm.add_net_iface()
    vm.start()
    # Iterate and validate connectivity on all ifaces after boot.
    for i in range(4):
        exit_code, _, _ = vm.ssh_iface(i).run("sync")
        assert exit_code == 0
    # Mount scratch drives in guest.
    for blk in test_drives:
        # Create mount point and mount each device.
        cmd = f"mkdir -p /tmp/mnt/{blk} && mount /dev/{blk} /tmp/mnt/{blk}"
        exit_code, _, _ = vm.ssh.run(cmd)
        assert exit_code == 0
        # Create file using dd using O_DIRECT.
        # After resume we will compute md5sum on these files.
        dd = f"dd if=/dev/zero of=/tmp/mnt/{blk}/test bs=4096 count=10 oflag=direct"
        exit_code, _, _ = vm.ssh.run(dd)
        assert exit_code == 0
        # Unmount the device.
        cmd = f"umount /dev/{blk}"
        exit_code, _, _ = vm.ssh.run(cmd)
        assert exit_code == 0
    snapshot = vm.make_snapshot(snapshot_type, target_version=target_version)
    print("========== Firecracker create snapshot log ==========")
    print(vm.log_data)
    vm.kill()
    return snapshot