Storage Guide
Detailed configuration of directory, LVM, and iSCSI pools.
View Storage Guide
iscsiman manages iSCSI target/initiator configuration and OCFS2 cluster filesystems for shared storage across PiVirt nodes.
| Property | Value |
|---|---|
| Language | Go 1.22+ |
| Protocol | gRPC (internal), ConnectRPC (via agent) |
| Storage | iSCSI targets, OCFS2 volumes |
| Cluster | Pacemaker/Corosync integration |
| Port | 9002 (gRPC), 3260 (iSCSI) |
| Config | /etc/iscsiman/config.yaml |
flowchart TB
subgraph Iscsiman["iscsiman Architecture"]
subgraph Server["gRPC Server (Port 9002)"]
TGT_SVC["TargetSvc"]
INI_SVC["InitiatorSvc"]
CLS_SVC["ClusterSvc"]
end
subgraph Core["Core Engine"]
TGT_MGR["Target Manager"]
INI_MGR["Initiator Manager"]
OCFS_MGR["OCFS2 Manager"]
PACE["Pacemaker Integration"]
end
Server --> Core
end
/etc/iscsiman/config.yaml)# iscsiman configurationserver: grpc_addr: "0.0.0.0:9002" http_addr: "0.0.0.0:9003" # Metrics, health tls: cert_file: "/etc/iscsiman/tls/server.crt" key_file: "/etc/iscsiman/tls/server.key" ca_file: "/etc/iscsiman/tls/ca.crt"
# iSCSI Target (tgt/targetcli)target: backend: "tgt" # tgt | targetcli | lio config_dir: "/etc/tgt/conf.d" default_iqn_base: "iqn.2024-01.hu.pilab"
# CHAP authentication chap: enabled: true user: "pivirtd_initiator" password: "${ISCSI_CHAP_PASSWORD}" # From env/secrets mutual_user: "pivirtd_target" mutual_password: "${ISCSI_MUTUAL_CHAP_PASSWORD}"
# ALUA configuration alua: enabled: true default_tpg: 1
# iSCSI Initiator (open-iscsi)initiator: config_dir: "/etc/iscsi" node_dir: "/etc/iscsi/nodes" iscsid_config: "/etc/iscsi/iscsid.conf"
# Discovery discovery: sendtargets: - portal: "10.0.1.10:3260" iqn: "iqn.2024-01.hu.pilab:storage" static: - portal: "10.0.1.11:3260" iqn: "iqn.2024-01.hu.pilab:backup"
# Multipath multipath: enabled: true config: "/etc/multipath.conf" policy: "queue_if_no_path" rr_min_io: 100
# OCFS2 Cluster Filesystemocfs2: # Cluster configuration cluster: name: "pivirt-cluster" config_file: "/etc/ocfs2/cluster.conf" heartbeat_device: "/dev/disk/by-id/scsi-360050764008181c60000000000000001p1"
# Default mount options mount_options: "rw,noatime,data=ordered,errors=remount-ro"
# Volume defaults defaults: block_size: "4K" cluster_size: "4K" journal_size: "256M" label_prefix: "pivirt-"
# Pacemaker/Corosync Integrationcluster: enabled: true crm_config: "/etc/corosync/corosync.conf" pacemaker_config: "/etc/pacemaker/cib.xml"
# Resource defaults resource_defaults: resource_stickiness: 100 migration_threshold: 3
# Fencing fencing: enabled: true agent: "fence_sbd" devices: - name: "sbd-device" params: device: "/dev/disk/by-id/scsi-360050764008181c60000000000000002"
# Logginglogging: level: "info" format: "json" output: "journald"
# Metricsmetrics: enabled: true path: "/metrics"service TargetService { // Create iSCSI target rpc CreateTarget(CreateTargetRequest) returns (Target);
// Get target by IQN rpc GetTarget(GetTargetRequest) returns (Target);
// List all targets rpc ListTargets(ListTargetsRequest) returns (stream Target);
// Delete target rpc DeleteTarget(DeleteTargetRequest) returns (Empty);
// Add LUN to target rpc AddLUN(AddLUNRequest) returns (LUN);
// Remove LUN from target rpc RemoveLUN(RemoveLUNRequest) returns (Empty);
// Set CHAP auth rpc SetCHAP(SetCHAPRequest) returns (Target);
// Get target stats rpc GetTargetStats(GetTargetStatsRequest) returns (TargetStats);}
message Target { string iqn = 1; string alias = 2; TargetState state = 3; repeated LUN luns = 4; CHAPConfig chap = 5; ALUAConfig alua = 6; google.protobuf.Timestamp created_at = 7;}
message LUN { int32 lun = 1; string path = 2; // Block device path string backing_file = 3; // For file-backed int64 size_bytes = 4; bool readonly = 5; string scsi_id = 6; string scsi_serial = 7;}service InitiatorService { // Discover targets rpc Discover(DiscoverRequest) returns (stream DiscoveryResult);
// Login to target rpc Login(LoginRequest) returns (Session);
// Logout from target rpc Logout(LogoutRequest) returns (Empty);
// List sessions rpc ListSessions(ListSessionsRequest) returns (stream Session);
// Rescan sessions rpc Rescan(RescanRequest) returns (Empty);
// Configure multipath rpc ConfigureMultipath(ConfigureMultipathRequest) returns (MultipathConfig);}
message Session { string session_id = 1; string target_iqn = 2; string portal = 3; SessionState state = 4; repeated Connection connections = 5; MultipathInfo multipath = 6;}service ClusterService { // Create OCFS2 volume rpc CreateVolume(CreateVolumeRequest) returns (OCFS2Volume);
// Get volume info rpc GetVolume(GetVolumeRequest) returns (OCFS2Volume);
// List volumes rpc ListVolumes(ListVolumesRequest) returns (stream OCFS2Volume);
// Mount volume rpc MountVolume(MountVolumeRequest) returns (MountInfo);
// Unmount volume rpc UnmountVolume(UnmountVolumeRequest) returns (Empty);
// Add node to cluster rpc AddNode(AddNodeRequest) returns (ClusterNode);
// Remove node from cluster rpc RemoveNode(RemoveNodeRequest) returns (Empty);
// Get cluster status rpc GetStatus(GetStatusRequest) returns (ClusterStatus);}[Unit]Description=PiVirt iSCSI & Cluster Storage ManagerAfter=network.target tgt.service open-iscsi.service corosync.service pacemaker.serviceRequires=tgt.service open-iscsi.service
[Service]Type=notifyExecStart=/usr/local/bin/iscsiman --config /etc/iscsiman/config.yamlRestart=on-failureRestartSec=5LimitNOFILE=1048576LimitMEMLOCK=infinityCapabilityBoundingSet=CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_NET_ADMIN CAP_SYS_RESOURCE
[Install]WantedBy=multi-user.target# Install iSCSI target (tgt)# Ubuntu/Debianapt-get install -y tgt
# RHEL/Fedoradnf install -y targetcli
# Install iSCSI initiatorapt-get install -y open-iscsi multipath-tools
# Install OCFS2apt-get install -y ocfs2-tools
# Install Pacemaker/Corosyncapt-get install -y pacemaker corosync fence-agents
# Configure kernel modulesmodprobe iscsi_targetmodprobe iscsi_tcpmodprobe ocfs2modprobe ocfs2_dlmfsmodprobe ocfs2_nodemanager
# Enable servicessystemctl enable --now tgt open-iscsi multipathdFor step-by-step operational workflows, see the iscsiman Guide.
# Using pvclipvcli storage target create \ --iqn iqn.2024-01.hu.pilab:vm-storage \ --alias "VM Storage Pool" \ --pool iscsi-pool
# Add LUNpvcli storage target lun add \ --target iqn.2024-01.hu.pilab:vm-storage \ --lun 1 \ --device /dev/pivirtd-vg/vm-01-disk# Discover targetspvcli storage initiator discover --portal 10.0.1.10:3260
# Loginpvcli storage initiator login \ --target iqn.2024-01.hu.pilab:vm-storage \ --portal 10.0.1.10:3260
# Verify multipathmultipath -ll# Create volume on shared block devicepvcli storage ocfs2 create \ --name vm-shared \ --device /dev/disk/by-id/scsi-360050764008181c60000000000000001 \ --cluster pivirt-cluster
# Mount on all nodespvcli storage ocfs2 mount --name vm-shared --all-nodes# Check target servicesystemctl status tgttgt-admin --show
# Check CHAPcat /etc/tgt/conf.d/*.conf | grep -i chap
# Check firewallnft list ruleset | grep 3260# Check iscsidsystemctl status open-iscsi
# Check sessionsiscsiadm -m session -P3
# Check multipathmultipath -ll
# Check iscsiadm discoveryiscsiadm -m discovery -t sendtargets -p 10.0.1.10# Check cluster statuscrm_mon -1
# Check OCFS2 clustermounted.ocfs2 -d
# Check DLMls /sys/kernel/config/dlm/cluster/
# Check heartbeatcat /proc/ocfs2/cluster/# Cluster statuscrm_mon -1 -r
# Resource statuspcs status resources
# Debug resourcepcs resource debug-start <resource-name>
# Check constraintspcs constraint showStorage Guide
Detailed configuration of directory, LVM, and iSCSI pools.
View Storage Guide
iSCSI Target Setup
Target creation, LUN mapping, and authentication.
View Target Guide
OCFS2 Clustered FS
Shared filesystem configuration with DLM and O2CB.
View OCFS2 Guide
Multipath Configuration
DM-Multipath setup and path failover tuning.
View Multipath Guide
Pacemaker Cluster
High-availability cluster orchestration.
View Clustering Guide
CLI Reference
User-friendly CLI commands for storage operations.
View CLI Reference