月度归档:2024年12月

vmware引导U盘/移动硬盘中的系统

看到标题会不会觉得有点扯?哈哈,我自己也觉得有点扯,但事实就如标题那样,至于为什么要这样操作,我简单解释下:

我平时用Windows主机工作,偶尔会在Linux下干点活,然后我突发奇想将Linux系统安装在了移动硬盘上,平时需要的时候就重启电脑,然后选择安装了Linux系统的移动硬盘进行引导进入Linux系统。。。(这里大家可能就疑惑了,直接在Windows装个虚拟机不就得了?还需要这样折腾?)哈哈哈,确实,简单的事被我弄复杂了,不过也确实有原因,物理机的Linux性能肯定比虚拟机好,所以有一个出发点就是为了完全发挥硬件性能才这样做的,同时为了方便移动就安装在移动硬盘上了。

直到今天,我突然想把Linux系统上的某个数据文件复制出来使用,由于我是远程连接的Windows主机,所以没办法在重启的时候选择移动硬盘进行引导(其实最好的办法是弄个IPKVM设备来解决,这里不讨论~)我就突发奇想想在VMware中引导移动硬盘中的系统。(其实可以用一些磁盘工具直接读移动硬盘里面的数据~)

那么怎么操作呢?先说下我移动硬盘里面安装的什么系统。我安装的是ubuntu 24.02 64位,并且在物理机上使用的是UEFI(敲黑板)引导。

首先在VMware中创建虚拟机,创建时选择“稍后创建系统”

客户机操作系统选择和移动硬盘中一样的系统

到“选择磁盘”这一步我们需要选择“使用物理磁盘(适用于高级用户)”

接下来就是选择你的U盘/移动硬盘,这里大家可能不知道哪个才是自己的移动硬盘,可以在下面的“使用情况”中选择单个分区,然后在弹出的分区选择框中通过分区数量、大小、文件系统来辨别。

创建好虚拟机后,我们把虚拟机改为UEFI启动,这里在上面提过了,因为移动硬盘里面的系统在物理机上是UEFI引导的。

设置好之后我们就可以启动虚拟机了,我这里就出现了grub引导的界面了

至此,整个过程完结。

clickhouse解决自增id

clickhouse本身并不支持创建自增列,原因是clickhouse是分布式的,基于此特性,我们可以联想到“在分布式数据库中如何创建唯一自增id?”这一问题。

关于这个问题,其实网络上已经有很多答案了,这里我们举例几种常见的做法。

  1. 雪花算法
  2. 基于Redis缓存生成
  3. UUID

在clickhouse中我们同样可以使用上述方法解决自增ID的问题,基于clickhouse本身来说,我们可以使用雪花算法和UUID方法快速解决问题,Redis就稍微复杂一点,因为它是一个额外的东西,需要我们编写额外的代码来维护,这里不做讨论。

下面以实际例子来演示如何在clickhouse创建唯一自增ID列,例如我现在的需求是将data.parquet文件导入clickhouse中,这个文件中不包含唯一值,所以需要我们在导入时将唯一ID写进去。

clickhouse为我们提供了许多有用的函数,其中就包括生成雪花ID和UUID的函数,我们可以直接使用它们。

使用生成雪花ID函数 generateSnowflakeID

语法

SQL
generateSnowflakeID([expr, [machine_id]])

参数

  • expr — An arbitrary expression used to bypass common subexpression elimination if the function is called multiple times in a query. The value of the expression has no effect on the returned Snowflake ID. Optional.
  • machine_id — A machine ID, the lowest 10 bits are used. Int64. Optional.

实际操作,因为我是单机部署的clickhouse,所以machine_id 写了1

SQL
CREATE TABLE table_name ENGINE = MergeTree PRIMARY KEY (id) ORDER BY (id) AS SELECT generateSnowflakeID(1) as id, * FROM file('data.parquet', Parquet)

UUID也类似,使用 generateUUIDv4 函数,这里就不再赘述。