分类 linux 下的文章

在物理机上面安装完物理机碰到下面这个错误:

dracut丢失raid驱动

刚看到这个问题,猜测是因为系统未正确安装,重新安装了一次还是出现同样的问题.开始怀疑不是系统安装问题,整理了下系统启动过程

  • 当系统从固件接口启动(UEFI / BIOS)时,它的工作原理是找到可启动磁盘, 这一步正常
  • 加载bootloader程序(grub/ilo),bootloader程序启动内核和初始化内存镜像(initramfs), 这一步应该也通过了
  • initramfs的内部的工具负责将系统切换到SysVinit/Systemd,但是在启动服务前,需要加载根盘,读取根盘内的相关内容(从上述截图看,是加载根盘过程中,没有找到对应的根盘分区, 这地方出问题了)

- 阅读剩余部分 -

准确的计时已成为现代软件部署的关键组成部分。无论是确保以正确的顺序记录日志还是正确应用数据库更新,不同步的时间都可能导致错误,数据损坏和其他难以调试的问题。

最新基于systemd的发行版本都有内置的时间同步功能,由systemd-timesyncd服务接管。下面是一些相关的操作,帮助我们快速解决时间同步问题。

设置时区(timezone)

通过date命令我们可以快速查看服务器的时间信息,这里现实的是UTC(Coordinated Universal Time)时间,当您的基础架构跨越多个时区时,一致地使用UTC时间可以减少系统交互之间的混乱。

date

Tue Sep  4 17:51:49 UTC 2018

- 阅读剩余部分 -

最近开始准备整理一份完整的Linux/FreeBSD的PXE安装教程,先从基础设施VirtualBox安装开始,便于我们模拟在真实场景下远程装机的功能.

1.下载软件

建议直接从官网下载软件,下载软件的同时可以关注下官方一些文档,以及最近的版本情况,甚至你还可以关注下目前版本对PXE的支持情况

(1).Windows下载地址

https://download.virtualbox.org/virtualbox/6.0.4/VirtualBox-6.0.4-128413-Win.exe

安装过程没太多需要注意的,一步一步确认就好了.

VirtualBox安装

(2).Linux下载地址

https://www.virtualbox.org/wiki/Linux_Downloads

- 阅读剩余部分 -

我个人电脑使用的是Gentoo Linux, 其他Linux发行版本同样适用下面的方法.

在我们开始备份之前,我们需要对备份的环境做一些说明,开源社区一般都建议将Linux系统做如下分区:

  • /boot 使用独立分区也可以不分区(分区的好处是根分区有问题的话, 内核相关的启动代码不会丢失)
  • / 根分区使用独立分区
  • /opt 使用独立分区
  • /home 使用独立分区
  • /var使用独立分区

使用社区建议能最大限度保存你环境, 做好备份的话, 能很快恢复系统, 即使硬盘有坏道的情况下.

- 阅读剩余部分 -

很长时间没有升级Gentoo Linux了, 手痒执行了一次全系统更新, 发现比以前的升级编译的时间长了非常多.

看了下log, 花时间最多的地方在gcc/mesa/llvm这三个包, 顺带研究了下gcc/llvm的关系,又使用equery 检查了下llvm包的依赖关系, 整个系统只有mesa一个包直接依赖llvm,对于个人用户, 建议还是果断将 -llvm use 标记添加到/etc/portage/make.conf, 减少升级编译的时间.除非你的工作确实需要llvm.以下是我优化后的mesa包的use标记列表:

下面是我的/etc/portage/make.conf中的USE变量配置的内容,我比较喜欢mate的简单,所以qt/kde等等都被移除了.

USE="${USE} systemd -samba ipv6 -cups -qt4 -ldap -gnome -kde jpeg jpeg2k tk -llvm"

- 阅读剩余部分 -

概述

在本文中,我们将探讨来自Java集合框架Map接口的TreeMap实现。

TreeMap它根据键的自然顺序对其元素进行排序,也可以根据用户提供了比较器排序。

在此之前,我们已经介绍了HashMap的实现,我们将认识到关于这些类如何工作的相当多的信息是类似的。

在继续阅读本文之前,强烈推荐阅读上面提到的文章。

默认排序

默认情况下,TreeMap根据其自然顺序对所有元素进行排序。对于整数,这意味着升序,对于字符串,这意味着字母顺序。

让我们看看测试中的自然顺序:

@Test
public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect() {
    TreeMap<Integer, String> map = new TreeMap<>();
    map.put(3, "val");
    map.put(2, "val");
    map.put(1, "val");
    map.put(5, "val");
    map.put(4, "val");

    assertEquals("[1, 2, 3, 4, 5]", map.keySet().toString());
}

注意,我们以非有序的方式放置了整数键,但是在检索键集时,我们确认它们确实是按升序维护的。这是整数的自然顺序。

同样的,当我们使用字符串时,它们会按自然顺序排序,即按字母顺序:

@Test
public void givenTreeMap_whenOrdersEntriesNaturally_thenCorrect2() {
    TreeMap<String, String> map = new TreeMap<>();
    map.put("c", "val");
    map.put("b", "val");
    map.put("a", "val");
    map.put("e", "val");
    map.put("d", "val");

    assertEquals("[a, b, c, d, e]", map.keySet().toString());
}

自定义排序

如果我们对TreeMap的自然顺序不满意,我们还可以在构建时通过比较器定义自己的排序规则。

在下面的例子中,我们希望整数键按降序排列:

@Test
public void givenTreeMap_whenOrdersEntriesByComparator_thenCorrect() {
    TreeMap<Integer, String> map = 
      new TreeMap<>(Comparator.reverseOrder());
    map.put(3, "val");
    map.put(2, "val");
    map.put(1, "val");
    map.put(5, "val");
    map.put(4, "val");

    assertEquals("[5, 4, 3, 2, 1]", map.keySet().toString());
}

HashMap不保证存储的键的顺序,也不保证这个顺序在一段时间内保持不变,但是TreeMap保证键总是按照指定的顺序排序。

排序的重要性

我们现在知道TreeMap以排序的顺序存储它的所有元素。我们可以执行以下查询;查找“最大”,查找“最小”,查找所有小于或大于某个值的键,等等。

以下守则只涵盖其中一小部分个案:

@Test
public void givenTreeMap_whenPerformsQueries_thenCorrect() {
    TreeMap<Integer, String> map = new TreeMap<>();
    map.put(3, "val");
    map.put(2, "val");
    map.put(1, "val");
    map.put(5, "val");
    map.put(4, "val");

    Integer highestKey = map.lastKey();
    Integer lowestKey = map.firstKey();
    Set<Integer> keysLessThan3 = map.headMap(3).keySet();
    Set<Integer> keysGreaterThanEqTo3 = map.tailMap(3).keySet();

    assertEquals(new Integer(5), highestKey);
    assertEquals(new Integer(1), lowestKey);
    assertEquals("[1, 2]", keysLessThan3.toString());
    assertEquals("[3, 4, 5]", keysGreaterThanEqTo3.toString());
}

TreeMap的内部实现

TreeMap实现了NavigableMap接口,内部基于红黑树:

public class TreeMap<K,V> extends AbstractMap<K,V>
  implements NavigableMap<K,V>, Cloneable, java.io.Serializable

红黑树的原则超出了本文的范围,但是,为了理解它们如何适应TreeMap,需要记住一些关键的事情。

首先,红黑树是由节点组成的数据结构;想象一棵倒立的芒果树,它的根在天空中,树枝向下生长。根将包含添加到树中的第一个元素。

规则是,从根节点开始,任何节点的左分支中的任何元素总是小于节点本身中的元素。右边的总是更大。如前所述,定义大于或小于的是由元素的自然顺序或构造时定义的比较器决定的。

这个规则保证了TreeMap的元素始终是有序和可预测的。

其次,红黑树是一种自平衡二叉搜索树。该属性和上述属性保证了搜索、获取、放置和删除等基本操作花费对数时间O(log n)。

自我平衡是关键。当我们不断地插入和删除条目时,想象一下这棵树一边长了,另一边短了。

这意味着一个操作在较短的分支上花费的时间较短而在离根最远的分支上花费的时间较长,这是我们不希望发生的。

因此,在红黑树的设计中要注意这一点。对于每一次插入和删除操作,树在任何边的最大高度都保持在O(log n)处,即树本身保持连续平衡。

总结

在本文中,我们探讨了Java TreeMap类的使用及其内部实现。

本地修改了一堆文件,没有git add到暂存区时, 如果需要撤销修改, 可以参考下述操作:

单个文件/文件夹

$ git checkout -- filename

所有文件/文件夹

$ git checkout .

本地新增了一堆文件,没有git add到暂存区, 如果需要去掉新增文件:

单个文件/文件夹

$ rm filename / rm dir -rf

所有文件/文件夹

$ git clean -xdf

- 阅读剩余部分 -