1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

delete vol_id and require util-linux-ng's blkid

This commit is contained in:
Kay Sievers 2009-05-11 04:12:23 +02:00
parent 86d9bf4bec
commit f07996885d
8 changed files with 12 additions and 577 deletions

9
NEWS
View File

@ -2,6 +2,11 @@ udev 142
========
Bugfixes.
The program vol_id is removed from the repository and blkid from the
latest util-linux-ng package replaces it. Persisten disk links for
label and uuid depend on the util-linux-ng version of blkid now. Older
versions can not be used with udev.
Libudev allows to subscribe to udev events. To prevent unwanted messages
to be delivered, and waking up the subscribing process, a filter can be
installed, to drop messages inside a kernel socket filter. The filters
@ -15,7 +20,9 @@ are expected anymore, and a first stable release should happen soon.
A too old kernel (2.6.21) or a kernel with CONFIG_SYSFS_DEPRECATED
is not supported since while and udevd will log an error message at
startup.
startup. It should still be able to boot-up, but advanced rules and system
services which depend on the information not available in the old sysfs
format will fail to work correctly.
DVB device naming is supplied by the kernel now. In case older kernels
need to be supported, the old shell script should be added to a compat

View File

@ -2,30 +2,3 @@ include $(top_srcdir)/Makefile.am.inc
SUBDIRS = \
lib
udevhomedir = $(udev_prefix)/lib/udev
udevhome_PROGRAMS = \
vol_id
vol_id_SOURCES = \
vol_id.c \
../../udev/lib/libudev.h \
../../udev/lib/libudev.c \
../../udev/lib/libudev-list.c \
../../udev/lib/libudev-util.c
vol_id_LDADD = \
lib/libvolume_id.la
dist_man_MANS = \
vol_id.8
EXTRA_DIST = \
vol_id.xml
%.7 %.8 : %.xml
$(XSLTPROC) -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
MAINTAINERCLEANFILES= \
$(dist_man_MANS)

View File

@ -1,66 +0,0 @@
vol_id - probe filesystem and read label and uuid
vol_id will only return with a non-zero exit code if the string asked for,
is not empty. All trailing whitespace will be removed, spaces replaced by
underscore and slashes ignored.
Unmangled values are available in the --export mode as hex-encoded strings
in *_ENC= keys.
$ extras/volume_id/vol_id --export /dev/sda6
ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=3e999973-00c9-4917-9442-b7633bd95b9e
ID_FS_UUID_ENC=3e999973-00c9-4917-9442-b7633bd95b9e
ID_FS_LABEL=devel
ID_FS_LABEL_ENC=devel
$ extras/volume_id/vol_id --label /dev/sda6
devel
$ extras/volume_id/vol_id --type /dev/sda6
ext3
fstype probe label uuid version
--------------------------------------------------
linux swap * * * *
btrfs * * * -
ext * * * *
reiserfs jr/3.5/3.6/4 * * * *
fat (12, 16, 32) * * * *
ntfs * * * *
jfs * * * -
xfs * * * -
hfs (plus, wrapped) * * * -
udf * * - -
iso9660 * * - -
ufs * - - -
cramfs * * - -
sysv * * - *
luks * - * -
hpfs * * - -
romfs * * - -
squashfs * - - -
minix * - - *
ocfs (1, 2) * * * *
vxfs * - - *
nss (netware) * - * *
gfs, gfs2 * * * -
oracleasm * * - -
Raid members are detected to prevent the probing for a filesystem
-----------------------------------------------------------------
linux raid (md) * * * *
LVM 1 * - - -
LVM 2 * - - *
ddf * - * *
highpoint * - - -
isw_raid * - - -
lsi_raid * - - -
nvidia_raid * - - -
promise_raid * - - -
silicon_raid * - - -
via_raid * - - -
jmicron * - - -
adaptec * - - -

View File

@ -1,328 +0,0 @@
/*
* vol_id - read filesystem label and uuid
*
* Copyright (C) 2005-2008 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE 1
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <inttypes.h>
#include <sys/ioctl.h>
#include "../../udev/udev.h"
#include "lib/libvolume_id.h"
#define BLKGETSIZE64 _IOR(0x12,114,size_t)
static int debug;
struct udev *udev_ctx;
static void log_fn(struct udev *udev, int priority,
const char *file, int line, const char *fn,
const char *format, va_list args)
{
if (debug) {
fprintf(stderr, "%s: ", fn != NULL ? fn : file);
vfprintf(stderr, format, args);
} else {
vsyslog(priority, format, args);
}
}
static void vid_log(int priority, const char *file, int line, const char *format, ...)
{
va_list args;
if (priority > udev_get_log_priority(udev_ctx))
return;
va_start(args, format);
log_fn(udev_ctx, priority, file, line, NULL, format, args);
va_end(args);
return;
}
static int all_probers(volume_id_probe_fn_t probe_fn,
struct volume_id *id, uint64_t off, uint64_t size,
void *data)
{
const char *type;
if (probe_fn(id, off, size) == 0)
if (volume_id_get_type(id, &type))
printf("%s\n", type);
return 0;
}
int main(int argc, char *argv[])
{
static const struct option options[] = {
{ "label", no_argument, NULL, 'l' },
{ "label-raw", no_argument, NULL, 'L' },
{ "uuid", no_argument, NULL, 'u' },
{ "type", no_argument, NULL, 't' },
{ "export", no_argument, NULL, 'x' },
{ "skip-raid", no_argument, NULL, 's' },
{ "size", required_argument, NULL, 'S' },
{ "probe-all", no_argument, NULL, 'a' },
{ "offset", optional_argument, NULL, 'o' },
{ "debug", no_argument, NULL, 'd' },
{ "help", no_argument, NULL, 'h' },
{}
};
enum print_type {
PRINT_EXPORT,
PRINT_TYPE,
PRINT_LABEL,
PRINT_UUID,
PRINT_LABEL_RAW,
} print = PRINT_EXPORT;
struct volume_id *vid = NULL;
char label_safe[256];
char label_enc[256];
char uuid_safe[256];
char uuid_enc[256];
char uuid_sub_enc[256];
char type_enc[256];
char type_version_enc[256];
uint64_t size = 0;
int skip_raid = 0;
int probe_all = 0;
uint64_t offset = 0;
const char *node;
int fd;
const char *label, *uuid, *uuid_sub, *type, *type_version, *usage;
int retval;
int rc = 0;
udev_ctx = udev_new();
if (udev_ctx == NULL)
goto exit;
logging_init("vol_id");
udev_set_log_fn(udev_ctx, log_fn);
/* hook in our debug into libvolume_id */
volume_id_log_fn = vid_log;
while (1) {
int option;
option = getopt_long(argc, argv, "lLutxsS:aodh", options, NULL);
if (option == -1)
break;
switch (option) {
case 'd':
debug = 1;
if (udev_get_log_priority(udev_ctx) < LOG_INFO)
udev_set_log_priority(udev_ctx, LOG_INFO);
break;
case 'l':
print = PRINT_LABEL;
break;
case 'L':
print = PRINT_LABEL_RAW;
break;
case 'u':
print = PRINT_UUID;
break;
case 't':
print = PRINT_TYPE;
break;
case 'x':
print = PRINT_EXPORT;
break;
case 's':
skip_raid = 1;
break;
case 'a':
probe_all = 1;
break;
case 'S':
if (optarg[0] != '\0')
size = strtoull(optarg, NULL, 0);
break;
case 'o':
if (optarg[0] != '\0')
offset = strtoull(optarg, NULL, 0);
break;
case 'h':
printf("Usage: vol_id [options] <device>\n"
" --export export key/value pairs\n"
" --type filesystem type\n"
" --label filesystem label\n"
" --label-raw raw label\n"
" --uuid filesystem uuid\n"
" --skip-raid don't probe for raid\n"
" --probe-all find possibly conflicting signatures\n"
" --offset=<bytes> probe at the given offset\n"
" --size=<bytes> overwrite device size\n"
" --debug print debug output to stderr\n"
" --help\n\n");
goto exit;
default:
retval = 1;
goto exit;
}
}
node = argv[optind];
if (!node) {
err(udev_ctx, "no device\n");
fprintf(stderr, "no device\n");
rc = 1;
goto exit;
}
fd = open(node, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "%s: error opening volume\n", node);
rc = 2;
goto exit;
}
vid = volume_id_open_fd(fd);
if (vid == NULL) {
rc = 2;
goto exit;
}
if (size == 0) {
if (ioctl(fd, BLKGETSIZE64, &size) == 0) {
info(udev_ctx, "BLKGETSIZE64=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30);
} else {
struct stat statbuf;
if (fstat(fd, &statbuf) == 0 && S_ISREG(statbuf.st_mode))
size = statbuf.st_size;
else
size = 0;
info(udev_ctx, "stat=%" PRIu64 " (%" PRIu64 "GB)\n", size, size >> 30);
}
}
/* try to drop all privileges before reading disk content */
if (getuid() == 0) {
struct passwd *pw;
pw = getpwnam("nobody");
if (pw != NULL && pw->pw_uid > 0 && pw->pw_gid > 0) {
if (setgroups(0, NULL) != 0 ||
setgid(pw->pw_gid) != 0 ||
setuid(pw->pw_uid) != 0)
info(udev_ctx, "unable to drop privileges: %s\n\n", strerror(errno));
}
}
if (probe_all) {
volume_id_all_probers(all_probers, vid, offset, size, NULL);
goto exit;
}
if (skip_raid)
retval = volume_id_probe_filesystem(vid, offset, size);
else
retval = volume_id_probe_all(vid, offset, size);
if (retval != 0) {
fprintf(stderr, "unknown or non-unique volume type "
"(--probe-all lists possibly conflicting types)\n");
rc = 4;
goto exit;
}
if (!volume_id_get_label(vid, &label) ||
!volume_id_get_usage(vid, &usage) ||
!volume_id_get_type(vid, &type) ||
!volume_id_get_type_version(vid, &type_version) ||
!volume_id_get_uuid(vid, &uuid) ||
!volume_id_get_uuid_sub(vid, &uuid_sub)) {
rc = 4;
goto exit;
}
udev_util_replace_whitespace(label, label_safe, sizeof(label_safe));
udev_util_replace_chars(label_safe, UDEV_ALLOWED_CHARS_INPUT);
volume_id_encode_string(label, label_enc, sizeof(label_enc));
udev_util_replace_whitespace(uuid, uuid_safe, sizeof(uuid_safe));
udev_util_replace_chars(uuid_safe, UDEV_ALLOWED_CHARS_INPUT);
volume_id_encode_string(uuid, uuid_enc, sizeof(uuid_enc));
volume_id_encode_string(uuid_sub, uuid_sub_enc, sizeof(uuid_sub_enc));
volume_id_encode_string(type, type_enc, sizeof(type_enc));
volume_id_encode_string(type_version, type_version_enc, sizeof(type_version_enc));
switch (print) {
case PRINT_EXPORT:
printf("ID_FS_USAGE=%s\n", usage);
printf("ID_FS_TYPE=%s\n", type_enc);
printf("ID_FS_VERSION=%s\n", type_version_enc);
printf("ID_FS_UUID=%s\n", uuid_safe);
printf("ID_FS_UUID_ENC=%s\n", uuid_enc);
if (uuid_sub_enc[0] != '\0')
printf("ID_FS_UUID_SUB_ENC=%s\n", uuid_sub_enc);
printf("ID_FS_LABEL=%s\n", label_safe);
printf("ID_FS_LABEL_ENC=%s\n", label_enc);
break;
case PRINT_TYPE:
printf("%s\n", type);
break;
case PRINT_LABEL:
if (label_safe[0] == '\0' || strcmp(usage, "raid") == 0) {
rc = 3;
goto exit;
}
printf("%s\n", label_safe);
break;
case PRINT_UUID:
if (uuid_enc[0] == '\0' || strcmp(usage, "raid") == 0) {
rc = 4;
goto exit;
}
printf("%s\n", uuid_enc);
break;
case PRINT_LABEL_RAW:
if (label[0] == '\0' || strcmp(usage, "raid") == 0) {
rc = 3;
goto exit;
}
printf("%s\n", label);
break;
}
exit:
if (vid != NULL)
volume_id_close(vid);
udev_unref(udev_ctx);
logging_close();
return rc;
}

View File

@ -1,151 +0,0 @@
<?xml version='1.0'?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<article>
<section>
<title>vol_id</title>
<refentry>
<refentryinfo>
<title>vol_id</title>
<date>March 2006</date>
<productname>volume_id</productname>
</refentryinfo>
<refmeta>
<refentrytitle>vol_id</refentrytitle>
<manvolnum>8</manvolnum>
<refmiscinfo class="version"></refmiscinfo>
</refmeta>
<refnamediv>
<refname>vol_id</refname><refpurpose>probe filesystem type and read label and uuid</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>vol_id</command>
<arg><option>--export</option></arg>
<arg><option>--type</option></arg>
<arg><option>--label</option></arg>
<arg><option>--label-raw</option></arg>
<arg><option>--uuid</option></arg>
<arg><option>--skip-raid</option></arg>
<arg><option>--probe-all</option></arg>
<arg><option>--offset=<replaceable>bytes</replaceable></option></arg>
<arg><option>--debug</option></arg>
<arg><option>--help</option></arg>
<arg><replaceable>device</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1><title>DESCRIPTION</title>
<para><command>vol_id</command> is usually called from a udev rule, to
provide udev with the filesystem type, the label and the uuid of a
volume. It supports most of the common filesystem formats and detects
various raid setups to prevent the recognition of raid members
as a volume with a filesystem.</para>
</refsect1>
<refsect1><title>OPTIONS</title>
<variablelist>
<varlistentry>
<term><option>--export</option></term>
<listitem>
<para>Print all values in key/value format to import them into the
environment.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--type</option></term>
<listitem>
<para>Print the filesystem type.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--label</option></term>
<listitem>
<para>
Print the safe version of volume label suitable for
use as filename.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--label-raw</option></term>
<listitem>
<para>
Print the raw volume label.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--uuid</option></term>
<listitem>
<para>Print the uuid of a volume.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--skip-raid</option></term>
<listitem>
<para>Skip detection of raid metadata.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--probe-all</option></term>
<listitem>
<para>Probe for all types and print all matches.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--offset=<replaceable>bytes</replaceable></option></term>
<listitem>
<para>Start probing at the given offset, instead of the beginning
of the volume. The offset value is specified in bytes.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--debug</option></term>
<listitem>
<para>Print debug messages to stderr.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--help</option></term>
<listitem>
<para>Print usage.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1><title>ENVIRONMENT</title>
<variablelist>
<varlistentry>
<term><option>UDEV_LOG</option></term>
<listitem>
<para>Set the syslog priority.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1><title>EXIT STATUS</title>
<para><command>vol_id</command> will only return successful if the
value asked for is not empty. All trailing whitespace will be removed,
spaces replaced by underscore and slashes ignored.</para>
</refsect1>
<refsect1><title>AUTHOR</title>
<para>Written by Kay Sievers <email>kay.sievers@vrfy.org</email></para>
</refsect1>
<refsect1>
<title>SEE ALSO</title>
<para><citerefentry>
<refentrytitle>udev</refentrytitle><manvolnum>7</manvolnum>
</citerefentry></para>
</refsect1>
</refentry>
</section>
</article>

View File

@ -27,7 +27,7 @@ ENV{DEVTYPE}=="partition", ENV{MD_UUID}=="?*", SYMLINK+="disk/by-id/md-uuid-$env
ENV{DEVTYPE}=="partition", ENV{MD_DEVNAME}=="*[^0-9]", SYMLINK+="md/$env{MD_DEVNAME}%n"
ENV{DEVTYPE}=="partition", ENV{MD_DEVNAME}=="*[0-9]", SYMLINK+="md/$env{MD_DEVNAME}p%n"
IMPORT{program}="vol_id --export $tempnode"
IMPORT{program}="/sbin/blkid -o udev -p $tempnode"
OPTIONS+="link_priority=100"
OPTIONS+="watch"
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"

View File

@ -55,10 +55,10 @@ ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PA
ENV{DEVTYPE}=="disk", KERNEL!="sd*|sr*", ATTR{removable}=="1", GOTO="persistent_storage_end"
# probe filesystem metadata of optical drives which have a media inserted
KERNEL=="sr*", ENV{ID_CDROM_MEDIA}=="?*", IMPORT{program}="vol_id --export --skip-raid --offset=$env{ID_CDROM_MEDIA_SESSION_LAST_OFFSET} $tempnode"
KERNEL=="sr*", ENV{ID_CDROM_MEDIA}=="?*", IMPORT{program}="/sbin/blkid -o udev -p -u noraid -O $env{ID_CDROM_MEDIA_SESSION_LAST_OFFSET} $tempnode"
# probe filesystem metadata of disks
KERNEL!="sr*", IMPORT{program}="vol_id --export $tempnode"
KERNEL!="sr*", IMPORT{program}="/sbin/blkid -o udev -p $tempnode"
# watch for future changes
KERNEL!="sr*", OPTIONS+="watch"

View File

@ -14,7 +14,7 @@ ENV{DM_UUID}=="?*", SYMLINK+="disk/by-id/dm-uuid-$env{DM_UUID}", OPTIONS+="strin
ENV{DM_STATE}=="SUSPENDED", GOTO="device_mapper_end"
ENV{DM_TARGET_TYPES}=="|*error*", GOTO="device_mapper_end"
IMPORT{program}="vol_id --export $tempnode"
IMPORT{program}="/sbin/blkid -o udev -p $tempnode"
OPTIONS+="link_priority=-100"
OPTIONS+="watch"
ENV{DM_TARGET_TYPES}=="*snapshot-origin*", OPTIONS+="link_priority=-90"