首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

gnome-disk-utility 包的功用(mkfs set ownership principle)

2012-07-04 
gnome-disk-utility 包的作用(mkfs set ownership principle)1. 它提供了一个硬盘信息显示的图形工具:/usr

gnome-disk-utility 包的作用(mkfs set ownership principle)

1. 它提供了一个硬盘信息显示的图形工具:

/usr/bin/palimpsest

?

2. 和nautilus移动设备挂载相关,提供了部分扩展:

比如修正挂载点label 的显示。

?

3.格式化移动设备:

一般我们在终端中使用类似mkfs.ext3的格式化命令后,mount得到的挂载点都是root权限。普通用户无法往里写东西。

在palimpsest中,我们格式化时选择“Take ownership of file system“选项后,普通用户也可以往格式好的设备读写东西了。

这一功能的实现原理是,使用udisks 格式化时,将普通用户的uid/gid作为格式化参数,gnome-disk-utility:

voidgdu_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;        }    }
?

?

热点排行