1. 它提供了一个硬盘信息显示的图形工具:
/usr/bin/palimpsest
2. 和nautilus移动设备挂载相关,提供了部分扩展:
比如修正挂载点label 的显示。
3.格式化移动设备:
一般我们在终端中使用类似mkfs.ext3的格式化命令后,mount得到的挂载点都是root权限。普通用户无法往里写东西。
在palimpsest中,我们格式化时选择“Take ownership of file system“选项后,普通用户也可以往格式好的设备读写东西了。
这一功能的实现原理是,使用udisks 格式化时,将普通用户的uid/gid作为格式化参数,gnome-disk-utility:
void gdu_device_op_partition_create (GduDevice *device, guint64 offset, guint64 size, const char *type, const char *label, char **flags, const char *fstype, const char *fslabel, const char *encrypt_passphrase, gboolean fs_take_ownership, GduDevicePartitionCreateCompletedFunc callback, gpointer user_data) { int n; char *fsoptions[16]; char *options[16]; PartitionCreateData *data; data = g_new0 (PartitionCreateData, 1); data->device = g_object_ref (device); data->callback = callback; data->user_data = user_data; options[0] = NULL; n = 0; if (fslabel != NULL && strlen (fslabel) > 0) { fsoptions[n++] = g_strdup_printf ("label=%s", fslabel); } if (encrypt_passphrase != NULL && strlen (encrypt_passphrase) > 0) { fsoptions[n++] = g_strdup_printf ("luks_encrypt=%s", encrypt_passphrase); } if (fs_take_ownership) { fsoptions[n++] = g_strdup_printf ("take_ownership_uid=%d", getuid ()); fsoptions[n++] = g_strdup_printf ("take_ownership_gid=%d", getgid ()); } fsoptions[n] = NULL; org_freedesktop_UDisks_Device_partition_create_async (device->priv->proxy, offset, size, type, label, (const char **) flags, (const char **) options, while (n >= 0) g_free (fsoptions[n--]); }
在UDISKS 调用对应的格式化命令后,会自己在“/run/udisks/job-mkfs-XXXXXX“ 挂载一遍。然后再调用chown (dir, take_ownership_uid, take_ownership_gid) 函数,将挂载好的路径chown成普通用户。
udisks/src/helpers/job-mkfs.c:
/* take ownership of the device if requested */ if (take_ownership_uid != 0 || take_ownership_gid != 0) { char dir[256] = PACKAGE_LOCALSTATE_DIR "/run/udisks/job-mkfs-XXXXXX"; if (mkdtemp (dir) == NULL) { g_printerr ("cannot create directory %s: %m\n", dir); goto out; } if (mount (device, dir, fstype, 0, NULL) != 0) { g_printerr ("cannot mount %s at %s: %m\n", device, dir); ret = 2; goto tos_err0; } if (chown (dir, take_ownership_uid, take_ownership_gid) != 0) { g_printerr ("cannot chown %s to uid=%d and gid=%d: %m\n", dir, take_ownership_uid, take_ownership_gid); ret = 2; } if (chmod (dir, 0700) != 0) { g_printerr ("cannot chmod %s to mode 0700: %m\n", dir); ret = 2; } if (umount (dir) != 0) { g_printerr ("cannot unmount %s: %m\n", dir); ret = 2; goto tos_err0; } tos_err0: if (rmdir (dir) != 0) { g_printerr ("cannot remove directory %s: %m\n", dir); goto out; } }