如何快速生成 UUID GUID

如何快速生成 UUID GUID,第1张

通用的GUID的结构如下

typedef struct _GUID {

DWORD Data1

WORD Data2

WORD Data3

BYTE Data4[8]

} GUID

举一个例子:

假设一个GUID的格式是这样的 6B29FC40-CA47-1067-B31D-00DD010662DA

其中Data1 是32位,可以看做8个四位十六进制数,对应于上面的6B29FC40

其中Data2 是16位,可以看做4个四位十六进制数,对应于上面的CA47

其中Data3 是16位,可以看做4个四位十六进制数,对应于上面的1067

其中Data4 比较特殊,是8个字节也就可以看做16个四位十六进制数

取其Data4[0],Data4[1]来组成4个四位十六进制数,对应于上面的B31D

取其Data4[2],Data4[3]来组成4个四位十六进制数,对应于上面的00DD

取其Data4[4],Data4[5]来组成4个四位十六进制数,对应于上面的0106

取其Data4[6],Data4[7]来组成4个四位十六进制数,对应于上面的62DA

*注意:四位十六进制数对应一个GUID字符。

在Windows下提供了一个函数可以生成一个GUID。需要使用的头文件 "objbase.h",需要链接的库ole32.lib。

HRESULT CoCreateGuid(GUID * pguid)

在Linux下首先需要下载到相应的库文件和头文件

如果是Debian用户可以方便的通过apt命令来获取相关资源。

apt-get install uuid-dev

安装完成后会发现

在/usr/include/ 下有一个uuid文件夹,其中则包含了uuid.h头文件。

在/usr/lib/ 下有几个libuuid*的链接库文件,包括静态和动态链接库。

打开uuid.h你会发现有一个uuid_generate(uuid_t out) 的函数声明。我们可以通过调用这个函数来生成UUID。

uuid_generate(reinterpret_cast<unsigned char *>(&guid))

生成GUID是不是很简单!是的,因为生成的算法不用我们去实现,我们是站在前人的肩膀所以我们要感谢他们。

下面给出一个WINDOWS和LINUX下通用的程序。

// uuid_test.cpp

#include <string>

#include <stdio.h>

#include <iostream>

#include "uuid_test.hpp"

#ifdef WIN32

#include <objbase.h>

#else

#include <uuid/uuid.h>

#endif

using namespace std

namespace ChinuxTeam

{

GUID CreateGuid()

{

GUID guid

#ifdef WIN32

CoCreateGuid(&guid)

#else

uuid_generate(reinterpret_cast<unsigned char *>(&guid))

#endif

return guid

}

std::string GuidToString(const GUID &guid)

{

char buf[64] = {0}

#ifdef __GNUC__

snprintf(

#else // MSVC

_snprintf_s(

#endif

buf,

sizeof(buf),

"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",

guid.Data1, guid.Data2, guid.Data3,

guid.Data4[0], guid.Data4[1],

guid.Data4[2], guid.Data4[3],

guid.Data4[4], guid.Data4[5],

guid.Data4[6], guid.Data4[7])

return std::string(buf)

}

}

对应的头文件

// uuid_test.hpp"

#include <string>

#include <stdio.h>

#include <iostream>

typedef struct _GUID

{

unsigned long Data1

unsigned short Data2

unsigned short Data3

unsigned char Data4[8]

} GUID, UUID

namespace ChinuxTeam

{

GUID CreateGuid()

std::string GuidToString(const GUID &guid)

}// namespace ChinuxTeam

最后一个 GuidToString()稍微解释一下,作用就是把GUID以固定的格式输出到标准string字符串中,

根据编译器的不同调用分别调用了不同的字符串打印函数。

另外附一个简单的测试函数

#include <string>

#include <stdio.h>

#include <iostream>

#ifdef WIN32

#include "objbase.h"

#else

typedef struct _GUID

{

unsigned long Data1

unsigned short Data2

unsigned short Data3

unsigned char Data4[8]

} GUID, UUID

#endif

namespace ChinuxTeam{

GUID CreateGuid()

std::string GuidToString(const GUID &guid)

}

运行后会生成一个GUID并打印到标准输出的控制台上。

磁盘挂载与卸载

磁盘分区完之后需要格式化,格式化之后需要挂载磁盘

格式化后的磁盘恰是是一个块设备文件,类型为b。

在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把某个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据时,则会写到该分区中。需要注意!

在挂载该分区前,挂载点(目录)下必须是个空目录。其实目录不为空并不影响所挂载分区的使用。但是一旦挂载上了,那么该目录下以前的东西就看不到了。只有卸载掉该分区后才能看到。

命令:mount

单一文件系统不应该被重复挂载在不同的挂载点中

单一目录不应该重复挂载多个文件系统

作为挂载点的目录理论上应该都是空目录

语法:mount

[-t

vfstype]

[-o

options] device

dir

1.-t

vfstype 指定文件系统的类型,通常不必指定。

2.-o

options 主要用来描述设备或档案的挂接方式。

3.device

要挂接(mount)的设备。

4.dir设备在系统上的挂接点(mount

point)。

选项:

-a:依照配置文件/etc/fstab

的数据将所有未挂载的磁盘都挂载上来

-l:单纯输入mount会显示目前挂在信息,加上-l

可增列LABEL名称

-t:可加上文件系统种类来指定欲挂载的类型

-n:在默认情况下,系统会将实际挂载的情况实时写人/etc/mtab中,以利其他系统运行,但在某些情况下欲避免问题,会刻意不写入,此时就要加-n选项。

-L:系统除了可以利用设备文件名之外,还可以利用文件系统的卷标名称来进行挂载

-o:后面可以接一些挂载时额外加上的参数:

常用的选项有:-a、-t、-o.

如果不加任何选项,直接运行mount命令,会显示如下信息:

[root@qiangzi ~]# mount

/dev/sda3 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts

(rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type

binfmt_misc (rw)

mount命令可以查看当前系统已经挂载的所有分区,以及分区文件系统的类型,挂载点和一些选项等信息。所以如果想知道某个分区的文件系统类型直接用该命令查看即可。

例:

建一个空目录,然后在目录里建一个空白文档。

[root@qiangzi ~]# mkdir /newdir

[root@qiangzi ~]# touch

/newdir/newfile.txt

[root@qiangzi ~]# ls

/newdir/newfile.txt

/newdir/newfile.txt

然后把格式化的 /dev/sdb5挂载到

/newdir上。

mount: wrong fs type, bad option, bad

superblock on /dev/sdb5,

missing codepage or helper program, or

other error

In some cases useful info is found in

syslog - try

dmesg | tail or so

不能完成挂载,根据以上挂载错误的提示:

[root@qiangzi ~]# dmesg |tail

Adding 2097144k swap on /dev/sda2.

Priority:-1 extents:1 across:2097144k

NET: Registered protocol family 10

lo: Disabled Privacy Extensions

ip6_tables: (C) 2000-2006 Netfilter Core

Team

nf_conntrack version 0.5.0 (16100

buckets, 64400 max)

ip_tables: (C) 2000-2006 Netfilter Core

Team

eth0: link up

eth0: no IPv6 routers present

EXT4-fs (sdb5): bad block size

8192

EXT4-fs (sdb5): bad block size

8192

可以看到,我的/dev/sdb5指定的块值8192不合法,所以只能重新格式化磁盘。

[root@qiangzi ~]# mke2fs -t ext4 -L TEST

/dev/sdb5

使用默认块值即可。继续挂载sdb5。

[root@qiangzi ~]# mount /dev/sdb5

/newdir/

[root@qiangzi ~]# ls /newdir/

lost+found

[root@qiangzi ~]# df -h

文件系统 容量 已用 可用 已用% 挂载点

Filesystem Size Used

Avail Use% Mounted on

/dev/sda3 7.8G 2.0G 5.5G 27% /

tmpfs 504M 0 504M 0% /dev/shm

/dev/sda1 97M 26M 67M 29% boot

/dev/sdb5 989M 18M 921M 2% /newdir

把/dev/sdb5挂载到/newdir后,原来在/neddir下的newfile.txt被覆盖了,通过df

-h可以看到刚才挂载的分区,我们也可以使用LABEL的方式挂载分区:

[root@qiangzi ~]# umount /newdir/

[root@qiangzi ~]# df -h

Filesystem Size Used Avail Use% Mounted

on

/dev/sda3 7.8G 2.0G 5.5G 27% /

tmpfs 504M 0 504M 0% /dev/shm

/dev/sda1 97M 26M 67M 29% /boot

[root@qiangzi ~]# mount LABEL=TEST

/newdir

[root@qiangzi ~]# df -h

Filesystem Size Used Avail Use% Mounted

on

/dev/sda3 7.8G 2.0G 5.5G 27% /

tmpfs 504M 0 504M 0% /dev/shm

/dev/sda1 97M 26M 67M 29% /boot

/dev/sdb5 989M 18M 921M 2% /newdir

日常运维工作中会遇到这样的情况,一台服务器上新装了两块磁盘,磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd)。又一次把这两块磁盘都拔掉了,然后再重新插上,重启机器,结果磁盘编号调换了。a变成了sdd,b变化才能了sdc(这是应为把磁盘差错了卡槽)。

通过上面的学习,挂载磁盘是通过/dev/hdb1这样的分区名字来挂载的,如果先前加入到了/etc/fstab中,结果系统启动后则会挂载错分区。

如何避免这种情况发生?这就要用到UUID,可以通过blkid命令获取各分区的UUID:

blkid命令

获取文件系统类型、UUID

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。

[root@qiangzi ~]# blkid

/dev/sda1:

UUID="37d8fe31-1cd8-4179-9aaa-1ee58284891d" TYPE="ext4"

/dev/sda2:

UUID="1ac357d6-a735-468f-ba6c-1eabad6aa0f2" TYPE="swap"

/dev/sda3:

UUID="51a8587e-7445-4ea8-85ef-bad6a1336748" TYPE="ext4"

/dev/sdb5: LABEL="TEST"

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" TYPE="ext4"

这样可以获得全部磁盘分区的UUID,如果格式化的时候指定了LABLE则该命令也会显示LABEL值,甚至连文件系统类型也会显示。当然这个命令后面也可以指定哪个分区:

[root@qiangzi ~]# blkid /dev/sdb5

/dev/sdb5: LABEL="TEST"

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" TYPE="ext4"

获得UUID之后的使用方法:

[root@qiangzi ~]# umount /newdir

[root@qiangzi ~]# mount

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" /newdir

[root@qiangzi ~]# df -h

Filesystem Size Used Avail Use% Mounted

on

/dev/sda3 7.8G 2.0G 5.5G 27% /

tmpfs 504M 0 504M 0% /dev/shm

/dev/sda1 97M 26M 67M 29% /boot

/dev/sdb5 989M 18M 921M 2% /newdir

也可以把下面这行写到/etc/fstab中

UUID=b45f5443-75e4-4994-8743-4ba7fb25311e /newdir ext4 defa ults

00

如果想让某个分区开机后就自动挂载,有两个办法可以实现:在/etc/fstab中添加一行。如上例中那行;把挂载命令写到/etc/re.d/rc.local文件中去,我会经常把想要开机启动的命令加到这个文件中。系统启动后会执行这个文件中的命令,所以只要想开机后运行什么命令统统写入到这个文件下面,直接放到最后面即可,把挂载的命令放在文件最后一行:

[root@qiangzi ~]# cat

/etc/rc.d/rc.local

#!/bin/sh

#

# This script will be executed *after*

all the other init scripts.

# You can put your own initialization

stuff in here if you don't

# want to do the full Sys V style init

stuff.

touch /var/lock/subsys/local

[root@qiangzi ~]# vi

/etc/rc.d/rc.local

#!/bin/sh

#

# This script will be executed *after*

all the other init scripts.

# You can put your own initialization

stuff in here if you don't

# want to do the full Sys V style init

stuff.

touch /var/lock/subsys/local

mount

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" /newdir

~

按esc退出,输入:wq,保存退出即可

以上两种方法任选其一。

建议挂载磁盘分区的时候尽量使用UUID或者LABEL这两种方法。

命令:umount

选项:-l,(非常有用,遇到不能卸载的情况用-l)

在上面的例子中,多次用到这个命令。

umount后面可以跟挂载点,也可以跟分区名(/dev/hdb1).

但是不可以跟LABEL和UUID。

[root@qiangzi ~]# umount /dev/sdb5

[root@qiangzi ~]# mount

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" /newdir

[root@qiangzi ~]# umount /newdir

[root@qiangzi ~]# mount

UUID="b45f5443-75e4-4994-8743-4ba7fb25311e" /newdir

[root@qiangzi ~]# df -h

Filesystem Size Used Avail Use% Mounted

on

/dev/sda3 7.8G 2.0G 5.5G 27% /

tmpfs 504M 0 504M 0% /dev/shm

/dev/sda1 97M 26M 67M 29% /boot

linux 卸载磁盘后挂载目录还存在

方舟生存进化游戏下载

精选推荐

广告

linux mount 硬盘挂载和卸载

68阅读·0评论·0点赞

2016年11月3日

Linux下mount挂载后,原目录下的内容消失

2.6W阅读·0评论·2点赞

2014年5月5日

Linux实 *** 篇-Linux 磁盘分区、挂载

233阅读·0评论·0点赞

2022年9月3日

新硬盘挂载目录后文件消失解决办法

3.1W阅读·6评论·9点赞

2014年7月29日

linux怎么卸载home文件系统,Linux磁盘和文件系统管理(3)_磁盘挂载 卸载

499阅读·0评论·0点赞

2021年5月14日

ubuntu挂载与卸载

2183阅读·0评论·0点赞

2022年3月20日

三国新模式,由你带兵攻城作战!

精选推荐

广告

【转载】Linux新硬盘挂载某目录后原目录的文件消失

702阅读·1评论·3点赞

2022年6月28日

linux各种挂载点作用,Linux 挂载点目录及其作用

1636阅读·0评论·0点赞

2021年5月16日

【Linux实验】系统分区挂载与卸载配置实验

455阅读·0评论·2点赞

2022年5月15日

解决mount挂载问题:wrong fs type, bad option, bad superblock on

2.8W阅读·0评论·4点赞

2019年6月19日

Linux如何创建挂载点

1.0W阅读·0评论·1点赞

2020年4月8日

Linux 挂载分区到文件夹后,文件夹原来数据哪去了

736阅读·0评论·0点赞

2015年2月3日

ubuntu挂载与卸载硬盘

1567阅读·0评论·1点赞

2021年4月1日

linux挂载前后数据会改变么,linux挂载点变化

321阅读·0评论·0点赞

2021年5月15日

Linux基础知识-挂载一个磁盘再卸载掉

96阅读·0评论·0点赞

2020年2月29日

linux取消目录挂载,Linux取消挂载,删除用户及其目录

261阅读·0评论·0点赞

2021年5月12日

解决办法之Linux新硬盘挂载某目录后原目录的文件消失

8089阅读·0评论·9点赞

2021年3月13日

Linux文件系统的的挂载与卸载(mount、umount)

2771阅读·0评论·1点赞

2019年2月10日

Linux 实用指令(7)--Linux 磁盘分区、挂载

90阅读·0评论·0点赞

2019年9月26日

Linux使用mount把目录挂载到新磁盘后 原目录的内容消失 解决办法

1173阅读·2评论·0点赞

2022年2月26日

去首页

看看更多热门内容


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8323222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存