分类 技术 下的文章

以下是一个简单的编程项目,能够帮助你开始学习 Tcl/Tk。

探索 Tcl/Tk 的基础构造,包括用户输入、输出、变量、条件评估、简单函数和基础事件驱动编程。

我写这篇文章的初衷源于我想更深入地利用基于 Tcl 的 Expect。这让我写下了以下两篇文章:通过编写一个简单的游戏学习 Tcl通过编写一个简单的游戏学习 Expect

我进行了一些 Ansible 自动化工作,逐渐积累了一些本地脚本。有些脚本我频繁使用,以至于以下循环操作变得有些烦人:

  • 打开终端
  • 使用 cd 命令跳转至合适的目录
  • 输入一条带有若干选项的长命令启动所需的自动化流程

我日常使用的是 macOS。实际上我更希望有一个菜单项或者一个图标,能够弹出一个简单的界面接受参数并执行我需要的操作,这就像在 Linux 的 KDE 中一样

经典的 Tcl 类书籍都包含了关于流行的 Tk 扩展的文档。既然我已经深入研究了这个主题,我尝试着对其(即 wish)进行编程。

虽然我并非一名 GUI 或者前端开发者,但我发现 Tcl/Tk 脚本编写的方式相当直接易懂。我很高兴能重新审视这个 UNIX 历史的古老且稳定的部分,这种技术在现代平台上依然有用且可用。

安装 Tcl/Tk

对于 Linux 系统,你可以按照下面的方式安装:

$ sudo dnf install tcl
$ which wish
/bin/wish

而在 macOS 上,你可以通过 Homebrew 来安装最新版的 Tcl/Tk:

$ brew install tcl-tk
$ which wish
/usr/local/bin/wish

编程理念

许多编写游戏的教程都会介绍到典型的编程语言结构,如循环、条件判断、变量、函数和过程等等。

在此篇文章中,我想要介绍的是 事件驱动编程。当你的程序使用事件驱动编程,它会进入一个特殊的内置循环,等待特定的事件发生。当这个特定的事件发生时,相应的代码就会被触发,产生预期的结果。

这些事件可以包括键盘输入、鼠标移动、点击按钮、定时器触发,甚至是任何你的电脑硬件能够识别的事件(可能来自特殊的设备)。你的程序中的代码决定了用户看到了什么,以及程序需要监听什么输入,当这些输入被接收后程序会怎么做,然后进入事件循环等待输入。

这篇文章的理念并没有脱离我之前的 Tcl 文章太远。这里最大的不同在于用 GUI 设置和用于处理用户输入的事件循环替代了循环结构。其他的不同则是 GUI 开发需要采取的各种方式来制作一个可用的用户界面。在采用 Tk GUI 开发的时候,你需要了解两个基础的概念: 部件 widget 几何管理器 geometry manager

部件是构成可视化元素的 UI 元素,通过这些元素用户可以与程序进行交互。这其中包括了按钮、文本区域、标签和文本输入框。部件还包括了一些选项选择,如菜单、复选框、单选按钮等。最后,部件也包括了其他的可视化元素,如边框和线性分隔符。

几何管理器在放置部件在显示窗口中的位置上扮演着至关重要的角色。有一些不同的几何管理器可以供你使用。在这篇文章中,我主要使用了 grid 几何来让部件在整齐的行中进行布局。我会在这篇文章的结尾地方解释一些几何管理器的不同之处。

用 wish 进行猜数字游戏

这个示例游戏代码与我其他文章中的示例有所不同,我将它分解为若干部分以方便解释。

首先创建一个基本的可执行脚本 numgame.wish

$ touch numgame.wish
$ chmod 755 numgame.wish

使用你喜欢的文本编辑器打开此文件,输入下列代码的第一部分:

#!/usr/bin/env wish
set LOW 1
set HIGH 100
set STATUS ""
set GUESS ""
set num [expr round(rand()*100)]

第一行定义了该脚本将通过 wish 执行。接下来,创建了几个全局变量。这里我使用全部大写字母定义全局变量,这些变量将绑定到跟踪这些值的窗口小部件(LOWHIGH等等)。

全局变量 num 是游戏玩家要猜测的随机数值,这个值是通过 Tcl 的命令执行得到并保存到变量中的:

proc Validate {var} {
    if { [string is integer $var] } {
        return 1
    }
    return 0
}

这是一个验证用户输入的特殊函数,它只接受整数并拒绝其他所有类型的输入:

proc check_guess {guess num} {
    global STATUS LOW HIGH GUESS

    if { $guess < $LOW } {
        set STATUS "What?"
    } elseif { $guess > $HIGH } {
        set STATUS "Huh?"
    } elseif { $guess < $num } {
        set STATUS "Too low!"
        set LOW $guess
    } elseif { $guess > $num } {
        set STATUS "Too high!"
        set HIGH $guess
    } else {
        set LOW $guess
        set HIGH $guess
        set STATUS "That's Right!"
        destroy .guess .entry
        bind all <Return> {.quit invoke}
    }

    set GUESS ""
}

这是主要的猜数逻辑循环。global 语句让我们能够修改在文件开头创建的全局变量(关于此主题后面将会有更多解释)。这个条件判断寻找入力范围在 1 至 100 之外以及已经被用户猜过的值。有效的猜测和随机值进行比较。LOWHIGH 的猜测会被追踪,作为 UI 中的全局变量进行报告。在每一步,全局 STATUS 变量都会被更新,这个状态信息会自动在 UI 中显示。

对于正确的猜测,destroy 语句会移除 “Guess” 按钮以及输入窗口,并重新绑定回车键,以激活 “Quit” 按钮。

最后的语句 set GUESS "" 用于在下一个猜测之前清空输入窗口。

label .inst -text "Enter a number between: "
label .low -textvariable LOW
label .dash -text "-"
label .high -textvariable HIGH
label .status -text "Status:"
label .result -textvariable STATUS
button .guess -text "Guess" -command { check_guess $GUESS $num }
entry .entry -width 3 -relief sunken -bd 2 -textvariable GUESS -validate all \
    -validatecommand { Validate %P }
focus .entry
button .quit -text "Quit" -command { exit }
bind all <Return> {.guess invoke}

这是设置用户界面的部分。前六个标签语句在你的 UI 上创建了不同的文本展示元素,-textvariable 选项监控给定的变量,并自动更新标签的值,这展示了全局变量 LOWHIGHSTATUS 的绑定。

button 行创建了 “Guess” 和 “Quit” 按钮, -command 选项设定了当按钮被按下时要执行的操作。按下 “Guess” 按钮执行了上面的 check_guess 函数以检查用户输入的值。

entry 部件更有趣。它创建了一个三字符宽的输入框,并将输入绑定到 GUESS 全局变量。它还通过 -validatecommand 选项设置了验证,阻止输入部件接收除数字以外的任何内容。

focus 命令是用户界面的一项改进,使程序启动时输入部件处于激活状态。没有此命令,你需要先点击输入部件才可以输入。

bind 命令允许你在按下回车键时自动点击 “Guess” 按钮。如果你记得 check_guess 中的内容,猜测正确之后会重新绑定回车键到 “Quit” 按钮。

最后,这部分设定了图形用户界面的布局:

grid .inst
grid .low .dash .high
grid .status .result
grid .guess .entry
grid .quit

grid 几何管理器被逐步调用,以逐渐构建出预期的用户体验。它主要设置了五行部件。前三行是显示不同值的标签,第四行是 “Guess” 按钮和 entry 部件,最后是 “Quit” 按钮。

程序到此已经初始化完毕,wish shell 进入事件循环,等待用户输入整数并按下按钮。基于其在被监视的全局变量中找到的变化,它会更新标签。

注意,输入光标开始就在输入框中,而且按下回车键将调用适当且可用的按钮。

这只是一个初级的例子,Tcl/Tk 有许多可以让间隔、字体、颜色和其他用户界面方面更具有吸引力的选项,这超出了本文中简单 UI 的示例。

运行这个应用,你可能会注意到这些部件看起来并不很精致或现代。这是因为我正在使用原始的经典部件集,它们让人回忆起 X Windows Motif 的时代。不过,还有一些默认的部件扩展,被称为主题部件,它们可以让你的应用程序有更现代、更精致的外观和感觉。

启动游戏!

保存文件之后,在终端中运行它:

$ ./numgame.wish

在这种情况下,我无法给出控制台的输出,因此这里有一个动画 GIF 来展示如何玩这个游戏:

用 Wish 编写的猜数游戏

进一步了解 Tcl

Tcl 支持命名空间的概念,所以在这里使用的变量并不必须是全局的。你可以把绑定的部件变量组织进不同的命名空间。对于像这样的简单程序,可能并不太需要这么做。但对于更大规模的项目,你可能会考虑这种方法。

proc check_guess 函数体内有一行 global 代码我之前没有解释。在 Tcl 中,所有变量都按值传递,函数体内引用的变量的范围是局部的。在这个情况下,我希望修改的是全局变量,而不是局部范围的版本。Tcl 提供了许多方法来引用变量,在执行堆栈的更高级别执行代码。在一些情况下,像这样的简单引用可能带来一些复杂性和错误,但是调用堆栈的操作非常有力,允许 Tcl 实现那些在其他语言中实现起来可能较为复杂的新的条件和循环结构。

最后,在这篇文章中,我没有提到几何管理器,它们用于以特定的顺序展示部件。只有被某种几何管理器管理的部件才能显示在屏幕上。grid 管理器相当简洁,它按照从左到右的方式放置部件。我使用了五个 grid 定义来创建了五行。另外还有两个几何管理器:place 和 pack。pack 管理器将部件围绕窗口边缘排列,而 place 管理器允许固定部件的位置。除这些几何管理器外,还有一些特殊的部件,如 canvastextpanedwindow,它们可以容纳并管理其他部件。你可以在经典的 Tcl/Tk 参考指南,以及 Tk 命令 文档页上找到这些部件的全面描述。

继续学习编程

Tcl 和 Tk 提供了一个简单有效的方法来构建图形用户界面和事件驱动应用程序。这个简单的猜数游戏只是你能用这些工具做到的事情的起点。通过继续学习和探索 Tcl 和 Tk,你可以打开构建强大且用户友好的应用程序的无数可能性。继续尝试,继续学习,看看你新习得的 Tcl 和 Tk 技能能带你到哪里。

(题图:MJ/40621c50-6577-4033-9f3c-8013bd0286f1)


via: https://opensource.com/article/23/4/learn-tcltk-wish-simple-game

作者:James Farrell 选题:lkxed 译者:ChatGPT 校对:wxy

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

当你的桌面系统缺乏网络摄像头和专用麦克风时,你可以考虑使用智能手机。这里将教你如何在 Ubuntu Linux 中完成这个设置。

我和许多 Linux 用户一样,使用的是台式机。相较于笔记本电脑,并没有预装摄像头和麦克风。

若要获得与现代智能手机相媲美的画质,你可能需要购买一款高端的网络摄像头。

在此教程中,我将逐步指导你如何将你的手机用作麦克风和摄像头,这将非常适用于在线会议场景。

Ubuntu 下使用手机的摄像头和麦克风

? 本教程采用第三方网站 https://vdo.ninja/ 来托管音频和视频,因此,这并不是一项完全的开源方案。

我将指引你完成以下步骤:

  • 安装 OBS (如果你还未安装)
  • 通过 vdo.ninja 生成邀请链接
  • 设置虚拟音频线缆(用于音频输出)
  • 配置 OBS 以便从 vdo.ninja 重定向音视频流

首先,我们来看第一步。

? 虽然本教程是在 Ubuntu 系统下完成的,但我相信,这些同样可以在其他 Linux 发行版上实现。你只需为你的发行版安装所需的包即可。你可以自行尝试,看看效果如何。

1、在 Ubuntu 中安装 OBS

OBS(Open Broadcaster Software)是众多用于录制和直播视频的优秀软件之一,许多直播者都选择使用 OBS 在各个数字化平台进行直播。

幸运的是,OBS 已经包含在 Ubuntu 的默认仓库中,你可以通过以下命令来安装:

sudo apt install obs-studio

2、通过 VDO.ninja 生成直播邀请

在这一节,我将教你如何在 vdo.ninja 上生成一个直播邀请,进而从你的手机上开始直播音频和视频。

首先,访问 VDO.ninja 并点击 “ 创建可重用的邀请 Create Reusable Invite ”:

接下来你会看到很多选项,包括质量设置,添加视频效果等。我推荐你使用默认设置,因为高质量视频需要更快的处理速度和更多的带宽。

为了创建一个链接,你只需要点击 “ 生成邀请链接 GENERATE THE INVITE LINK ” 按钮:

完成后你会看到:

  • 你需要用你的手机扫描的二维码(当然,你也可以选择使用链接)。
  • OBS 的链接。

稍后我会在本教程中继续介绍 OBS 配置,所以请暂时别关闭这个窗口。

首先,用你的手机扫描二维码,它会将你跳转到 VDO.ninja 的另一个页面,此时你需要:

  • 选择 “ 共享你的相机 Share your Camera ” 选项。
  • 在视频源中选择使用前置或后置摄像头(默认为前置)。
  • 点击 “ 开始 Start ” 按钮后,它将开始在 OBS 连接的页面上进行直播。

3、在 Ubuntu 上为 OBS 配置虚拟线缆

? 这种设置方法仅适用于 PulseAudio,并且在重启系统后虚拟线缆将被撤销。

首先,我们来解释一下“ 虚拟线缆 virtual cable ”的概念,以及为何我们需要它来将手机做为摄像头和麦克风使用。

虚拟线缆是一种用于将音频流从一个应用传输到另一个应用的软件。

然而遗憾的是,它只支持 Windows 和 macOS。

啥?!那我为什么还要介绍这个呢?

答案其实很简单。我找到了一种变通方法,你可以在当前的会话中获得与虚拟线缆类似的功能。

要设置虚拟线缆,首先需要使用以下命令加载 module-null-sink 模块:

pactl load-module module-null-sink sink_name=Source

然后,执行下面的命令创建一个名为 VirtualMic 的虚拟音源:

pactl load-module module-virtual-source source_name=VirtualMic master=Source.monitor

这两个命令将返回一些数字,但无需对其过多关注。

接下来,前往系统“ 设置 Settings ”,找到“ 声音 Sound ”部分的设置:

然后进入 “ 输入 Input ” 部分,在此你会找到选择输入设备的选项。

将 “VirtualMic” 设为输入设备:

这样就设置完了!

不过,如我之前所述,一旦你重启电脑,虚拟音频的设置就会被撤销,如果你打算经常使用手机作为摄像头和麦克风,这可能会造成一定的不便。

为了解决这个问题,你可以为这两个命令 创建别名,例如,为命令创建别名:vc1vc2

完成后,你就可以像这样 一次执行两个命令vc1 && vc2

4、配置 OBS 从手机直播音视频

开始阶段,你需要打开我之前告诉你不要关闭的 VDO.ninja 标签页,并复制 OBS 链接:

然后启动 OBS,在 “ Sources ” 区域你会看到一个 “➕(加号)”按钮,点击这个按钮并选择 “ 浏览 Browser ”。

接着会弹出一个对话框,让你创建或选择一个源,你只需按下 “OK” 按钮即可:

最后,将已经复制的链接粘贴进 “URL” 字段:

然后你将能看到 OBS 正在使用你手机的摄像头:

不过为了从你的手机接收音频,还有一些额外步骤需要执行。

首先,在菜单中点击 “ 文件 File ” 并选择 “ 设置 Settings ”:

在出现的设置选项中选择 “ 音频 Audio ”,然后寻找到 “ 高级 Advanced ” 区域。

在 “高级” 区域里,你能找到 “ 监控设备 Monitoring Device ” 的选项,这里你需要选择 “Source Audio/Sink sink”:

点击 “ 应用 Apply ” 保存更改。

对于大部分用户,此时音频应该已经能够正常工作了。如果你的音频依然无法工作,那么你可以按照以下步骤操作。

在 “ 音频混音器 Audio Mixer ” 区域,可能显示的是 “ 浏览 Browser ” 或 “ 桌面音频 Desktop Audio ”,也可能两者都显示。

点击 “桌面音频” 或 “浏览” 旁边的三个点(在我这个例子中,是 “桌面音频”),并选择 “ 高级音频属性 Advanced Audio Properties ”:

然后,对于 “浏览” 和 “桌面音频”,都选择 “ 监控和输出 Monitor and Output ”:

这样就可以了!现在你可以从你的手机上享受摄像头和麦克风的功能了。

5、测试所有设置

为了测试这个设置,我在我们读书俱乐部的周会上用我的手机做为摄像头和麦克风,效果极佳。

你可以看到,上图显示摄像头和麦克风都在正常工作,这真的让我笑容满面 ?。

视频质量会取决于你的网络带宽,所以在开始重要的会议前,确保你有稳定的网络连接。

结语

作为一个没有摄像头和麦克风的台式计算机用户,我必须依靠笔记本或手机来参加工作会议,这让我感到非常烦躁。

需要注意的是,每次重启机器后,你都需要重新配置虚拟线缆,但这并不费时,因为只需要执行两条命令即可。

我已经多次使用这种解决方案,每一次都顺利运行。我真的希望你也能得到同样的结果。

(题图:MJ/223b56b7-ffcc-4311-bfa6-8a25bfd5ad11)


via: https://itsfoss.com/ubuntu-phone-camera-mic/

作者:Sagar Sharma 选题:lujun9972 译者:ChatGPT 校对:wxy

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

体验带有持久化的立付 U 盘,你在立付会话中做出的所有改动都会被保存。在此教程中,你将学习如何创建一个持久化的 U 盘。

如果我告诉你,你能将完整的 Ubuntu 系统装载在一个可移动的 U 盘上,你会有何感想?

在外置 U 盘上 安装 Ubuntu 过程相当复杂。一种更容易的方法是制作一个带有持久化存储的 立付 Live U 盘,这样你对 U 盘做出的改动都会被保存下来。

请相信我,这个过程跟使用 BalenaEtcher 或其他任何刻录工具创建可引导驱动器的过程十分相似。

然而,我们在开始之前,让我们先弄清楚持久化立付 U 盘是什么。

什么是持久化立付 U 盘?

当你使用立付 Linux U 盘时,你在 立付会话 Live session 中做出的所有更改,在重启以后都将丢失。比如,你必须重新连接 Wi-Fi,并且你下载的文件及安装的应用均不会被保留。而持久化立付 U 盘将会为你保存这些所有的更改。

这样,你就可以将该 U 盘作为一个外置操作系统使用,它将会保存你所做出的所有更改,比如创建用户账号,安装软件包,和一切你通常在电脑上做的事情。

当然,保存的文件数量将取决于你使用的 U 盘的大小!

但你已经明白我要表达的意思了吧。那么,我们开始学习如何创建一个带有持久性的 Ubuntu 立付 U 盘吧。

如何创建一个持久化的 Ubuntu U 盘

在这个教程中,我将引导你完成一个持久化的 Ubuntu U 盘的制作过程:

  • 通过在 Windows 上的 Rufus 工具
  • 或者,通过在 Linux 上的 mkusb 工具

你可以参照教程中的适合你的部分。

? 本教程中,你将会创建一个 Ubuntu 的持久化 U 盘。并非所有的 Linux 发行版都支持数据的持久化存储,所以这个方法可能并非所有的发行版本适用。

方法 1:在 Windows 上创建持久化的 Ubuntu U 盘

在 Windows 上创建一个持久化的 Ubuntu U 盘,我会使用 Rufus,这是一款自由开源工具,专门用于将 ISO 文件刻录到 U 盘上。

请访问 Rufus 的官方下载页面,获取 Windows 版本的可执行文件:

然后,打开 Rufus,它将要求以管理员身份运行;请授予该权限,因为你即将在外部驱动器上做改动,需要相应的权限。

接下来,根据以下步骤使用 Rufus 创建持久化 U 盘:

  • 选中 U 盘设备(如果只有一个 U 盘,它将默认被选中)。
  • 点击 “ 选择 Select ” 按钮,在文件管理器中选择 ISO 文件。
  • 你可以使用滑块或直接设定持久化分区的大小(可以放心地设定为最大值)。
  • 其他选项保持默认设置(除非你清楚在做什么)。
  • 点击 “ 开始 Start ” 按钮,开始进行刻录。

该程序你会告诉你,选中的驱动器上的所有数据将会被删除,所以你可以放心忽略这个警告。

完成后,我们可以来瞧瞧如何在 Windows 中直接启动到 UEFI 设置。

通过 U 盘启动(简化版)

这个方法应适用于大多数用户,如果无效,你总是可以选择传统的方式,那就是重新启动系统并按下 EscDeleteF1F2F10F11F12 等按键。

步骤如下:按 Win + X,然后以管理员身份启动 Windows PowerShell:

一旦你看见提示符,直接运行以下命令:

shutdown.exe /r /fw

这将会计划一个关机动作,稍后,你会进入到 UEFI 固件设置。

到了这步,选择 U 盘作为首选的启动选项并保存设置:

你会看到一个正常的 GRUB 屏幕:

当你启动后,选择试用 Ubuntu 的选项,然后你所做的任何改动都可以被保存下来,即使你重新启动了电脑也无所谓。

方法 2:在 Ubuntu Linux 上创建持久化 Ubuntu U 盘

? 请注意,这种方法主要适用于 Ubuntu 和 Debian 的 ISO。

如果你还不知道,mkusb 是一个带有 GUI 的工具,让你能够将 ISO 文件刷到磁盘驱动器上,并且有附加功能,例如在 Ubuntu 上创建持久化驱动器。

你需要添加 mkusb 的 PPA 来进行安装,具体命令如下:

sudo add-apt-repository ppa:mkusb/ppa

要使改变生效,需要更新软件库索引:

sudo apt update

最后,安装 mkusb 以及其他相关软件包:

sudo apt install --install-recommends mkusb mkusb-nox usb-pack-efi

就这样!

首先,从系统菜单启动 mkusb 工具,它会提示你输入超级用户密码:

操作完成后,它会提示你所有驱动器上的数据将会被新数据覆盖。

只需简单地点击 “OK” 按钮即可:

然后它会显示 mkusb 工具能执行的多项操作,你需要选择第一选项 “ 安装(制作一个启动设备) Install (make a boot device) ”:

接下来,它会显示许多安装选项,你需要选择第三个选项 “ 持久化立付(仅针对 Debian 和 Ubuntu) 'Persistent live' - only Debian and Ubuntu ”:

在下一个步骤中,它会让你在多种方法/工具中选择一个,如果没有使用特定类型的版本,例如超精简版本,建议使用第一个名为 “dus-Iso2usb” 的方法:

接着,它会让你从文件管理器中选择你需要的 ISO 文件:

工具会显示已选 ISO 文件的名称,以及创建持久化 U 盘所要使用的工具:

下一步,你需要选择驱动器将之前选择的 ISO 文件刷入:

以上全部完成后,将会有 3 个选项供你选择。如果你不确定使用哪一个,那么就点击 “ 使用默认 Use defaults ” 按钮,但是大多数用户选择第二个选项 “grold” 即可(我也是选择这个):

检查一切都无误后,点击 “ 开始 Go ” 开始刷新过程:

现在,刷入过程已经开始了!

注意,这个刷入过程会比你使用 BalenaEtcher 刷入要长一些时间!

完成后,会有通知告诉你,过程已经完成,此时你可以取下 U 盘,然后重新插上,以查看更改的内容:

从持久化 U 盘启动

如果你要从 U 盘启动,通常可以重启你的系统,连续按下对应的按钮即可,但这已经是旧方法了!

在 Linux 中,有一种更为简便的方式访问 BIOS,你只需在终端执行以下命令:

systemctl reboot --firmware-setup

然后,进入启动菜单并将 U 盘设置为首选的启动选项:

一旦你从 U 盘启动,你将有两个选项:

  • 带有持久化模式的 ISO
  • 以实时模式进行启动

如其名,你需要选择第一个选项以启动进入 Ubuntu 的持久化模式:

现在,你可以进行各种修改,如安装你喜欢的软件包,创建新用户 等等!

我希望这个指南对你有所帮助。

(题图:MJ/423c72d6-d6eb-4146-acd5-1e58eed11f41)


via: https://itsfoss.com/ubuntu-persistent-live-usb/

作者:Sagar Sharma 选题:lujun9972 译者:ChatGPT 校对:wxy

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

我们过去写过几篇文章来查找映射到块设备/磁盘的 LUN ID,但是当你管理 VCS 集群时,在某些情况下你可能需要映射 LUN 用于 VxFS 文件系统扩展的 VxVM(Veritas 卷管理器)磁盘的 ID。

这篇短文介绍了如何在 Linux 中查找与 VxVM 磁盘关联的 LUN 号。

推荐阅读:

在 Linux 中查找映射到 VxVM 磁盘的 LUN 号的 Shell 脚本

这个方便的 Shell 脚本可帮助你识别哪个存储 LUN 与 Linux 上的哪个 VxVM 磁盘关联。

这个脚本是如何工作的

该脚本按照以下步骤收集和打印这些信息。

  • 它收集系统上活动 “磁盘组”(DG)的列表
  • 查找与相应 DG 关联的 “设备名称”。
  • 接下来,它列出了与各个设备映射的 “块设备”。
  • 最后收集与这些块设备关联的 LUN ID 并将它们全部打印在一起,如 DG 名称、块设备名称和 LUN 编号。
vi VxVM_disk_mapping_with_LUN_number.sh
#!/bin/bash
###########################################################
# Purpose: Mapping LUN Number to VxVM Disk in Linux
# Author: 2DayGeek
# Version: v1.0
###########################################################

echo "DG_Name           Block_Device            LUN_Number"
echo "-------------------------------------------------------------------"
for dg_name in `vxdg list | awk '{print $1}' | grep -v NAME`
do
  for d_name in `vxdisk -e list | grep -i $dg_name | awk '{print $1}'
  do
    for b_device in `vxdisk list $d_name | grep -w state=enabled | awk '{print $1}' | head -1`
    do
      echo "$dg_name --> $b_device --> $(lsscsi --scsi | grep $b_device | awk '{print $NF}'"
    done
  done
done | column -t

设置 Shell 脚本文件的可执行权限。

chmod +x VxVM_disk_mapping_with_LUN_number.sh

最后执行脚本查看结果。

sh VxVM_disk_mapping_with_LUN_number.sh

你的输出将类似于此。但是,DG 名称、块设备和 LUN 会与此不同。

如果你想即时运行上述脚本,请使用下面的单行脚本。

# for dg_name in `vxdg list | awk '{print $1}' | grep -v NAME`; do for d_name in `vxdisk -e list | grep -i $dg_name | awk '{print $1}'; do for b_device in `vxdisk list $d_name | grep -w state=enabled | awk '{print $1}' | head -1`; do echo "$dg_name --> $b_device --> $(lsscsi --scsi | grep $b_device | awk '{print $NF}'"; done; done; done | column -t
apachedg   -->  sde -->  3600d0230000000000e11404639558823
apachedg   -->  sdf -->  3600d0230000000000e11404639558824
apachedg   -->  sdg -->  3600d0230000000000e11404639558825
sftpdg     -->  sdh -->  3600d0230000000000e11404639558826
sftpdg     -->  sdi -->  3600d0230000000000e11404639558827

总结

在本教程中,我们向你展示了如何在 Linux 中查找与 VxVM 磁盘映射的 LUN 号。

如果你有任何问题或反馈,请随时在下面发表评论。

(题图:MJ/251ada36-41d9-4a1b-b857-a1def52f27f2)


via: https://www.2daygeek.com/find-san-lun-mapping-with-vxvm-disk-veritas-linux/

作者:Prakash Subramanian 选题:lujun9972 译者:geekpi 校对:wxy

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

在某些情况下,你需要映射存储 LUN(逻辑单元号)、块设备、LVM(LV 和 VG 名称)和文件系统(FS)信息以进行文件系统扩展或灾难恢复(DR)操作。

这是大多数 Linux 管理员的例行活动,我们通常使用一些脚本来显示针对 SAN LUN 的块设备映射,然后我们将手动添加 LVM 和文件系统信息来完成操作。

今后,你无需手动干预此活动,因为这些信息可以通过 Shell 脚本进行映射,如下所示。

参考以下类似文章:

在 Linux 中映射 LUN、磁盘、LVM 和文件系统的 Shell 脚本

这个 Shell 脚本可帮助你识别哪些 SAN 磁盘映射到 Linux 上的哪些块设备、LV、VG 和文件系统。

请注意: 我们排除了 sda 磁盘,因为这是操作系统(OS)盘,它有多个分区。

vi block_device_mapping_with_LUN_FS_LVM.sh
#!/bin/bash
for bdevice in `lsblk | grep disk | awk '{print $1}' | grep -v 'sda'`; do
    for mpoint in `lsblk /dev/$bdevice | grep lvm | awk '{print $NF}'`; do
        LVM_INFO=`lvs -o +devices | grep -i $bdevice | awk '{print $1,$2}'`
        LUN_ID=`lsscsi --scsi | grep $bdevice | awk '{print $NF}'`
        echo "$bdevice --> $mpoint --> $LVM_INFO --> $LUN_ID"
    done
done

设置 block_device_mapping_with_LUN_FS_LVM.sh 文件的可执行权限。

chmod +x block_device_mapping_with_LUN_FS_LVM.sh

最后运行脚本查看结果。

sh block_device_mapping_with_LUN_FS_LVM.sh

注意: 在上面的输出中,设备 sdb 不会显示任何 LUN 信息,因为它是从 VMWare 端添加的虚拟磁盘,没有任何 LUN。其他 3 块磁盘是从存储映射的,这就是为什么可以看到 LUN 信息。

如果你想即时运行上述脚本,请使用下面的一行脚本。

for bdevice in `lsblk | grep disk | awk '{print $1}' | grep -v 'sda'`; do for mpoint in `lsblk /dev/$bdevice | grep lvm | awk '{print $NF}'`; do LVM_INFO=`lvs -o +devices | grep -i $bdevice | awk '{print $1,$2}'`; LUN_ID=`lsscsi --scsi | grep $bdevice | awk '{print $NF}'`; echo "$bdevice --> $mpoint --> $LVM_INFO --> $LUN_ID"; done; done
sdb --> [SWAP] --> swap2lv swapvg --> -
sdc --> /appserver --> appserver_lv appserver_vg --> 360000670000415600477312020662021
sdd --> /data --> data_lv data_vg --> 360000670000415600477312020662022
sde --> /backup --> backup_lv backup_vg --> 360000670000415600477312020662023

总结

在本教程中,我们向你展示了如何在 Linux 上检查 SAN 提供的 LUN 以及底层操作系统磁盘、LV 名称、VG 名称和关联的文件系统。

如果你有任何问题或反馈,请随时在下面发表评论。

(题图:MJ/f5da2270-4e5a-4b2c-8998-fae974214384)


via: https://www.2daygeek.com/map-san-lun-physical-disk-filesystem-lvm-info-linux/

作者:Rasool Cool 选题:lujun9972 译者:geekpi 校对:wxy

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

对于某些需求,你可能需要找到映射到逻辑单元号(LUN)和文件系统(FS)的块设备,以进行文件系统扩展或灾难恢复(DR)活动。

当你管理更大的基础设施时,类似的活动可能会经常发生。假设有超过 1000 台服务器托管各种应用。

参考以下类似文章:

在本文中,我们将向你展示如何在 Linux 中映射物理磁盘、存储 LUN 和文件系统(FS)。

将物理磁盘映射到 Linux 中的存储 LUN 和文件系统的 Shell 脚本

这个小 shell 脚本可帮助你识别哪些 SAN 磁盘映射到 Linux 上的哪些块设备和文件系统。

vi block_device_mapping_with_LUN_FS.sh
#!/bin/bash
for lunmap in `lsblk | grep disk | grep ^s | awk '{print $1}'`; do
   for mpoint in `lsblk /dev/$lunmpa | grep lvm | awk '{print $NF}'`; do
      echo "$lunmap --> $mpoint --> $(smartctl -a /dev/$lunmap | grep "Logical Unit id" | awk -F":" '{print $2}')"
   done
done

设置 block_device_mapping_with_LUN_FS.sh 文件的可执行权限。

chmod +x block_device_mapping_with_LUN_FS.sh

最后运行脚本查看结果。

sh block_device_mapping_with_LUN_FS.sh

注意: 在上面的输出中,设备 sda 不会显示任何 LUN 信息,因为它是从 VMWare 端添加的虚拟磁盘,没有任何 LUN。其他 3 个磁盘是从存储映射的,这就是我们能够看到 LUN 信息的原因。

如果你想即时运行该脚本,请使用下面的一行脚本。

for lunmap in `lsblk | grep disk | grep ^s | awk '{print $1}'`; do 
    for mpoint in `lsblk /dev/$lunmpa | grep lvm | awk '{print $NF}'`; do 
        echo "$lunmap --> $mpoint --> $(smartctl -a /dev/$lunmap | grep "Logical Unit id" | awk -F":" '{print $2}')"
    done
done
sda --> /
sda --> /usr
sda --> /opt
sda --> /tmp
sda --> /var
sda --> /home
sdb --> /data -->      0x3600d0230000000000e1140463955737c
sdc --> /app -->      0x3600d0230000000000e114046395577cd
sdd --> /backup -->      0x3600d0230000000000e11404639558cc5

总结

在本教程中,我们向你展示了如何在 Linux 上检查 SAN 提供的 LUN 以及底层操作系统磁盘和关联的文件系统。

如果你有任何问题或反馈,请随时在下面发表评论。

(题图:MJ/09a00c62-f6a1-48b0-bf43-dc1bcb3c7861)


via: https://www.2daygeek.com/map-san-lun-physical-disk-filesystem-linux/

作者:Rasool Cool 选题:lujun9972 译者:geekpi 校对:wxy

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