#!/usr/bin/perl -w #============================================================================# # List all block devices that not exists in fstab # #============================================================================# # (C) Denis Smirnov # #============================================================================# use strict; use warnings qw(FATAL all); use utf8; use open qw(:utf8 :std); use Cwd 'abs_path'; my @lsblk = split( "\n", `/bin/lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,RM,KNAME,MODEL,TYPE,UUID -P` ); my %disks; my %fstab_dev; my %fstab_uuid; my %fstab_label; sub parse_fstab() { open( my $fh, "<", "/etc/fstab" ) || die; while (<$fh>) { s/#.*//; next if /^\s*$/; s/\s+.*$//; s/\s+$//; if (/^LABEL=\"([^\"]+)\"/) { $fstab_label{$1} = 1; } elsif (/^LABEL=([^\"]+)/) { $fstab_label{$1} = 1; } if (/^UUID=\"([^\"]+)\"/) { $fstab_uuid{$1} = 1; } elsif (/^UUID=([^\"]+)/) { $fstab_uuid{$1} = 1; } else { my $dev = $_; $dev = abs_path($dev) if -l $dev; $fstab_dev{$dev} = 1; } } close($fh); } sub parse_line($) { my $fields = $_[0]; my %h; while ( $fields =~ s/^\s*([^"]+)="([^\"]*)"\s*// ) { $h{$1} = $2; } my $dev = $h{KNAME}; if ( $h{TYPE} eq 'disk' ) { $disks{$dev} = \%h; } if ( $h{TYPE} eq 'part' ) { my $basedev = $dev; $basedev =~ s/\d+$//; foreach my $key ( keys %h ) { if ( $h{$key} eq '' ) { $h{$key} = $disks{$basedev}->{$key}; } } } # return if $h{RM} eq '0'; return if $h{FSTYPE} eq ''; return if $h{FSTYPE} eq 'swap'; return if $h{FSTYPE} eq 'linux_raid_member'; return if $h{FSTYPE} eq 'LVM2_member'; # skip LVM partitions return if $h{TYPE} eq 'lvm'; # skip FS in fstab return if defined $fstab_label{ $h{LABEL} }; return if defined $fstab_uuid{ $h{UUID} }; return if defined $fstab_dev{ "/dev/" . $h{KNAME} }; return \%h; } use Data::Dump qw/ddx/; parse_fstab; my @out; foreach (@lsblk) { my $h = parse_line($_); next unless defined $h; # ddx $h; my $dev = "/dev/" . $h->{KNAME}; push @out, $dev; } my $devices = join( ' ', @out ); print `/bin/lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,RM,KNAME,MODEL,TYPE,UUID -l $devices`;