Skip to main content
Version: 3.5

Update Portworx file system dependencies

The Portworx Enterprise container ships with an archive containing precompiled modules for the kernels which were available at the time the container was released. If a kernel is released after a Portworx release, a pre-compiled version of the modules will not exist in the container. If Portworx is deployed in a setup which does not have access to mirrors.portworx.com to download the latest modules (for example, an air-gapped deployment), then Portworx will fail to come up.

Alternatively, in such deployments, you can publish the updated containers to internal container repositories where Portworx can download the new kernel modules.

Regardless of whether your cluster accesses the updated container through mirrors.portworx.com or an internal container registry, you can use that container to update your nodes' Portworx installation to include the latest batch of precompiled modules. Perform the update by running a DaemonSet in the cluster where Portworx has been installed.

Update filesystem dependencies

In air-gapped environments, you can update filesystem dependencies using one of the following methods:

  • Operator-managed update (recommended): Configure the Portworx Operator to automatically deploy and manage the pxfslibs update DaemonSet through the StorageCluster specification.
  • Manual update: Manually deploy the pxfslibs update DaemonSet in your cluster.

Operator-managed update

You can use the spec.pxfslibsUpdate section in the StorageCluster specification to configure the Portworx Operator to automatically deploy and manage the pxfslibs update DaemonSet. The Operator handles DaemonSet creation, execution monitoring, status updates, and cleanup.

  1. Run the following command to get the latest pxfslib image version for your Portworx version.

    curl -fsL "https://install.portworx.com/<px-version>?comp=pxlibupdate" | grep image: | sed 's/image://'
    portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update
  2. Pull the aboveimage from the external registry, tag it, and push it to your internal registry:

    docker pull portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update
    docker tag portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update <internal-registry>/portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update
    docker push <internal-registry>/portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update
  3. Edit the StorageCluster specification to add the pxfslibsUpdate configuration:

    apiVersion: core.libopenstorage.org/v1
    kind: StorageCluster
    metadata:
    name: px-cluster
    namespace: <portworx>
    spec:
    pxfslibsUpdate:
    enabled: true
    image: <internal-registry>/portworx/pxfslib-updater:latest
    autoDelete: true
    onDemandTrigger: "27 Oct 2025 9:35 PM"
    schedule: "0 3 * * 0"

    Parameters:

    • enabled: Set to true to enable the pxfslibs update DaemonSet deployment.
    • image: Specify the pxfslib-updater image from your internal registry.
    • autoDelete: Set to true to automatically delete the DaemonSet after successful execution. Set to false to keep it for debugging.
    • onDemandTrigger: Specify a timestamp to trigger an immediate update. Each time you update this field with a new timestamp, the Operator triggers a new update. Use this when you manually push updated pxfslib-updater images to your internal registry.
    • schedule: Specify a Cron expression to schedule recurring updates (for example, "0 3 * * 0" runs every Sunday at 3:00 AM). Use this if you have automation in place to update the pxfslib-updater image in your internal registry, allowing you to automatically update the filesystem dependencies on a schedule.
  4. Apply the updated StorageCluster specification:

    kubectl apply -f <storagecluster-spec>.yaml
  5. Check the StorageCluster status to verify update completion:

    kubectl get storagecluster px-cluster -n <portworx> -o yaml

    The status section shows the pxfslibs update history:

    ...
    status:
    pxfslibsUpdate:
    triggers:
    - lastTransitionTime: "2025-11-24T19:55:19Z"
    message: px-libs-update completed
    phase: Completed
    triggerTime: "2025-11-23T19:45:00Z"
    type: Install
    - lastTransitionTime: "2025-11-24T11:28:49Z"
    message: px-libs-update completed
    phase: Completed
    triggerTime: "2025-11-23T18:30:00Z"
    type: OnDemand
  6. If autoDelete is set to false, manually delete the DaemonSet after verifying the changes:

    kubectl delete daemonset px-libs-update -n <portworx>

Manual update

  1. On your air-gapped cluster, run the following command to download the correct version of the manifest that installs a DaemonSet in your cluster. Substitute <px-version> with the specific Portworx version you require:

    REL=/<px-version> && curl -fsL  "https://install.portworx.com${REL}?comp=pxlibupdate" |  grep  image: | sed 's/image://'
    portworx/px-lib:pxfslibs-<px-version>-mver<xx>-update
    info

    If you are using an internal registry, you can prepend your internal register name to the image name. When you run the following command, the image will be fetched from the specified internal registry rather than an external source:

    REL=/3.1.0 && curl -fsL  "https://install.portworx.com${REL}?comp=pxlibupdate&reg=internal-registry"` |  grep  image: | sed 's/image://'
    internal-registry/portworx/px-lib:pxfslibs-3.1.0-mver12-update
  2. Ensure that the DaemonSet in your internal image registry uses the above image. If utilizing an internal registry, pull the image from the external registry, tag it, and then push it to the internal registry.:

    docker pull portworx/px-lib:pxfslibs<px-version>mver<xx>-update
    docker tag portworx/px-lib:pxfslibs<px-version>mver<xx>-update <internal-registry>/portworx/px-lib:pxfslibs<px-version>-mver<xx>-update
    docker push <internal-registry>/portworx/px-lib:pxfslibs<px-version>-mver<xx>-update
  3. Apply the spec:

    kubectl apply -f pxlibupdate-spec.yaml

    Inspect the pod log to determine success or failure of the update.

  4. Run the following command to restart all Portworx pods:

    kubectl label nodes --all px/service=restart --overwrite 

    Wait for a few minutes for the Portworx pods to restart. You will notice that Portworx is deployed with the latest kernel version.

The DaemonSet above will update the pre-compiled module archives within the Portworx install location on the node (for example, /opt/pwx).

Note that this process assumes that Portworx is already installed since it will only update an existing installation. The existing installation's version will be checked for compatibility with the update container, and if it is not compatible, then the update will not be done.