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

Денис Смирнов mithraen на freesource.info
Вт Июл 29 20:16:19 MSK 2014


On Tue, Jul 29, 2014 at 02:48:25PM +0400, Speccyfighter wrote:

> - lsblk, который придётся грепать инверсией НЕ, иначе выбросит
> листингом не только съёмные

wtf HE?

И как определить съемные? Я тут обнаружил, что в /sys/block/sdk/removable
у меня '0', при том что sdk это флешка.

> (у себя при двух hdd и usb-hdd это выбросит 20 файловых систем - 
> здесь нельзя не грепать)

А если грепать исключая содержимое fstab?

> - blkid, который надо будет вкручивать через sudo и беспарольку для
> blkid -s LABEL -s TYPE /dev/что

Зачем blkid, когда есть lsblk?

$ lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINT,SIZE,RM

> - плюс ко всему этому, надо будет вкрутить alias'ы, чтобы отбросить
> "мусор" и упростить ввод до уровня hmount: показать всё, кроме съёмных.
> Возможно алиасом или скриптом для аналога 'hmount -l'

Я попробовал написать такой скрипт, и у меня возникла проблема -- я не
могу определить что есть съемные устройства. Ибо флешка, как оказалось, не
съемное устройство.

> У меня как блочные usb используются:
> 4 флешки + 2 microSD + usb-hdd
> (Конец ли это?)
> А угадывать, что есть что, желания никакого.

Разумеется.

> Всё это требует подготовки, и подготовки под каждую конкретную
> конфигурацию вместо одного единственного
> hmount -l
> который всё это показывает сразу и без преконфигурирования.
> Не требуя от пользователя какого-либо мало-мальски серьёзного знания
> внутренностей системы и предварительной подготовки.
> Не считая запущенный hal естественно.
> Вот если смотреть под таким углом, то 'hmount -l', это да,
> именно киллер фича.
> Которая у себя видится в сравнении вот так.

В аттаче макет скрипта, который вероятно выполняет эту задачу. Пожалуйста,
посмотрите делает ли он то, что вы хотите.


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

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';

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`;

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


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