[Comm] автомонтирование без DE

Денис Смирнов mithraen на freesource.info
Ср Июл 30 04:52:44 MSK 2014


On Tue, Jul 29, 2014 at 11:52:41PM +0400, Speccyfighter wrote:

>> find /dev/disk/by-id/ -name usb-* -print0 \
>>     | xargs -0 realpath \
>>     | sort \
>>     | xargs lsblk -d -l -o NAME,MOUNTPOINT,LABEL,FSTYPE,SIZE
> Во-во-во! То что надо. Коротко и всё необходимое для plmount
> на месте:
> Одно сомнение берёт: есть ли необходимость в SIZE?

В случае нескольких девайсов SIZE один из способов идентификации.
Я еще и MODEL хотел показывать, но это уже столь красивым способом не
получается.

> Ошибка исчезла. Отработало:
> Но ваш вариант выше как-то красивее. ИМХО.

В аттаче еще более универсальный вариант. Отличается от простого на шелл
тем, что:

1. поддерживает и USB-devices, _и_ все removable devices (т.е. должно
нормально понимать CD, флоппики, и т.д.)

2. игнорирует все упомянутое в /etc/fstab, даже если оно removable или
USB. Хотя нужно ли это -- не уверен. Если не нужно, можно легко обойтись
shell'ом без всяких извращений с перловкой.

P.S. Если будет ругаться на Text::Table -- apt-get install perl-Text-Table

-- 
С уважением, Денис

http://mithraen.ru/
----------- следующая часть -----------
#!/usr/bin/perl -w
#============================================================================#
# List all block devices that not exists in fstab                            #
#============================================================================#
# (C) Denis Smirnov <mithraen на freesource.info>                               #
#============================================================================#
use strict;
use warnings qw(FATAL all);
use utf8;
use open qw(:utf8 :std);
use Cwd 'abs_path';
use Text::Table;

my %devices;

# List all USB devices
foreach ( glob("/dev/disk/by-id/usb-*") ) {
    $devices{ abs_path($_) } = 1;
}

# List all removable devices
{
    my @devs = split( "\n", `/bin/lsblk -d -r -o RO,KNAME` );
    foreach (@devs) {
        next unless /^1\s+(.+)$/;
        $devices{$1} = 1;
    }
}

# Parse /etc/fstab
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' ) {
        use Data::Dump qw/ddx/;
        $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{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;
}

parse_fstab;

my @out;

# Get all info about removable and USB devices
open( my $fh, "-|", '/bin/lsblk', '-o',
    'NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,RM,KNAME,MODEL,TYPE,UUID', '-P' );

my $tb =
  Text::Table->new( 'NAME', 'MOUNTPOINT', 'LABEL', 'FSTYPE', "SIZE\n&left",
    'MODEL' );

while (<$fh>) {
    my $h = parse_line($_);
    next unless defined $h;
    next unless defined $devices{ "/dev/" . $h->{KNAME} };
    $tb->add(
        $h->{NAME},   $h->{MOUNTPOINT}, $h->{LABEL},
        $h->{FSTYPE}, $h->{SIZE},       $h->{MODEL}
    );

    my $dev = "/dev/" . $h->{KNAME};
    push @out, $dev;
}

print $tb;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 181 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20140730/7af09ad8/attachment.bin>


Подробная информация о списке рассылки community