LuMing's blog

  • Home

  • Tags

  • Archives

记一次大宕机

Posted on 2018-11-07 | Edited on 2019-04-18

引言

这次开 win10 时,它报了一条错误

无法加载应用程序或操作系统,原因是所需文件丢失或包含错误。

文件:\Windows\system32\winload.exe
错误代码:0xc000000e

那一刻,人类又想起了被折腾系统支配的恐惧。

折腾Win10

先百度呗,给到的方法大致有这么几种:

  1. chkdisk /f 先修复。
    结果:卡到某一进度上,失败。
  2. 进WinPe,BOOTICE 修复。
    结果:失败。
  3. 下一个系统烧录到 U 盘上,利用 win10 自带的 repair 功能。
    结果:错误都不报,失败。
    感觉不大对劲,打开系统盘。少了整整 20多个G!这系统都被硬砍掉了一大半还能启动个X。
    事已至此,格式化吧,反正该备份的早都备份过,没备份的就当清理垃圾了。就这样了。
    可没想到…

    折腾Ubuntu

    造孽,双系统 Ubuntu都被连累了。打开 Ubuntu,
    error:file '/boot/grub/i386-pc/normal.mod' not found.
    
    心里一万句馍馍片。继续折腾。
    原本看起来挺简单的方法:
    烧录一个系统盘到 U盘上,启动微型 Ubuntu,连上网,上工具boot-repair
    结果:等待一个多小时,报错啥不能 purge grub2。
    沿着这条线索,百度这边已经断了。换谷歌。
    又是一大堆方法:
    mount 原系统所在分区,用 grub-install…balabala…如果还有额外的/boot分区,还要分情况讨论…balabala…
    被劝退了,放弃了,直接换最新的Ubuntu 18。

    峰回路转

    装就装吧,可总得备份一下。这一打开备份的文件,就想起之前为了配置个环境忙的死去活来。再搏一搏吧,百度一下 error:file ‘/boot/grub/i386-pc/normal.mod’ 。
    按着教程那么一敲,熟悉的紫色画面映入眼帘,心中一片欢喜。
    但是!重启之后又遇到了这个问题,怎么办。继续教程往下看,重新安装grub。但结果是:
    无法嵌入。在此次安装中 GRUB 只能通过使用块列表安装。但是块列表是不可信赖的,不推荐使用。
    
    试一试 boot-repair。又是漫长几分钟的添加仓库源,下载,安装,扫描,修复。报错:
    当前在 legacy 模式下,请重启并改为 UEFI 模式启动。
    
    改就改吧。
    可这改了后,根本找不到 Ubuntu 的启动选项了。这…

    结局

    天无绝人之路,终于在这篇文章中找到办法。大意是这样的:
    1.进入用 U 盘烧录的微型系统中
  4. 将原来系统的东西原封不动地 mount 进去。
  5. chroot,临时进入原来的系统。
  6. 重装 grub。
    OK,这次全都搞定了。

科学与技术

Posted on 2018-11-02 | Edited on 2019-04-18

读《concepts, techniques, models of computer programming》时有一段关于科学与技术的描述,非常精彩:

“The technology consists of tools, practical techniques, and standards, allowing us to do programming. The science consists of a broad and deep theory with predictive power, allowing us to understand programming. Ideally, the science should explain the thechnology in a way that is as direct and useful as possible.If either part is left out, we are nolong doing programming. Without the technology, we are doing pure mathematics. Without the science, we are doing a craft,i.e., we lack deep understanding. Teaching programming correctly therefore means teaching both the technolog (current tools) and the science (fundamental concepts). Knowing the tools prepares the student for the present. Knowing the concepts prepares the student for future developments.”

1024

Posted on 2018-10-24 | Edited on 2019-04-18
一个数字的相反数等于它本身

或许只有在计算机界中,这样的数字有两个:一个是0,一个是2147483648(32位 int)。
在今年的1024里碰到这个 bug,告诉了我界的重要性。

代码一直在写,单词一直在背,步一直在跑。

就奔着这个塔尖而去吧(斜眼笑):
1.jpg

《超脱》

Posted on 2018-10-21 | Edited on 2019-04-18

这几句台词总是不时地在脑中浮现:

UBIQUITOUS
ASSIMILATE
"Awlay absorbing everything everwhere all the time."
...
How are you to imagine anything, if the images are always provide for you?
...
DOUBLETHINK
To deliberately believe in lies while knowing they're false. Examples of this  in everyday life: oh, I... need to be pretty, to be happy. I need surgery to be pretty. I need to be thin, famous, fashionable. Our young men, today, are being told that women, are whorses, bitches, thing to be screwed, beaten, shit on, ashamed. This is a marketing holocaust. 24 hours of a day, for the rest of our lives, the powers that be are hard at work, dumbing us to death. So, to defend ourselves and fight against assimilating this dullness into our thought processes, we must learn to read, to stimulate our own imaginatiion, to cultivate, our own consciousness, our own belief system. We all need these skills, to defend, to preserve, our own minds.

恩,为什么呢?

<翻译>如何在 Linux 上使用网络配置工具 Netplan

Posted on 2018-10-20 | Edited on 2019-04-18

netplan 是一个命令行工具,用于在某些 Linux 发行版上配置网络。

多年以来 Linux 管理员和用户们以相同的方式配置他们的网络接口。例如,如果你是 Ubuntu 用户,你能够用桌面 GUI 配置网络连接,也可以在 /etc/network/interfaces 文件里配置。配置相当简单且可以奏效。在文件中配置看起来就像这样:

auto enp10s0
iface enp10s0 inet static
address 192.168.1.162
netmask 255.255.255.0
gateway 192.168.1.100
dns-nameservers 1.0.0.1,1.1.1.1

保存并关闭文件。使用命令重启网络:

sudo systemctl restart networking

或者,如果你使用不带 systemd 的发行版,你可以通过老办法来重启网络:

sudo /etc/init.d/networking restart

你的网络将会重新启动,新的配置将会生效。

这就是多年以来的做法。但是现在,在某些发行版上(例如 Ubuntu Linux 18.04),网络的配置与控制发生了很大的变化。不需要那个 interfaces 文件和 /etc/init.d/networking 脚本,我们现在转向使用 Netplan。Netplan 是一个在某些 Linux 发行版上配置网络连接的命令行工具。Netplan 使用 YAML 描述文件来配置网络接口,然后,通过这些描述为任何给定的呈现工具生成必要的配置选项。

我将向你展示如何在 Linux 上使用 Netplan 配置静态 IP 地址和 DHCP 地址。我会在 Ubuntu Server 18.04 上演示。有句忠告,你创建的 .yaml 文件中的缩进必须保持一致,否则将会失败。你不用为每行使用特定的缩进间距,只需保持一致就行了。

新的配置文件

打开终端窗口(或者通过 SSH 登录进 Ubuntu 服务器)。你会在 /etc/netplan 文件夹下发现 Netplan 的新配置文件。使用 cd /etc/netplan 命令进入到那个文件夹下。一旦进到了那个文件夹,也许你就能够看到一个文件:

01-netcfg.yaml

你可以创建一个新的文件或者是编辑默认文件。如果你打算修改默认文件,我建议你先做一个备份:

sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak

备份好后,就可以开始配置了。

网络设备名称

在你开始配置静态 IP 之前,你需要知道设备名称。要做到这一点,你可以使用命令 ip a,然后找出哪一个设备将会被用到(图 1)。

netplan

图 1:使用 ip a 命令找出设备名称

我将为 ens5 配置一个静态的 IP。

配置静态 IP 地址

使用命令打开原来的 .yaml 文件:

sudo nano /etc/netplan/01-netcfg.yaml

文件的布局看起来就像这样:

network:
    Version: 2
    Renderer: networkd
    ethernets:
       DEVICE_NAME:
          Dhcp4: yes/no
          Addresses: [IP/NETMASK]
          Gateway: GATEWAY
          Nameservers:
             Addresses: [NAMESERVER, NAMESERVER]

其中:

  • DEVICE_NAME 是需要配置设备的实际名称。
  • yes/no 代表是否启用 dhcp4。
  • IP 是设备的 IP 地址。
  • NETMASK 是 IP 地址的掩码。
  • GATEWAY 是网关的地址。
  • NAMESERVER 是由逗号分开的 DNS 服务器列表。

这是一份 .yaml 文件的样例:

network:
    version: 2
    renderer: networkd
    ethernets:
       ens5:
       dhcp4: no
       addresses: [192.168.1.230/24]
       gateway4: 192.168.1.254
       nameservers:
          addresses: [8.8.4.4,8.8.8.8]

编辑上面的文件以达到你想要的效果。保存并关闭文件。

注意,掩码已经不用再配置为 255.255.255.0 这种形式。取而代之的是,掩码已被添加进了 IP 地址中。

测试配置

在应用改变之前,让我们测试一下配置。为此,使用命令:

sudo netplan try

上面的命令会在应用配置之前验证其是否有效。如果成功,你就会看到配置被接受。换句话说,Netplan 会尝试将新的配置应用到运行的系统上。如果新的配置失败了,Netplan 会自动地恢复到之前使用的配置。成功后,新的配置就会被使用。

应用新的配置

如果你确信配置文件没有问题,你就可以跳过测试环节并且直接使用新的配置。它的命令是:

sudo netplan apply

此时,你可以使用 ip a 看看新的地址是否正确。

配置 DHCP

虽然你可能不会配置 DHCP 服务,但通常还是知道比较好。例如,你也许不知道网络上当前可用的静态 IP 地址是多少。你可以为设备配置 DHCP,获取到 IP 地址,然后将那个地址重新配置为静态地址。

在 Netplan 上使用 DHCP,配置文件看起来就像这样:

network:
    version: 2
    renderer: networkd
    ethernets:
       ens5:
       Addresses: []
       dhcp4: true
       optional: true

保存并退出。用下面命令来测试文件:

sudo netplan try

Netplan 应该会成功配置 DHCP 服务。这时你可以使用 ip a 命令得到动态分配的地址,然后重新配置静态地址。或者,你可以直接使用 DHCP 分配的地址(但看看这是一个服务器,你可能不想这样做)。

也许你有不只一个的网络接口,你可以命名第二个 .yaml 文件为 02-netcfg.yaml 。Netplan 会按照数字顺序应用配置文件,因此 01 会在 02 之前使用。根据你的需要创建多个配置文件。

就是这些了

不管怎样,那些就是所有关于使用 Netplan 的东西了。虽然它对于我们习惯性的配置网络地址来说是一个相当大的改变,但并不是所有人都用的惯。但这种配置方式值得一提……因此你会适应的。

在 Linux Foundation 和 edX 上通过 “Introduction to Linux” 课程学习更多关于 Linux 的内容。


via: https://www.linux.com/learn/intro-to-linux/2018/9/how-use-netplan-network-configuration-tool-linux

作者:Jack Wallen
选题:lujun9972
译者:LuuMing
校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


后记

感谢校对。示例代码要精简,不能照搬原文,要删除多余的空行。后面的标点符号也要注意,即使是英文的引用内容,也要使用中文的引号" ”。

操作系统讲什么

Posted on 2018-10-16 | Edited on 2019-04-18

约束

约束分为 I/O 约束与 CPU 约束。这两个概念是引出操作系统设计的主要问题之一。
操作系统任务之一就是保证多个进程有条不紊的运行,

进程同步

临界区通过互斥锁保护信号量完成 PV 操作进行进程同步。

<翻译> 如何在 Linux 中配置基于密钥认证的 SSH

Posted on 2018-10-15 | Edited on 2019-04-18

什么是基于 SSH 密钥的认证?

众所周知,Secure Shell,又称 SSH,是允许你通过无安全网络(例如 Internet)和远程系统之间安全访问/通信的加密网络协议。无论何时使用 SSH 在无安全网络上发送数据,它都会在源系统上自动地被加密,并且在目的系统上解密。SSH 提供了四种加密方式,基于密码认证,基于密钥认证,基于主机认证和键盘认证。最常用的认证方式是基于密码认证和基于密钥认证。

在基于密码认证中,你需要的仅仅是远程系统上用户的密码。如果你知道远程用户的密码,你可以使用 ssh user@remote-system-name 访问各自的系统。另一方面,在基于密钥认证中,为了通过 SSH 通信,你需要生成 SSH 密钥对,并且为远程系统上传 SSH 公钥。每个 SSH 密钥对由私钥与公钥组成。私钥应该保存在客户系统上,公钥应该上传给远程系统。你不应该将私钥透露给任何人。希望你已经对 SSH 和它的认证方式有了基本的概念。

这篇教程,我们将讨论如何在 Linux 上配置基于密钥认证的 SSH。

在 Linux 上配置基于密钥认证的 SSH

为方便演示,我将使用 Arch Linux 为本地系统,Ubuntu 18.04 LTS 为远程系统。

本地系统详情:

  • OS: Arch Linux Desktop
  • IP address: 192.168.225.37/24

远程系统详情:

  • OS: Ubuntu 18.04 LTS Server
  • IP address: 192.168.225.22/24

本地系统配置

就像我之前所说,在基于密钥认证的方法中,想要通过 SSH 访问远程系统,需要将公钥上传到远程系统。公钥通常会被保存在远程系统的一个 ~/.ssh/authorized_keys 文件中。

注意事项:不要使用 root 用户生成密钥对,这样只有 root 用户才可以使用。使用普通用户创建密钥对。

现在,让我们在本地系统上创建一个 SSH 密钥对。只需要在客户端系统上运行下面的命令。

$ ssh-keygen

上面的命令将会创建一个 2048 位的 RSA 密钥对。你需要输入两次密码。更重要的是,记住你的密码。后面将会用到它。

样例输出:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/sk/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sk/.ssh/id_rsa.
Your public key has been saved in /home/sk/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:wYOgvdkBgMFydTMCUI3qZaUxvjs+p2287Tn4uaZ5KyE [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|+=+*= + |
|o.o=.* = |
|.oo * o + |
|. = + . o |
|. o + . S |
| . E . |
| + o |
| +.*o+o |
| .o*=OO+ |
+----[SHA256]-----+

如果你已经创建了密钥对,你将看到以下信息。输入 y 就会覆盖已存在的密钥。

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

请注意密码是可选的。如果你输入了密码,那么每次通过 SSH 访问远程系统时都要求输入密码,除非你使用了 SSH 代理保存了密码。如果你不想要密码(虽然不安全),简单地敲两次回车。不过,我建议你使用密码。从安全的角度来看,使用无密码的 ssh 密钥对不是什么好主意。这种方式应该限定在特殊的情况下使用,例如,没有用户介入的服务访问远程系统。(例如,用 rsync 远程备份……)

如果你已经在个人文件 ~/.ssh/id_rsa 中有了无密码的密钥,但想要更新为带密码的密钥。使用下面的命令:

$ ssh-keygen -p -f ~/.ssh/id_rsa

样例输出:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

现在,我们已经在本地系统上创建了密钥对。接下来,使用下面的命令将 SSH 公钥拷贝到你的远程 SSH 服务端上。

$ ssh-copy-id sk@192.168.225.22

在这里,我把本地(Arch Linux)系统上的公钥拷贝到了远程系统(Ubuntu 18.04 LTS)上。从技术上讲,上面的命令会把本地系统 ~/.ssh/id_rsa.pub 文件中的内容拷贝到远程系统 ~/.ssh/authorized_keys 中。明白了吗?非常棒。

输入 yes 来继续连接你的远程 SSH 服务端。接着,输入远程系统用户 sk 的密码。

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
sk@192.168.225.22's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'sk@192.168.225.22'"
and check to make sure that only the key(s) you wanted were added.

如果你已经拷贝了密钥,但想要替换为新的密码,使用 -f 选项覆盖已有的密钥。

$ ssh-copy-id -f sk@192.168.225.22

我们现在已经成功地将本地系统的 SSH 公钥添加进了远程系统。现在,让我们在远程系统上完全禁用掉基于密码认证的方式。因为我们已经配置了密钥认证,因此不再需要密码认证了。

在远程系统上禁用基于密码认证的 SSH

你需要在 root 用户或者 sudo 执行下面的命令。

禁用基于密码的认证,你需要在远程系统的终端里编辑 /etc/ssh/sshd_config 配置文件:

$ sudo vi /etc/ssh/sshd_config

找到下面这一行,去掉注释然后将值设为 no:

PasswordAuthentication no

重启 ssh 服务让它生效。

$ sudo systemctl restart sshd

从本地系统访问远程系统

在本地系统上使用命令 SSH 你的远程服务端:

$ ssh sk@192.168.225.22

输入密码。

样例输出:

Enter passphrase for key '/home/sk/.ssh/id_rsa':
Last login: Mon Jul 9 09:59:51 2018 from 192.168.225.37
sk@ubuntuserver:~$

现在,你就能 SSH 你的远程系统了。如你所见,我们已经使用之前 ssh-keygen 创建的密码登录进了远程系统的账户,而不是使用当前账户实际的密码。

如果你试图从其它客户端系统 ssh(远程系统),你将会得到这条错误信息。比如,我试图通过命令从 CentOS SSH 访问 Ubuntu 系统:

样例输出:

The authenticity of host '192.168.225.22 (192.168.225.22)' can't be established.
ECDSA key fingerprint is 67:fc:69:b7:d4:4d:fd:6e:38:44:a8:2f:08:ed:f4:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.225.22' (ECDSA) to the list of known hosts.
Permission denied (publickey).

如你所见,除了 CentOS(LCTT 译注:根据上文,这里应该是 Arch)系统外,我不能通过其它任何系统 SSH 访问我的远程系统 Ubuntu 18.04。

为 SSH 服务端添加更多客户端系统的密钥

这点非常重要。就像我说过的那样,除非你配置过(在之前的例子中,是 Ubuntu),否则你不能通过 SSH 访问到远程系统。如果我希望给更多客户端予以权限去访问远程 SSH 服务端,我应该怎么做?很简单。你需要在所有的客户端系统上生成 SSH 密钥对并且手动拷贝 ssh 公钥到想要通过 ssh 访问的远程服务端上。

在客户端系统上创建 SSH 密钥对,运行:

$ ssh-keygen

输入两次密码。现在,ssh 密钥对已经生成了。你需要手动把公钥(不是私钥)拷贝到远程服务端上。

使用以下命令查看公钥:

$ cat ~/.ssh/id_rsa.pub

应该会输出类似下面的信息:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt3a9tIeK5rPx9p74/KjEVXa6/OODyRp0QLS/sLp8W6iTxFL+UgALZlupVNgFjvRR5luJ9dLHWwc+d4umavAWz708e6Na9ftEPQtC28rTFsHwmyLKvLkzcGkC5+A0NdbiDZLaK3K3wgq1jzYYKT5k+IaNS6vtrx5LDObcPNPEBDt4vTixQ7GZHrDUUk5586IKeFfwMCWguHveTN7ykmo2EyL2rV7TmYq+eY2ZqqcsoK0fzXMK7iifGXVmuqTkAmZLGZK8a3bPb6VZd7KFum3Ezbu4BXZGp7FVhnOMgau2kYeOH/ItKPzpCAn+dg3NAAziCCxnII9b4nSSGz3mMY4Y7 ostechnix@centosserver

拷贝所有内容(通过 USB 驱动器或者其它任何介质),然后去你的远程服务端的终端,像下面那样,在 $HOME 下创建文件夹叫做 .ssh。你需要以 root 身份执行命令(注:不一定需要 root)。

$ mkdir -p ~/.ssh

现在,将前几步创建的客户端系统的公钥添加进文件中。

echo {Your_public_key_contents_here} >> ~/.ssh/authorized_keys

在远程系统上重启 ssh 服务。现在,你可以在新的客户端上 SSH 远程服务端了。

如果觉得手动添加 ssh 公钥有些困难,在远程系统上暂时性启用密码认证,使用 ssh-copy-id 命令从本地系统上拷贝密钥,最后禁用密码认证。

推荐阅读:

  • SSLH – Share A Same Port For HTTPS And SSH
  • ScanSSH – Fast SSH Server And Open Proxy Scanner

好了,到此为止。基于密钥认证的 SSH 提供了一层防止暴力破解的额外保护。如你所见,配置密钥认证一点也不困难。这是一个非常好的方法让你的 Linux 服务端安全可靠。

不久我会带来另一篇有用的文章。请继续关注 OSTechNix。

干杯!


via: https://www.ostechnix.com/configure-ssh-key-based-authentication-linux/

作者:SK
选题:lujun9972
译者:LuuMing
校对:pityonline

本文由 LCTT 原创编译,Linux中国 荣誉推出


后记

感谢校对,除了空格的使用需要注意外,对于特殊内容应该使用` `来标记。

学习的两种心法

Posted on 2018-10-12 | Edited on 2019-04-18

1.将自己变复杂
关键字:类比 归纳 联想 总结
2.将自己变简单
关键字:死磕 致知 探索 深究
这两种心法在实际运用中不是非此即彼的,而在于一个度的把握。
二者共同的源泉是“纯粹”。

githubAPI

Posted on 2018-10-05 | Edited on 2019-04-18

使用 githubAPI 获取用户类型(个人/组织):

https://api.github.com/users/< name>

pip 的正确使用方法

Posted on 2018-10-03 | Edited on 2019-04-18

今天试着参加 github 上参与一个开源 python 项目。在使用 pip 工具时遇到坑:

  1. 将项目克隆下来后,在其上修改
  2. 使用 pip install 模块名 。
  3. 发现修改后并未奏效。
  4. 创建新的 python 环境安装,依旧未奏效。
  5. 使用 pip install grank --no-cache-dir 禁用缓存安装,未奏效。

辗转多次,最后才知道 pip install 是从网上下载安装,与本地无关。
解决办法:
在一般的 python 模块中,项目根目录下会有 setup.py,requirements.txt。执行 pip install -r requirements.txt安装必要包。使用python setup.py install 从本地目录进行安装即可。

123…6

LuMing

57 posts
3 categories
11 tags
GitHub E-Mail
© 2020 LuMing
Powered by Hexo v3.9.0
|
Theme – NexT.Muse v6.3.0