From 1923bfb7a5ac2a49ed5daebc8ec2496fbdf6c548 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 21:51:33 +0000 Subject: [PATCH] deploy: 7a6d87717650076e01aab9afd97e852a587a594a --- 404.html | 4 ++-- A-Labs/lab1.html | 4 ++-- A-Labs/lab2.html | 6 +++--- A-Labs/lab3.html | 4 ++-- A-Labs/lab4.html | 4 ++-- A-Labs/lab5.html | 4 ++-- A-Labs/lab6.html | 4 ++-- A-Labs/lab7.html | 4 ++-- A-Labs/lab8.html | 4 ++-- B-Assignments/assignment1.html | 4 ++-- B-Assignments/assignment2.html | 4 ++-- C-ExtraResources/bash-shell-reference-guide.html | 4 ++-- C-ExtraResources/bash-shell-scripting-tips.html | 4 ++-- C-ExtraResources/bash-shell-tips.html | 4 ++-- C-ExtraResources/python-scripting-tips.html | 4 ++-- C-ExtraResources/scripting-exercise.html | 4 ++-- C-ExtraResources/tips.html | 4 ++-- assets/js/9af68f33.4f295be7.js | 1 - assets/js/9af68f33.f25e8a4f.js | 1 + .../{runtime~main.03c9e40a.js => runtime~main.7167277b.js} | 2 +- index.html | 4 ++-- sw.js | 2 +- weekly-schedule.html | 4 ++-- 23 files changed, 42 insertions(+), 42 deletions(-) delete mode 100644 assets/js/9af68f33.4f295be7.js create mode 100644 assets/js/9af68f33.f25e8a4f.js rename assets/js/{runtime~main.03c9e40a.js => runtime~main.7167277b.js} (98%) diff --git a/404.html b/404.html index 7bc2e15..43b7e99 100644 --- a/404.html +++ b/404.html @@ -14,13 +14,13 @@ Page Not Found | OPS245 - Open System Server - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/A-Labs/lab1.html b/A-Labs/lab1.html index 140c0a1..4d7d93c 100644 --- a/A-Labs/lab1.html +++ b/A-Labs/lab1.html @@ -14,7 +14,7 @@ Lab 1 | OPS245 - Open System Server - + @@ -48,7 +48,7 @@ When enabled, AppArmor confines programs according to a set of rules that specify what files a given program can access. This goes beyond the traditional protection of file system permissions and helps protect the system against both known and unknown vulnerabilities.

Some of the tasks we will be doing may require additional and tedious steps to configure AppArmor to not prevent our changes. So for the purposes of this course we will disable AppArmor. It is quite safe to do so because we are operating in a VM so our host is not visible to the public Internet.

Investigation 3: Using Shell Commands to Generate System Information

It is very common for system administrators to keep records regarding their installed computer systems. For example, it is necessary to have a record of all the hardware information for each machine in order to help fix computer hardware problems, and to assist when purchasing additional consistent computer hardware.

Therefore, it makes sense to also have a record of the installed software and important system configurations as well. This can contain information regarding the Linux operating system, installed software, and network connectivity information.

Perform the Following Steps:

  1. Refer to the table below for common system information utilities and explanations for each.
  2. Run each of these commands, taking the time to understand what each command's output means.
  3. Record the output from these commands (except for the ps -ef output) in your lab logbook.

The Bash Shell Reference Guide is available to refresh your memory of last semester's ULI101.

Linux/Unix System Information Utilities

Command(s)Purpose
uname -rv, hostname, ps -efBasic Linux OS information such as kernel version, host-name of Linux server, and all processes that are running on the system after installation.
ip address show, ip route show, nslookup (at prompt, enter command: server)Obtain network connectivity confirmation including: IP ADDRESS, Netmask, routing (default gateway), and the default Domain Name Server.
date +'%A %B %d, %Y (%I:%M %p)'Get the current date and time according to the system. (If the date or time do not match your timezone, fix this in system settings for debhost!)
  1. Note that when you are done, you should have recorded the following information in your Lab Logbook:

  2. Review what you just wrote in your Lab Logbook. You should be able to understand them because you just put that content there, but what would this look like if you look at it several months from now? Make sure it's clear to future-you!

Answer Investigation 3 observations (all parts and questions) in your lab log book.

Investigation 4: Using BASH Scripting to Generate System Information Reports

You may have learned about creating and running Bash Shell Scripts in your ULI101 course. Shell scripts help Linux users and system administrators to automate repetitive tasks to become more efficient and to help them save time. We can take what we have learned from the commands above and put them into a bash script to generate information reports for your newly-installed Linux host machine.

  1. Create a new file in your ~/bin directory called myreport.bash
  2. Populate the beginning of the file with sh-bang line and block comment describing what this script does:
#!/usr/bin/bash
# Author: *** INSERT YOUR NAME ***
# Date: *** CURRENT DATE ***

# Purpose: Creates system info report
# USAGE: ./myreport.bash
  1. Add a line that will print out the heading System Report
echo 'System Report'
  1. Save your script and run it. Does it work?
  2. You'll notice that the script is currently sending its output to your terminal (STDOUT). We can just use output redirection on the command line when you run the script to send the output to ~/bin/sysreport.txt.
  3. Open your script in a text editor (like vim) again, and add the following lines below the echo statement:
# Print a heading for the date command output
date=$(date +'%A %B %d, %Y (%I:%M %p)')
echo "Report Date: $date"
  1. Save your script and run it again. Observe the output?

  2. Based on the previous investigation and output, add the extra commands for your script to also output (with appropriate headings):

  3. Run your script to make sure it works. Note that the output does not need to match investigation 3 exactly, but it should be very close.

  4. What other commands and information could we document? Perhaps a list of storage devices, partitions and mount points?

Lab 1 Sign-Off

Follow your Professors submission instructions for lab 1 on Blackboard.

Shell scripting is so essential for Linux administration that this course has created a shell script for every lab for this course that a student must download and run in order to check their work.

If you have performed the lab correctly, then you will get a series of OK messages and you can proceed with the SIGN-OFF for lab1.

On the other hand, if there were errors, then a WARNING message will appear with general suggestions that you will need to fix on your debhost VM in order to have your professor sign-off on this lab. Your lab should be correct before moving to Lab 2.

Perform the Following Steps:

  1. Make certain that your debhost VM is running, open the Bash Shell terminal.
  2. Change to the ~/bin directory.
  3. Download the checking script by issuing the following Linux command:
wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab1-check.bash
  1. Give that downloaded shell script file execute permissions (for the file owner).
  2. Run the shell script using sudo and if there are any warnings, make fixes and re-run shell script until you receive a "congratulations" message.
  3. Arrange evidence (command output) for each of these items on your screen:

Practice For Quizzes, Tests, Midterm & Final Exam

  1. Define the term Virtual Machine.
  2. List the major screens (steps) in the installation of Debian 12.
  3. What key-combination is used to toggle the view of your running VM from "window-mode" to "full-screen-mode"?
  4. List the steps for updating the Debian software.
  5. What is the home directory for the user "root"?
  6. How do you determine the host name of your GNU/Linux workstation?
  7. What command can display the NIC MAC address?
  8. What command is used to get a list of running processes on your newly-installed system?
  9. Write the Linux command to download the on-line file: http://linux.server.org/package.tar.gz
- + \ No newline at end of file diff --git a/A-Labs/lab2.html b/A-Labs/lab2.html index 75729fa..1eec764 100644 --- a/A-Labs/lab2.html +++ b/A-Labs/lab2.html @@ -14,12 +14,12 @@ Lab 2 | OPS245 - Open System Server - +
-
Skip to main content

Lab 2: Creating and Using Virtual Machines test2

Lab Preparation

Purpose / Objectives of Lab 2

In this lab, you will create 3 remaining virtual machines using another virtualisation program called KVM that will run in your debhost VM. These VMs will be used throughout the remainder of this course to learn how to administer them (installing software, managing services, networking, etc).

While you are performing this lab, it is recommended to generally note the major differences in the different installation methods, and which method you prefer to use if you were a Linux system administrator in charge of installing many Linux distributions for an organization.

Main Objectives

  • Installing additional Virtualisation Software on your debhost machine (KVM)

  • Create 3 separate VMs (virtual machines) using different installation methods:

    • deb1: Network Debian Installation (Graphical Desktop Environment)
    • deb2: Network Debian Installation (minimal install - CLI only)
    • deb3: Network Debian Unattended Installation deployed using a preseed file (CLI only)
  • Manipulate virtual machines by CLI (virsh)

  • Properly backup VM images and backup VM configuration files

  • Create and run Bash Shell scripts to automatically backup our installed VM's

Lab Environment

At the end of Lab 2, your hypervisor (VirtualBox or VMWare) application will contain 4 virtual machines (debhost in your hypervisor application, and deb1, deb2, deb3 VMs in your KVM application). You will now have the option to run one virtual machine at a time, or run all machines simultaneously to learn about networking (covered in later labs)

Minimum Required Materials

  1. Solid State Drive
  2. USB key (for backups)
  3. Lab2 Log Book
  4. Debian 12 netinst ISO

Linux Command Reference

Virtualization:

Installation Guides:

Miscellaneous

gzip , gunzipipgrepwcpwdlsmorefilewgetchmodvi

Investigation 1: Setup For Nested Virtual Machines

Part 1: Install KVM Virtualisation Application

We will now install the KVM package in order to create our remaining "nested" VMs. We will also be starting several services. We will learn more about managing firewalls in later labs.

Perform the following steps:

  1. Log into your debhost machine.
  2. perform a software update on your debhost VM by issuing the following command:
sudo apt update && sudo apt upgrade
  1. Install the qemu-system libvirt-daemon-system, virtinst, and virt-manager packages
sudo apt install qemu-system libvirt-daemon-system virtinst virt-manager

About KVM

There are actually several key programs installed for virtualisation using KVM:

  • kvm/qemu - the hypervisor and other hardware emulation systems.
  • A system service named libvirtd that manages the VMs.
  • A graphical tool for managing virtual machines (virt-manager) and the virsh command-line tool.
  1. Now we will confirm the status of the "libvirtd" virtualisation service:
sudo systemctl status libvirtd

libvirtdstatus

In the screenshot above you can see the first "enabled" indicates that this service will start automatically when the system starts. +

Lab 2: Creating and Using Virtual Machines

Lab Preparation

Purpose / Objectives of Lab 2

In this lab, you will create 3 remaining virtual machines using another virtualisation program called KVM that will run in your debhost VM. These VMs will be used throughout the remainder of this course to learn how to administer them (installing software, managing services, networking, etc).

While you are performing this lab, it is recommended to generally note the major differences in the different installation methods, and which method you prefer to use if you were a Linux system administrator in charge of installing many Linux distributions for an organization.

Main Objectives

  • Installing additional Virtualisation Software on your debhost machine (KVM)

  • Create 3 separate VMs (virtual machines) using different installation methods:

    • deb1: Network Debian Installation (Graphical Desktop Environment)
    • deb2: Network Debian Installation (minimal install - CLI only)
    • deb3: Network Debian Unattended Installation deployed using a preseed file (CLI only)
  • Manipulate virtual machines by CLI (virsh)

  • Properly backup VM images and backup VM configuration files

  • Create and run Bash Shell scripts to automatically backup our installed VM's

Lab Environment

At the end of Lab 2, your hypervisor (VirtualBox or VMWare) application will contain 4 virtual machines (debhost in your hypervisor application, and deb1, deb2, deb3 VMs in your KVM application). You will now have the option to run one virtual machine at a time, or run all machines simultaneously to learn about networking (covered in later labs)

Minimum Required Materials

  1. Solid State Drive
  2. USB key (for backups)
  3. Lab2 Log Book
  4. Debian 12 netinst ISO

Linux Command Reference

Virtualization:

Installation Guides:

Miscellaneous

gzip , gunzipipgrepwcpwdlsmorefilewgetchmodvi

Investigation 1: Setup For Nested Virtual Machines

Part 1: Install KVM Virtualisation Application

We will now install the KVM package in order to create our remaining "nested" VMs. We will also be starting several services. We will learn more about managing firewalls in later labs.

Perform the following steps:

  1. Log into your debhost machine.
  2. perform a software update on your debhost VM by issuing the following command:
sudo apt update && sudo apt upgrade
  1. Install the qemu-system libvirt-daemon-system, virtinst, and virt-manager packages
sudo apt install qemu-system libvirt-daemon-system virtinst virt-manager

About KVM

There are actually several key programs installed for virtualisation using KVM:

  • kvm/qemu - the hypervisor and other hardware emulation systems.
  • A system service named libvirtd that manages the VMs.
  • A graphical tool for managing virtual machines (virt-manager) and the virsh command-line tool.
  1. Now we will confirm the status of the "libvirtd" virtualisation service:
sudo systemctl status libvirtd

libvirtdstatus

In the screenshot above you can see the first "enabled" indicates that this service will start automatically when the system starts. The "preset: enabled" indicates that "enabled" is the default when this service is first installed by apt. The "inactive (dead)" indicates that the service is not currently running.

We want the service to be "enabled" and "active":

Make note of the following commands for working with services:

# To see the status of a service (Notice sudo isn't needed with a status check!)
systemctl status <servicename>

# To enable a service
sudo systemctl enable <servicename>

# To start a service
sudo systemctl start <servicename>

# To enable and start a service at the same time
sudo systemctl enable --now <servicename>

# To disable a service
sudo systemctl disable <servicename>

# To stop a service
sudo systemctl stop <servicename>

# To restart a service
sudo systemctl restart <servicename>
  1. Issue the correct commands to make sure that the "libvirtd" service is both "active" (started) and "enabled" (will start automatically at boot)

    caution The behaviour of the libvirtd service on Debian Linux is for the service to stop when not in use and restart when required.

  2. In order to manage VMs your user account needs to be added to the "libvirt" group

sudo usermod -aG libvirt <username>
  1. Restart your debhost virtual machine. If you fail to do this, you may experience virtualization network problems and issues loading Virtual Machine Manager.

  2. Once you've restarted, confirm your changes took affect by running the following as your regular user (don't use sudo):

  • systemctl status libvirtd
  • id

The libvirtd daemon should be running, and the id command should show that your user is part of the libvirt group.

  1. Start the graphical virt-manager tool by clicking "Activities " and searching for "virt-manager".
  2. Right click on the icon and "Pin to dash" and then run the application or by typing the command virt-manager (without sudo!)
  3. Confirm that "debhost" is configured to allow nested virtualisation:
  • If you have an Intel CPU, run the following command. The output of this command should be "Y":

    sudo cat /sys/module/kvm_intel/parameters/nested
  • If you have an AMD CPU, run the following command. The output of this command should be "1":

    sudo cat /sys/module/kvm_amd/parameters/nested
  1. If neither of these files outputs the Y or 1, or if you get a "No such file or directory" error, this means nested virtualization has not been successfully enabled on debhost.

Part 2: Troubleshooting Nested Virtualization

If you confirmed nested virtualization works in debhost in Part 1, Step 11 above, you can skip Part 2 and move on to Investigation 2.

Let's run through some common reasons why nested virtualization may not be working for your computer, and how to go about fixing them. Keep in mind, this is not an exhaustive list, and you may have more than one of these issues at the same time. Just because you fixed one doesn't mean there aren't other problems.

Important Warning: Nested virtualization is REQUIRED for this course.

  1. Double-check you haven't introduced any typos when running the commands from Part 1, Step 11.
  2. At the VMware Workstation level, open the settings for your debhost VM and check if Virtualize Intel VT-x/EPT or AMD-V/RDI is enabled. If not, enable it and try Part 1, Step 11 again. You'll need to fully shut down debhost to change this setting. (Refer to Lab 1, Investigation 1, Part 5, Step 26 for further details.)
  3. On non-Seneca, personal computers running Windows 11: If you get an error from VMware that "Virtualization is not supported" (or something similar), you will need to do a bit of online research to fix this issue, as we cannot officially provide tech support for non-Seneca hardware. That said, here are some good places to start:
    • In Windows' Device Security settings, disable Memory Integrity and any other Core Isolation protections. (You are doing so at your own risk.) Restart your computer.
    • In Windows Features, disable all Hyper-V related options. Restart your computer.
  4. On non-Seneca, personal computers running macOS: Due to hardware design limitations, nested virtualization is not possible for M1/M2/M3-based Apple computers at this time. However, nested virtualization will work if you have an older, Intel-based Mac. Check your system's profiler for more details.
  5. Ask your fellow classmates for help. Many others have run into this issue and they may be able to show you how to fix it!

Investigation 2: Install Nested Virtual Machines (KVM)

cautionKeep the root password the same for Host and VMs

In order to simplify running the lab checking scripts in future labs, using the same root password for ALL machines (debhost and virtual machines). Also use the same username and passwords for all of your machines (debhost and virtual machines).

Part 1: Setting up the Virtual Network

Once we have installed our 3 VM's we will want to configure them to be able to communicate on the same network. @@ -39,7 +39,7 @@ Please be patient, the VMs will shut down!

  • Create a directory for your backups. mkdir ~/backups

  • Enter the command virsh dumpxml deb1

    This command will output the xml data that is used to define (create) this VM If we save this output we could use that xml data to recreate the VM

  • Enter the command virsh dumpxml deb1 > ~/backups/deb1.xml to save a copy of the output.

  • Enter 2 more commands to save the xml data for deb2 and deb3

    Backing up the xml data only has to be done when the VM is created, or if the configuration is modified.

  • We will need to use elevated privileges to backup our disk image files from the default location of /var/lib/libvirt/images/

  • Use the command sudo -i and enter your password if prompted.

  • sudo -i will start a new shell as the root user, you can run a number of commands and then type exit to return to your previous shell.

    1. Change to the images directory: cd /var/lib/libvirt/images/. Note that you did not need to use sudo, as you are already using elevated permissions.

    2. Type ls -lh to see the contents

    3. To make a compressed copy of your deb1.qcow2, deb2.qcow2, and deb3.qcow2 files we will use the gzip command.

      The gzip command will compress the file in place and rename the file with a .gz extension. However, this will make the file unusable and doesn't create a copy. We will use STDIN and STDOUT redirection to overcome this.

    4. Issue the commands:

    gzip < deb1.qcow2 > ~YourRegularUsername/backups/deb1.qcow2.gz

    gzip < deb2.qcow2 > ~YourRegularUsername/backups/deb2.qcow2.gz

    gzip < deb3.qcow2 > ~YourRegularUsername/backups/deb3.qcow2.gz

    NOTE: Make certain to use the redirection signs "<" and ">" properly in the command!

    cautionPlease be patient

    It may look like the command prompt is stuck but it could take a while for gzip to compress an entire operating system.

    NOTE: Do NOT press <ctrl>c to cancel this process. If you do, your archive will become incomplete and your recovery will be corrupt.

    1. Compare the size of the compressed and original files (hint: use ls -lh). If file is very large (like 15GB), you didn't compress it and you need to remove that file and perform the previous step until you get it right!
    2. Once you are sure you have all three VM disk images backed up, use the exit command to revert back to your normal user.

    vmbackup

    Part 2: Testing the backup

    1. Start the deb3 VM and login.

      caution THIS WILL DESTROY YOUR SYSTEM

      Make certain that you are in your deb3 VM and not in debhost!

    2. Type this command inside the deb3 virtual machine: sudo rm -rf /* (ignore error messages).

    3. Type the command sudo poweroff, try other commands.

    4. Force the VM to poweroff and restart

    5. When the machine restarts it will not boot since all system files have been removed!

    6. Use the Force Off option to turn deb3 back off.

    7. Run virt-manager right click on the deb3 VM and select Delete make sure that Delete associated storage file is selected and Delete

      deb3 is now completely gone. Time to test the backup!

    8. To restore the VM configuration:

    # List all VM's
    virsh list --all

    # Define a VM from xml data
    virsh define ~/backups/deb3.xml

    # List all VM's
    virsh list --all
    1. To restore the deb3 disk image file:
    # Start a sudo shell
    sudo -i

    # Change to images directory
    cd /var/lib/libvirt/images

    # Restore file
    gunzip < ~YourRegularUserName/backups/deb3.qcow2.gz > deb3.qcow2

    # Return to previous shell
    exit

    1. Start the deb3 VM and login to make sure it was successfully restored

    cautionShutting Down the Host while Virtual Machines are Running

    If you shut down your host system while virtual machines are running, they will be suspended, and will resume the next time you boot your host system. Note that it is better to shut down the VMs prior to shutting down the host

    1. For the remainder of these labs, it is assumed that you will backup both the images and XML configuration files for all Virtual machines, when asked to backup your virtual machines. It is also highly recommended to backup these files to an external storage device (eg. USB key) in case the host machine gets "wiped" and you need to rebuild your HOST machine and then restore your Virtual Machines...
    2. Answer this question in your log book:
    • In order to fully back up a virtual machine, what information should be saved in addition to the virtual machine image?

    Answer INVESTIGATION 3 observations / questions in your lab log book.

    Investigation 4: Using Shell Scripts for VM Backup & Management

    You will continue our use of Bash Shell scripting by first creating a Bash Shell script that will allow the Linux sysadmin to select their created VMs for backup. Afterwards you will download, view and run a couple of Bash Shell scripts that use the virsh command to start and stop your virtual machines.

    Please check out these Bash Shell Scripting Tips first before continuing with the following steps

    Perform the following steps:

    1. Start the deb1 virtual machine, and stop the deb2 and deb3 virtual machines.
    2. Switch to the debhost machine, and open a shell terminal.
    3. Enter these admin commands into your debhost machine and note the result:
    virsh list
    virsh list --all
    virsh list --inactive
    1. Now, shut-down your deb1 VM normally, and close the deb1 VM window.
    2. Switch to your terminal and issue the command:
    virsh start deb1
    1. Using the appropriate command check to see if your deb1 VM is now running.
    2. There are other commands that can be used (such as suspend, or shutdown). The "shutdown" command may not always work since it relies on the guest handling a particular ACPI event. Why do you think it is useful to have commands to manipulate VMs?
    3. Since this is a text-based version of Linux, you do not need to turn off the screen-saver.

    Virtual Machine Does not Shutdown from Command

    If the Virtual machine fails to shutdown from the virsh shutdown command, then you can go to the Virtual Machine manager and halt or shutdown within the VM itself, then you can click the PowerOff button in the VM window. You'll want to avoid a forced shutdown since those are equivalent to yanking the power cord out of the wall on a physical machine!

    1. Open a Bash shell terminal and login as root.
    2. Use a text editor (such as vi or nano) to create a Bash Shell script called: ~/bin/backupVM.bash
    3. Enter the following text content into your file:
    #!/bin/bash


    # backupVM.bash
    # Purpose: Backup VM images
    #
    # USAGE: ./backupVM.bash
    #
    # Author: *** INSERT YOUR NAME ***
    # Date: *** CURRENT DATE ***

    user=$(whoami)
    if [ $user != "root" ] # only runs if using sudo or root
    then
    echo "You must run this script with root privileges. Please use sudo" >&2
    exit 1
    fi
    1. Save your editing session, but remain in the text editor.
    2. This shell script is designed particularly for your deb1, deb2, and deb3 VMS.
    3. The code displayed below will prompt the user if they wish for all VMs to be backed-up; otherwise, allow the user the option of specifying which VMs to be backed-up. Add the following code.

    Make sure you edit the code with the correct username!

    # Set variables for source path and backup path
    img_path="/var/lib/libvirt/images/"
    backup_path="/home/username/backups/"

    # prompt if all VMs to be backed-up
    read -p "Backup all VMs? (y|n):" answer

    # Backup all VMs if answer is yes
    if [ "$answer" = "y" ]
    then
    for num in 1 2 3 # Determinant loop for 3 arguments: 1, 2, and 3
    do
    vm="deb${num}"
    echo "Backing up VM ${vm}"
    gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz
    echo "${vm} BACKUP DONE"
    done

    # Prompt for VM is answer is no
    elif [ "$answer" = "n" ]
    then
    read -p "Which VM should be backed up? (1|2|3): " numanswer
    until echo $numanswer | grep "^[123]$" >> /dev/null # Look for match of single digit: 1,2, or 3
    do
    read -p "Invalid Selection. Select 1, 2, or 3: " numanswer
    done
    vm="deb${numanswer}"
    echo "Backing up VM ${vm}"
    gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz
    echo "${vm} BACKUP DONE"
    else
    echo "Invalid Selection... Aborting program"
    exit 2
    fi
    1. Save, set the permissions, and then run that shell script to backup deb1. Confirm that this script did backup this image to ~/backups
    2. What happens if you enter an invalid answer to any of the prompts?
    3. You have completed lab2. Proceed to Completing The Lab, and follow the instructions for "lab sign-off".

    Answer INVESTIGATION 4 observations / questions in your lab log book.

    Lab 2 Sign-Off (Show Instructor)

    Follow the submission instructions that your Professor provides.

    Backup ALL of your VMs!

    If you have successfully completed this lab, make a new backup of all of your virtual machines onto your USB Key.

    Perform the Following Steps:

    1. Use the virsh start command to launch all the VMs (deb1, deb2, and deb3).
    2. Inside each virtual machine, run ip a on the command line. Open a Terminal window in deb1 to do so. You'll need the IP address of each machine for the next steps.
    3. Switch to your debhost VM, open a terminal, and change directory to ~/bin.
    4. Issue the command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab2-check.bash
    1. Give the lab2-check.bash execute permissions for the file owner.
    2. Run the shell script and if there are any warnings, make fixes and re-run shell script until you receive the "Congratulations" message.
    3. Follow the submission instructions of your Professor:

    Practice For Quizzes, Tests, Midterm & Final Exam

    1. How do you start and stop virtual machines?
    2. What is the purpose of the virsh command?
    3. List the steps to correctly backup your VM's xml data
    4. List the steps to correctly backup your VM's disk images
    5. List the steps to correctly restore your VMs
    6. How can you prompt the user for data and store into a variable?
    7. Show a few examples of bash loops that can be used to error-check user input.
    8. What does the command apt update do and why is it important?
    9. What does the command apt upgrade do and why is it important?
    - + \ No newline at end of file diff --git a/A-Labs/lab3.html b/A-Labs/lab3.html index df4821e..4c6d157 100644 --- a/A-Labs/lab3.html +++ b/A-Labs/lab3.html @@ -14,7 +14,7 @@ Lab 3 | OPS245 - Open System Server - + @@ -32,7 +32,7 @@ As systemd is not started, none of our typical services are started, including network access. But we do have access to our basic commands and we have read/write access to the / filesystem

    Perform the following steps:

    1. Shutdown deb1
    2. Start your deb1 VM and press e at the Grub boot menu. deb1grub
    3. Using your arrow keys, scroll down to the line that starts with linux and replace the argument ro with the argument rw init=/bin/bash (see image below for reference) and then press ctrl-x to boot.

    deb1grubinit

    1. The system should boot directly into a bash shell as the user root without prompting for root's password.

    caution Obviously this has serious security implications!

    2 Things to consider:

    1. Without physical security our servers are not secure.
    2. GRUB itself can be password protected which would provide an additional layer of protection.
    1. Issue the command ps -ef | head to list the first 10 processes running.

    Note that PID 1 is your bash shell, on a normal boot systemd would be PID 1

    1. Issue the command: passwd in order to change your root password (press ctrl-c if you wish to abort - i.e. not change password).

    2. To restart normally, booting into graphical mode, the command reboot will not work as it communicates with systemd

    3. From debhost use the command virsh destroy deb1 to force the shutdown of deb1

    Catastrophic Boot Problems

    Not being able to start your debhost due to Kernel Panic or some sort of catastrophic disk failure is not as easy to fix. You might be able to boot from a LIVE Linux ISO, open a terminal and mount the partition via command line and look for possible problems (setup files like /etc/fstab). Lab5 will discuss more about mounting and the /etc/fstab file. The "worst-case scenario" would be to purchase a new hard disk, perform lab1 completely, perform lab2 to install and set-up virtualisation software, then restore your VM image and xml file backups (e.g. decompressing images, issuing virsh define commands for .xml files). That is why consistently performing backups of ALL of your VMS at the end of each lab is absolutely essential! You have been warned!

    Answer INVESTIGATION 1 observations / questions in your lab log book.

    Investigation 2: Archiving and Restoring Files

    Part 1: Creating a File Archive

    One method to help prevent running out of hard disk space is to compress or archive files so they take up less space on your computer system. Archiving files is also a popular method to bundle files together into one smaller file for fast transfers to other computer servers and distribution .

    An archive file is essentially a file that contains other files. We use the tar command to create/extract archive files. Originally the tar command would archive files to an attached tape device, primarily this was done to preserve disk space at a time when disk storage was very expensive.

    Perform the following steps:

    1. Boot up your deb3 VM.
    2. Change your working directory to /usr/share/doc/sudo
    3. Use the tar (tape archiver) command to create an archive file named archive1.tar in your home directory that contains the contents of this directory.
    # Archive contents of pwd
    tar cvf ~/archive1.tar .

    caution > Warning!

    Don't miss the . at the end of the tar command (where indicated). It specifies what should be added into the archive. (the contents of the current directory).

    1. Examine the man page for tar, (man tar) What do the options c, v, and f mean?
    2. Record the archive file size.
    3. The archive file can now be compressed in place using gzip by issuing the command:
    # Compress file in place
    gzip ~/archive1.tar
    1. Record the archive file size after compression.

    We can also create the archive file and compress it at the same time. tar has options to compress archive files using a variety of compression methods, including gzip compression with the z option.

    1. Make sure you're still in /usr/share/doc/sudo and then create a compressed archive by issuing the following command:
    # Create a compressed archive file
    tar cvzf ~/archive2.tar.gz .
    1. What does the z option do?
    2. Compare the sizes of archive1.tar.gz and archive2.tar.gz. Why are they so close in size?
    3. Check the man page for the tar command. What other types of compression does tar support?

    Part 2: Restoring Files From an Archive

    Perform the following steps:

    1. Remain in your deb3 VM.
    2. Create the directory ~/extract1
    3. Change to the ~/extract1 directory.
    4. Move the file archive1.tar.gz to extract1.
    5. Uncompress the first archive you created by issuing the command:
    # Uncompress file in place
    gunzip archive1.tar.gz
    1. Extract the files from the first archive by issuing the command:
    # Extract files from an archive file (tarball)
    tar xvf archive1.tar
    1. Are all the files there?
    2. Compare ~/extract1/README.md and /usr/share/doc/sudo/README.md. Are they exactly the same? Why?
    3. Create the directory ~/extract2
    4. Move the file archive2.tar.gz to the extract2 directory.
    5. Change to the extract2 directory and extract the files from the second archive by issuing the following command:
    # Extract and uncompress contents of an archive file (tarball)
    tar xvzf archive2.tar.gz
    1. Note that this time a separate gunzip command was not needed. Why?
    2. Repeat the previous command, leaving out the option z. Does it work? Why?
    3. Compare the README.md file in this directory with the original file. Are they exactly the same?

    Answer Investigation 2 observations / questions in your lab log book.

    Investigation 3: Managing Software Packages

    Part 1: Managing Software and Repositories with apt

    We will learn how to install software packages with the apt utility. This command is useful for installing software since it automatically resolves software dependencies prior to installing the software. Upon your Debian install, links to software repositories are automatically made to allow for easy software updates and installs from online repositories.

    cautionInternet Connection

    In order for the apt command to work you require a connection to the Internet.

    Common apt Commands

    # Remember apt usually requires sudo

    # Update the list of available packages in the repositories
    apt update

    # Upgrade all installed packages to the newest versions
    apt upgrade

    # Search for a given package
    apt search <package>

    # Show information for a package
    apt show <package>

    # Install a package
    apt install <package>

    # Uninstall a package
    apt remove <package>

    # List all installed packages
    apt list --installed

    # Show configured repositories
    sudo less /etc/apt/sources.list

    Unfortunately, there is no guarantee that a particular software package is contained on the default repository. In order to overcome this problem, you can add other repositories that may contain the application that you wish to install.

    Perform the following steps:

    1. Make certain that you are in your debhost machine.
    2. Search for the package elinks and then show its information
    sudo apt search elinks
    sudo apt show elinks

    What type of software is elinks?

    1. Now issue the command:
    sudo apt install elinks
    1. How can you tell if the elinks package has been installed?
    2. Test that elinks works
    elinks https://debian.org
    1. Type q to exit elinks
    2. To remove the elinks package issue the command:
    sudo apt remove elinks
    1. Verify that the elinks package has been removed. Also verify that the application called: hexchat is not installed.
    2. Open Firefox on debhost to http://ftp.ca.debian.org/debian/pool/main/h/hexchat
    3. Download the file hexchat_x.xx.x-x_amd64.deb (The version numbers in the filename don't matter)
    4. Open a terminal and change to your ~/Downloads directory.
    5. In order to install a package from a local package file (.deb) we can also use apt
    # Install local package file by providing path to .deb file
    sudo apt install ./hexchat*.deb

    hexchat Was the command successful?

    While it is possible to install a package directly from a package file, it does present some difficulties.

    • Resolving dependencies, when using apt with the repositories it will automatically resolve dependencies
    • Compatibility, if the package file is not built specifically for this particular Distribution/Architecture/Version then compatibility problems can certainly occur
    • Conflicts, if you install an alternate package from an outside source as well as the same software from the repo then they can conflict with each other.

    That doesn't mean we can't install software not included in the repos. We should just try to avoid unofficial .deb packages.

    1. Install hexchat normally from the repositories

    Part 2: Installing flatpak Applications

    While we should mostly be using software provided by our official repos, there are certainly circumstances when software we want is not available. One alternative is using one of the "Universal Packaging" systems to find newer or 3rd party software.

    Popular "Universal Package" options include

    • snaps (developed and promoted by Ubuntu)
    • flatpaks
    • Appimages

    All of these offer "containerization" or "sandboxing" as a way of resolving the issues discussed above, and also to provide additional security.

    This Youtube video explains the different systems.

    1. Open Firefox on debhost and open (https://flathub.org) and click on the Setup Flathub link.
    2. Click on the Debian icon.
    3. Follow the instructions to install the flatpak command and configure the Flathub Repo
    4. After rebooting, open a terminal and use apt to search for a package called obs-studio
    5. What version of OBS-Studio is available in the Debian repo?
    6. Open Firefox on debhost and open (https://flathub.org)
    7. Search Flathub for "OBS".
    8. Click on "OBS Studio"
    9. What version is available on Flathub?

    Flatpaks are a great way of adding software that is either not available or not as up to date as the Debian repos.

    We have installed "Debian Stable" and the word "Stable" is very important. Especially on important servers!! While our packages will receive updates, specifically security updates and bug fixes, they are unlikely to receive upgrades that add new features. This is mostly an issue with desktop applications.

    1. Install "OBS Studio" with the command:
    # Install a flatpak
    sudo flatpak install flathub com.obsproject.Studio
    1. Answer y to accept the required runtime library and proceed with the changes.
    2. After the installation confirm that the application runs.
    3. To uninstall OBS try the following commands:
    # List installed flatpaks
    sudo flatpak list

    # Make note of the Application ID for "OBS Studio"

    # Uninstall "OBS Studio""
    sudo flatpak uninstall com.obsproject.Studio

    Part 3: Compiling Source Code from a Downloaded Archived File

    Sometimes, software may not be available in the Debian repositories or even in alternate packaging format. Maybe you want to test a development build of an application that has not been released to the public. They may be available from various web-pages to download, and compile from source code. These wouldn't be the same as pre compiled binary packages, but rather software that you will build yourself.

    Now that you know how to create and decompress "gzipped tarball archives", we will demonstrate how to install applications from websites containing these types of archives. Although this method is not as "user-friendly" as using the apt package manager, this method is useful if the application is NOT contained in regular software repositories...

    In order to build software from source code, you must have the appropriate software development tools (such as make and gcc) and libraries (such as GTK) installed. The required tools will vary depending on the computer languages used in the software being built.

    Installing Development Tools and Libraries

    1. Show the information for the build-essential package
    2. Read the Description
    3. Install the build-essential package
    4. This package will install a lot of packages as dependencies that are the "essentials" of building and compiling software
    5. Open Firefox on debhost and search for "lbreakout2"
    6. The first link should direct you the website for that project on Sourceforge
    7. Download the source code file. (.tar.gz extension)
    8. Open a terminal and change to your ~/Downloads directory
    9. Extract the archive file using tar
    10. Once extracted you will have a new directory that contains the source code for this game. Change to that directory.
    11. List the contents

    lbreakoutsrc

    There are a number of files of significance:

    • README, & INSTALL are both text files that are probably worth reading.
    • configure is a script that will check a number of dependencies and configure the source code for your system
    • Makefile* are files that contain the necessary commands to compile and install the software
    1. View the INSTALL file and read the "Basic Installation" instructions
    2. Run the configure script.

    Make sure you run configure from the current directory by adding the leading ./

    # Run the configure script from the current directory
    ./configure
    1. Were there any error messages?
    2. There is a missing library for libz as well as others
    3. Use apt to install zlib1g-dev libpng-dev and libsdl1.2-dev
    4. Rerun the configure script
    5. If there are no errors we can move onto compiling and installing

    Compiling and Installing the Software

    Compiling any sort of complex application often involves many steps and source code files. Fortunately the developer has provided a "makefile" which is basically a list of steps to compile and install the software. All we need to do is run the make command in the source directory to do all of the compile steps.

    1. Compile the software
    # Run make in the source directory
    make
    1. When the compile is complete the next step is to install all of the files to the correct directories on the system.

    caution ./configureand make do not require root privileges. Installing all of the compiled files to the correct locations on the system does require root privileges

    # Install the compiled software
    sudo make install
    1. Run lbreakout2
    # Run lbreakout2
    lbreakout2 &

    lbreakout2run

    Using && and || Conditional Statements

    A very useful trick when running several commands in sequence is to use conditional statements.

    • The && conditional will run the subsequent command only if the previous command returns a true (0) exit status, for example:
    # Run configure and then if successful run make
    ./configure && make

    The || conditional will run the subsequent command only if the previous command returns a false (non-zero) exit status, for example:

    # Run configure and then if it fails tell Houston
    ./configure || echo "Houston, we have a problem"

    These conditional can be combined, for example:

    # If configure runs, run make, if make fails run echo
    # If configure fails, don't run make, run echo
    # If configure runs, run make, if make runs, don't run echo
    ./configure && make || echo "Houston, we have a problem"

    Part 4: Using sed to Filter Output from Commands

    We will continue with using commands to create a Software Information Report that manipulates output generated by the apt command. The sed and awk commands are very useful tools in shell scripting to manipulate text. In this lab, we will be using sed to allow the user to select certain portions from the dpkg-query command.

    Please see the Bash Shell Tips for this part of the lab before proceeding with the steps below

    Perform the following steps:

    1. Use your debhost VM for this section.
    2. Open a terminal and run the command:
    # Display status information about select packages
    dpkg-query -s tar wget gnome
    • Notice that using the -s option with dpkg-query displays status information about installed packages.
    1. Examine the output of this command, lets imagine that we only wish to see the package name and a list of its dependencies.
    2. Lets use sed to make this output more useful by filtering for lines that start with "Package:" or "Depends:"
    # Use sed to filter for only package name and dependencies
    dpkg-query -s tar wget gnome | sed -n -e '/^Package:/ p' -e '/Depends:/ p'
    1. Try modifying that command to display only the package Name and Description.

    Answer the Investigation 3 observations / questions in your lab log book.

    Investigation 4: Generating Software Package Information with Shell Scripts

    We will continue by using commands to create a Software Information Report that filters output generated by the dpkg-query command. The sed and awk commands are very useful tools in shell scripting to filter and process text. In this lab, we will be using sed to allow the user to select certain parts of the output from the dpkg-query command.

    Please see the Bash Shell Scripting Tips for this part of the lab before proceeding with the steps below

    Perform the following steps:

    1. Use your debhost VM for this section.
    2. Open a terminal and use a text editor create a bash script called: packageInfo.bash in the ~/bin directory.
    3. Enter the following text into your file:
    #!/bin/bash

    # packageInfo.bash
    # Purpose: Generates a report to include specific package information
    #
    # USAGE: ./packageInfo.bash [package-name]
    #
    # Author: *** INSERT YOUR NAME ***
    # Date: *** CURRENT DATE ***

    # Test for sudo
    user=$(whoami)
    if [ $user != "root" ]
    then
    echo "You must run this script with root privileges. Please use sudo" >&2
    exit 1
    fi
    1. Save your file, but remain in the text editor.

    This code will check that the script is being run with a single command argument. Which should be a package name.

    It will also generate the report title and current date.

    1. Add the following code
    # Test for argument
    if [ $# -ne 1 ]
    then
    echo "Your command must have a package-name as an argument" >&2
    echo "USAGE: $0 [package-name]" >&2
    exit 2
    fi

    # Create report title
    # (echo with -e option allows newline \n character to be used)
    reportPath="/home/YourRegularUserName/bin"
    echo -e "SOFTWARE PACKAGE INFORMATION REPORT" > ${reportPath}/package-info.txt
    echo -e "Date: $(date +'%A %B %d, %Y (%H:%M:%p)')\n\n " >> ${reportPath}/package-info.txt
    1. Save your file, but remain in the text editor.

    The code below uses a bash technique called the "Here-Document" to redirect stdin from within the script itself.

    It uses the << <LABEL> syntax to say, take the input from the text below as pre-formatted text until you find the LABEL.

    The read command will store the different information report items as words (separated by a space).

    The sed command is used to convert the spaces used as delimiters to pipes (|) and stored the text into another variable.

    The 2nd sed command uses extended regular expressions to print the output elements that were selected.

    1. Add the following code
    # Clear screen and use Here Document to display select on report items to read into variable
    clear
    cat <<+
    Available Package Information Items:

    Package
    Status
    Section
    Maintainer
    Version
    Homepage
    +
    read -p "Enter word(s) shown above separated by spaces: " choice

    # Convert spaces to pipe symbol (|)
    processedChoice=$(echo $choice | sed 's/ /|/g')

    # Use sed with extended regular expressions to only print those matching report elements
    dpkg-query -s $1 | sed -r -n "/^($processedChoice)/ p" >> ${reportPath}/package-info.txt

    cat <<+
    File "${reportPath}/package-info.txt" has been created
    +
    1. Save the file, set permissions, and then run that script for the package gnome.
    2. Did it create that report?
    3. Run the script without an argument - What did it do?

    **You have completed lab3. Proceed to the instructions for "Lab Sign-Off".

    Answer the Investigation 4 observations / questions in your lab log book.

    Lab 3 Sign-Off (Show Instructor)

    Follow the submission instructions for lab 3 on Blackboard.

    Time for a new backup!

    If you have successfully completed this lab, make a new backup of your virtual machines as well as your host machine.

    Perform the Following Steps:

    1. Make certain that your debhost and deb3 VMs are running.
    2. Switch to your debhost machine, open a shell terminal as a regular user, and change to the directory: ~/bin
    3. Download the Lab 3 check script:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab3-check.bash
    1. Give the lab3-check.bash file execute permissions (for the file owner).
    2. Run the shell script with sudo, and if any warnings appear, fix the issues noted by the script and rerun the check until you receive the "Congratulations!" message.
    3. Submit the lab according to your Professors instructions.

    Practice For Quizzes, Tests, Midterm & Final Exam

    1. What is the purpose of booting into single-user mode?
    2. List the steps in order to boot into single-user mode.
    3. List the steps to reset a forgotten root password.
    4. What is the difference between a .tgz file and a .tar.gz file? What do these stand for?
    5. What is the purpose of a repository?
    6. What is source code?
    7. How do you build software from source code?
    8. What does apt do that compiled source code does not?
    9. Other than running an installed package, what commands can you issue to verify that the package was installed?
    10. List the steps to remove a package via the apt command.
    11. List the steps to install a package using the apt command.
    12. What is the command to list all repositories associated with the apt command?
    13. What is the Here-Document, and how can it be used in bash scripting?
    - + \ No newline at end of file diff --git a/A-Labs/lab4.html b/A-Labs/lab4.html index 9d5357d..4687f05 100644 --- a/A-Labs/lab4.html +++ b/A-Labs/lab4.html @@ -14,7 +14,7 @@ Lab 4 | OPS245 - Open System Server - + @@ -35,7 +35,7 @@ If deb1 was installed directly on physical hardware we would switch to TTY1 with the key combination CTRL-ALT-F1. Because we are running as a VM we will use the VM Viewer. Click on Send Key --> CTRL-ALT-F1

    deb1tty

    1. Login as your regular user and reboot your deb1 VM. It should return to the graphical login screen.

    You should notice at this point that the command systemctl isolate did not change the default target the system will boot to. It just changed or switched the current target.

    1. Issue the command to change the default target to multi-user.target, then reboot deb1. What do you notice?

    2. Login and change the current run-level to graphical.target

    3. Try to do the same thing to your deb3 VM. Did it work? Why or why not?

    4. Set the default target on your deb1 VM back to graphical.target before continuing.

    Answer INVESTIGATION 3 observations / questions in your lab log book.

    Investigation 4: User Management with Bash Scripting

    Before proceeding with Investigation 4, please review the Bash Shell Scripting Tips here

    Using getopts Function & case statement

    We will now use shell scripting to help automate the task for a Linux administrator to create regular user accounts.

    Perform the following steps:

    1. You will be using your debhost machine for this section.
    2. Open a shell terminal, as your regular user.
    3. Change to the ~/bin directory.
    4. Download, study, and run the following shell script. Issue the command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/user-create.bash
    1. Try to understand what this bash script does, and then run the script using sudo to create just one user called test. After running the shell script, view the contents of the /home directory to confirm.

    Although the zenity command is a "user-friendly" way to run shell scripts, Linux administrators usually create shell scripts that resemble common Linux commands. In this lab, you will learn to create a shell script using the getopts function to make your shell script behave more like actual Linux commands (including the use of options). Refer to the notes section on the right-hand-side for reference about the case statement and the getopts function.

    1. Change to the ~/bin directory.
    2. Use the wget command to download the input file called user-data.txt by issuing the command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/user-data.txt
    1. View the contents on the user-data.txt file to confirm there are 3 fields (username, fullname, and e-mail address)which are separated by the colon : symbol.
    2. Use a text editor to create a bash script called: createUsers.bash` in the ~/bin directory.
    3. Enter the following text content into your text-editing session:
    #!/bin/bash

    # createUsers.bash
    # Purpose: Generates a batch of user accounts from a text file
    #
    # USAGE: sudo ./createUsers.bash [-i {input-path}]
    #
    # Author: *** INSERT YOUR NAME ***
    # Date: *** CURRENT DATE ***

    # Test for sudo
    user=$(whoami)
    if [ $user != "root" ]
    then
    echo "You must run this script with root privileges. Please use sudo" >&2
    exit 1
    fi

    # Test for argument
    if [ "$#" -eq 0 ] # if no arguments after command
    then
    echo "You must enter an argument" >&2
    echo "USAGE: $0 [-i {input-path}]" >&2
    exit 2
    fi
    1. Save your editing session, but remain in the text editor.
    2. The code displayed below uses the getopt function to set the input file pathname or check for invalid options or missing option text. Add the following code
    outputFlag="n"
    while getopts i: name
    do
    case $name in
    i) inputFile=$OPTARG ;;
    :) echo "Error: You need text after options requiring text"
    exit 3 ;;
    \?) echo "Error: Incorrect option"
    exit 3 ;;
    esac
    done
    1. Save your editing session, but remain in the text editor.
    2. The code displayed below uses logic to exit the script if the input file does not exist. Command substitution is used to store each line of the input file as a positional parameter. There is one subtle problem here: The full names of the users contain spaces which can create havoc when trying to set each line as a separate positional parameter. In this case the sed command is used to convert spaces to plus signs (+), which will be converted back later. Finally, a for loop is used to create each account (useradd) and display their account information. Add the following code:
    # Test for inputFile
    if [ ! -f $inputFile ]
    then
    echo "The file pathname \"$inputFile\" is empty or does not exist" >&2
    exit 4
    fi

    # Temporarily convert spaces to + for storing lines as positional parameters
    set $(sed 's/ /+/g' $inputFile)

    for x
    do
    userPassWd=$(date | md5sum | cut -d" " -f1)
    useradd -m \
    -c "$(echo $x | cut -d":" -f2 | sed 's/+/ /g')" \
    -s "/bin/bash" \
    -p $userPassWd \
    $(echo $x | cut -d":" -f1)

    cat <<+
    Server Account Information
    Here is your server account information:
    servername: myserver.senecapolytechnic.ca
    username: $(echo $x | cut -d":" -f1)
    password: $userPassWd
    email: $(echo $x | cut -d":" -f3)

    +
    done

    echo -e "\n\nAccounts have been created\n\n"
    exit 0
    1. Save, set permissions, and then run that shell script for the input text file user-data.txt. Did it work? Try running the script without an argument - What did it do?
    2. You have completed lab4. Proceed to Completing The Lab, and follow the instructions for "lab sign-off".

    Answer INVESTIGATION 4 observations / questions in your lab log book.

    Lab 4 Sign-Off (Show Instructor)

    Follow your Professors submission instructions for lab 4 on Blackboard.

    Time for a new backup!: If you have successfully completed this lab, make a new backup of your virtual machines as well as your host machine.

    Perform the Following Steps:

    1. Make certain that your debhost, deb1 VM are running.
    2. Switch to your debhost VM.
    3. Open a shell terminal, and change to the ~/bin directory.
    4. Issue the Linux command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab4-check.bash
    1. Give the lab4-check.bash file execute permissions (for the file owner).
    2. Run the shell script using sudo and if any warnings, make fixes and re-run shell script until you receive "congratulations" message.
    3. Follow your Professors instrtuctions for submitting the lab

    Practice For Quizzes, Tests, Midterm & Final Exam

    1. Describe all of the fields in /etc/passwd
    2. What is the command to create a user? What option to create a home directory for that user?
    3. What is the command to change the full name of an already-created user?
    4. What is the command to delete a user account? What option allows for the user's home directory to be removed as well?
    5. What is the command to create a group? What is the command (or steps) to include a user in a newly-created group?
    6. What is the purpose of /etc/shadow?
    7. What is the purpose of /etc/skel?
    8. What does the term target mean?
    9. How to set the target of a Linux system to text-based only? How to set to graphical mode?
    10. What is the command to view the status of running services?
    11. What is the command to start a service (like httpd, or sshd)?
    12. What is the command to stop a service (like httpd, or sshd)?
    13. What is the difference between starting a service and enabling a service?
    14. Can a service be stopped and started by issuing just one command?
    - + \ No newline at end of file diff --git a/A-Labs/lab5.html b/A-Labs/lab5.html index d3d92e2..e8c13fe 100644 --- a/A-Labs/lab5.html +++ b/A-Labs/lab5.html @@ -14,7 +14,7 @@ Lab 5 | OPS245 - Open System Server - + @@ -23,7 +23,7 @@ Debian does not allow email to be delivered to root (unlike most distributions)

    Instead mail to root will be redirected to the mail box of your regular user

    1. To check and read your local mail we will user the mail (mailx) command
    # To run the local mail client
    mail

    # mail is an interactive tool
    # Some mail commands you can enter at the & prompt:

    # List mailbox
    t

    # Read message 1
    1

    # Delete message 3
    d3

    # Delete messages 2-5
    d2-5

    # Quit mail
    q

    # View help
    help

    1. Check to see if there are any mail messages. If there are mail messages, they do not relate to this script execution. Remove all mail messages by typing d immediately followed by a mail message number range (eg. to remove all messages. For example, if there are 5 messages, type d1-5 and then press ENTER and enter q to exit the mail application).

    2. Edit the monitor-disk-space.bash script, and set the alert=90 value to alert=10. Then save your editing session, and re-run this script.

    3. Run the mail command. Do you have a mail message? Enter the mail message number to view the message. If there is a message, what is the purpose of this message?

    4. Exit from the mail command.

    5. The script as it is currently written will send the email to root. Change the admin variable in the script to your own username.

    6. Run the script again and make sure the email message gets delivered to your normal user.

    In order to automatically run the script on a schedule, you can use the scheduler service in Linux called crontab. The term crontab stands for Chronograph Tables, where a chronograph is the old term for a timepiece (the forerunner of the modern stop-watch). You can run the crontab command to schedule commands and shell script to be run in a number of different ways.

    1. Quickly view the tutorial about the Using crontab file to understand the purpose of this file and how to basically set up a schedule to run a shell script.
    2. This particular script does not require root permissions so we can run it from our regular users crontab. Issue the following command to setup a crontab entry:
    # Confirm the cron service is enabled and active
    systemctl status cron

    # Every user has their own cron table
    # Edit the current users cron table
    crontab -e
    1. Enter the following line in order to run at 6:00 on the first day of every month:

    crontab

    1. Save the crontab entry.
    2. Confirm that the entry was properly saved by issuing the following command:
    crontab -l

    Answer INVESTIGATION 1 observations / questions in your lab log book.

    Investigation 2: Managing Hard Disk Space Using LVM

    An technology called Logical Volume Management (LVM) is a very useful tool for Linux system administrators to easily manage the changing needs of disk storage, in some cases, even when the computer system is running!

    LVM (Logical Volume Management) is used to manage disk storage for Linux and Unix systems. LVM provides more flexibility than traditional disk partitioning.

    Volume Groups are pools of storage space provided by one or more Physical Volumes (i.e. hard disks, disk partitions, or other forms of storage devices).

    Logical Volumes are then created from available space in a Volume Group, formatted with a filesystem (ie ext4), and then mounted on a particular directory in our filesystem hierarchy.

    lvm

    LVM allows more flexibility and growth potential for Linux systems (for example, having Logical volumes span multiple hard disks). We chose to configure our Debian VM's with LVM by during installation. Other Linux distributions may provide the capacity to install LVM.

    Part 1: Managing File System Size with Existing Hard Drive

    We will now use LVM in order to grow and reduce our file system, using extra unallocated space on our existing (default) virtual hard disk for our deb2 VM.

    There are a variety of tools both graphical and CLI based for managing LVM storage, we will focus on the traditional LVM command line tools such as:

    # List Logical Volumes
    lvs

    # List Physical Volumes
    pvs

    # List Volume Groups
    vgs

    # More detailed information
    lvdisplay
    pvdisplay
    vgdisplay

    # Partition a physical disk
    fdisk

    # Format a device with a filesystem
    mkfs

    # Some commands for making LVM changes
    pvcreate
    vgcreate
    vgextend
    vgreduce
    lvcreate
    lvextend
    lvreduce

    Perform the following steps:

    1. Remain in your deb2 VM for this section.
    2. Launch an interactive sudo shell:
    # List the virtual disk devices
    ls /dev/vd*

    # List the LV's
    lvs

    # List the VG's
    vgs

    # List the PV's
    pvs

    # List the mounted storage devices
    df -h

    deb2vda

    You can see that we have a single virtual disk (vda) which has 3 partitions (vda1, vda2, vda5)

    deb2lvm

    You can see we have 3 LV's (home, root, swap_1) that come from the same VG (deb2-vg).

    You can see we have a single PV (/dev/vda5) that has been added to the deb2-vg VG.

    You can see we have a single VG (deb2-vg) that has a single PV and 3 LV's

    deb2dfh

    You can see that the home and root LV's are mounted on /home and / directories. Make note of the filenames and path of the LV devices

    You can also see that the partition /dev/vda1 is mounted on /boot

    caution

    The /boot directory contains all of the files required to boot the operating system. These files must be stored on a traditional partition because the LVM devices are unavailable until after the system boots

    1. Check to see if there is any remaining space on your existing hard disk. Can you see any?
    # List partitions on /dev/vda
    fdisk -l /dev/vda

    deb2fdiskl

    You can see that all of the space has been allocated to existing partitions, so we will add a 2nd Virtual Disk to the VM.

    1. Click on the View menu in the virt-viewer and select Details...

    deb2diskadd

    1. Add a 3G Storage disk image
    2. Switch back to Console view
    3. List the virtual disk devices in /dev
    # List virtual disk devices
    ls /dev/vd*

    deb2vdb

    You can see a new device /dev/vdb.

    1. Create two new partitions on /dev/vdb using fdisk:
    fdisk /dev/vdb
    1. In fdisk, create your first new partition:

    2. In fdisk, create your second new partition:

    3. You should now have 2 new partitions on /dev/vdb

    deb2vdbfdisk deb2vdbls

    1. Now label /dev/vdb1 as a Physical Volume and add it to the existing Volume Group (deb2-vg)
    # Label /dev/vdb1 as a PV
    pvcreate /dev/vdb1

    # Add /dev/vdb1 to the deb2-vg VG
    vgextend deb2-vg /dev/vdb1
    1. Now there should be an additional 2G of space available in the VG. Confirm the changes using the commands above

    deb2vgextend

    1. Check the man page for the lvcreate command, make note of the -L and -n options
    2. Create a new logical volume by issuing the following command:
    # Create new LV archive
    lvcreate -L 1G -n archive deb2-vg

    NOTE: Logical volumes are represented by a couple of different filenames below /dev which are themselves symlinks to a more obscsure name

    deb2lvfn

    1. Check the output of lvs, pvs, and vgs commands. You can see that your deb2-vg still has 1G of space free.
    2. Format your newly-created LV as ext4 by issuing the command:
    mkfs -t ext4 /dev/deb2-vg/archive
    1. Read the man page for lvreduce and check for the -L option. What is the significance of prefixing the size with "+" or "-"?

    Note: lvextend and lvreduce can make relative changes to an LV's size by adding to or subtracting from the current size. Omitting these prefixes will set the LV size to what you specified.

    1. Attempt to reduce the archive LV size by issuing the command: DO NOT SAY 'y' to confirm the command!!
    lvreduce -L -0.5G deb2-vg/archive

    deb2lvreduce

    The 1G archive LV contains an ext4 filesystem that is also 1G in size to fill the device. When the LV size is reduced, the filesystem format on it also needs to be resized, or it will be corrupted.

    Also if an LV is increased in size with lvextend the filesystem on it also needs to extended to make the new space usable.

    Both the lvextend and lvreduce commands have a -r option which causes the filesystem format to also be resized

    1. Reduce the archive LV with the command:
    lvreduce -r -L -0.5G deb2-vg/archive
    1. Issue commands to confirm the change

    2. Now increase the size of the archive LV with the command:

    lvextend -r -L +1G deb2-vg/archive
    1. Confirm the change

    One of the benefits of using LVM for storage is that often changes can be made to storage even while the system is running and in use. Currently the home LV is mounted on /home and in use but we can increase its size anyway. You still have 0.5G of space free in the deb2-vg.

    Imagine you have received an email from the monitor-disk-space.bash informing you that the home LV is almost out of space. We can quickly add additional space to the LV

    1. Check the current usage of /home with the df -h command
    2. Increase the size of the home LV by adding all of the available space with the command:
    lvextend -r -l +100%FREE deb2-vg/home

    When you set a size using the -L option you are using standard storage units. (Gigabytes, Terabytes, etc) that is recalculated to the closest number of extents. Extents are a lower level unit of measurement for storage.

    -l +100%FREE, using a lowercase -l changes the size by extents. In this case it will add all of the free extents remaining in the VG to the home LV

    1. Exit your sudo shell

    Part 2: Manually & Automatically Mount Partitions

    We take for granted that when our system boots, all of the storage volumes will be successfully mounted on to the filesystem. During installation when we configured the storage devices they were added to the table of automatic filesystem mounts (/etc/fstab) by the installer. Now that we have added a new LV (archive), we need to mount it to make use of its space. We will also configure the system to mount it automatically at boot time. We will do this by editing the file system table (/etc/fstab). This file contains entries to mount various file systems automatically upon start-up of the Linux system.

    deb2mount

    The Linux system administrator also has the ability to manually mount (connect) and un-mount (disconnect) partitions in order to perform maintenance on the file system (for example, un-mounting the /home partition to install software and prevent users from logging in during that process).

    To mount a storage volume we need to provide the device name, the filesystem format, and the mount point.

    A mount point is just a directory in the filesystem hierarchy. The directory SHOULD be empty. If a storage volume is mounted on a directory that is not empty, then the original contents of the directory will be inaccessible until the device is unmounted.

    Perform the following steps to mount the archive LV

    1. Perform this part in your deb2 VM.
    2. Start an interactive sudo shell
    3. Create the "mount point", which is just a directory.
    mkdir /archive

    Note: The mount point name does not have to match the LV name, but it can make it easier to remember how they are associated. 4. For demonstration purposes only, create a couple of empty files in /archive.

    # You should remember the touch command
    touch /archive/file1 /archive/file2

    ls -l /archive
    1. Use the mount command to mount the archive LV:
    # View the currently mounted filesystems
    mount

    # Mount the archive LV as an ext4 filesystem on the directory /archive
    mount -t ext4 /dev/deb2-vg/archive /archive

    # You can use either pathname for the device
    # This command would also work
    mount -t ext4 /dev/mapper/deb2--vg-archive /archive

    # Confirm the device is mounted
    mount

    # Also verify with df
    df -h
    1. Now that the device is mounted, what happened to the contents of /archive?
    2. List the contents of /archive
    3. Are the empty files listed?

    The files have not been deleted or damaged. Instead they have been "covered up" by the contents of the archive LV. They are no longer visible or accessible.

    1. Now manually unmount the archive LV using the umount command. (Note the spelling of the umount command)
    # Unmount using device name
    umount /dev/mapper/deb2--vg-archive

    # OR

    # Unmount using mount point name
    umount /archive

    # Confirm with mount or df
    1. List the contents of the /archive directory. What do you see?

    The empty files are now visible once again. Reminding us that mount points should be empty directories.

    In order to have the archive LV mounted automatically when the system boots, the filesystem table (/etc/fstab) must be edited. The mount command reads and works with the contents of /etc/fstab to determine what devices are automatically at system boot-up

    1. View the contents of the file-system table /etc/fstab by issuing the following command:
    cat /etc/fstab

    deb2fstab

    Notice that the entries in the table include fields for device name, mount point, and format type, followed by other options.

    You can also see 2 different methods of identifying devices. Either by pathname under /dev/ or by UUID. (Universally Unique ID)

    Other useful commands for working with storage:

    # List all block (storage) devices
    lsblk

    # List the UUID information for storage devices
    blkid
    1. Edit the /etc/fstab file to add an entry to automatically mount the /archive directory upon booting:

    caution

    Errors in the /etc/fstab file can cause your system to fail to boot!

    Edit this file VERY CAREFULLY!

    1. Add the following line to the /etc/fstab file
    /dev/deb2-vg/archive /archive ext4 defaults 1 2

    Note: do not alter any of the other lines that are already in that file.

    1. Before rebooting we should test the new entry with the command:
    # Mount all automount devices in /etc/fstab
    mount -a
    1. The filesystem table file /etc/fstab is read by systemd at boot time. After changing the file, systemd needs to be reloaded:
    # Reload systemd
    systemctl daemon-reload

    # Mount all automount devices in /etc/fstab
    mount -a

    If there are any errors you must correct them before rebooting deb2.

    1. Reboot deb2 and confirm that the archive is correctly mounted.
    2. Perform a system update on deb2 and shutdown

    Answer the INVESTIGATION 2 observations / questions in your lab log book.

    caution

    Both the configuration of the deb2 VM and the contents of the disk image have changed. Remember to backup both the XML and disk image of deb2

    Lab 5 Sign-Off (Show Instructor)

    Perform the Following Steps:

    1. Make certain that your debhost and deb2 VMs are running.
    2. Switch to your debhost machine.
    3. Open a shell terminal, change to your user's bin directory.
    4. Issue the Linux command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab5-check.bash
    1. Give the lab5-check.bash file execute permissions (for the file owner).
    2. Run the shell script (with elevated permissions) and if there are any warnings, make fixes and re-run shell script until you receive "congratulations" message.
    3. Follow the submission instructions of your Professor.

    Practice For Quizzes, Tests, Midterm & Final Exam

    1. What is a VG? PV? LV?
    2. What is the total size of the "deb2-vg" VG on your system?
    3. How do you create an LV?
    4. How do resize an LV?
    5. How would you add the disk partition /dev/sdb7 to your volume group "deb2-vg"?
    6. How would you increase the size of the root filesystem by 50 MB?
    7. How can you determine if a partition has been mounted onto a system?
    8. How can you unmount an existing partition from the file-system?
    9. How can you temporarily mount a partition on a file-system?
    10. How can you permanently mount a partition on a file-system upon boot-up?
    11. What are the separate elements (fields) of the /etc/fstab file?
    12. Describe the tools that a Linux system administrator have to monitor disk space usage.
    - + \ No newline at end of file diff --git a/A-Labs/lab6.html b/A-Labs/lab6.html index cff60c3..80541f5 100644 --- a/A-Labs/lab6.html +++ b/A-Labs/lab6.html @@ -14,7 +14,7 @@ Lab 6 | OPS245 - Open System Server - + @@ -25,7 +25,7 @@ vmmnetwork1
  • Select network1 and make sure the State: is Active and Autostart: On Boot is enabled. vmmnet1start
  • Close the Connection Details window and open a terminal on debhost
  • Confirm that debhost is connected to network1 and gather network information with the following commands:
  • # Show network interfaces including host IPv4 address
    ip address

    # Show IPv4 routes including default gateway
    ip route

    dehostipadd

    You can see that debhost has 3 network interfaces:

    1. Make a note of the IPv4 address for virbr1
      debhostiproute

    You can see that debhost is configured with a default gateway (default route) that is the IPv4 address of either the lab PC or your laptop.

    debhost is also connected to 2 networks. The VMWare/VirtualBox virtual network, and the KVM/Qemu virtual network network1 via the interface virbr1

    We will now reconfigure each of our VMs to use our new virtual network network1

    1. Start with the deb1 VM. Double-click on your deb1 VM, but instead of starting the VM, click on the View menu, and select: Details
    2. In the left pane of the Virtual Machine window, select NIC: and note that this NIC is connected to the Network source: 'default'
    3. Change it to Virtual Network network1: NAT (i.e. the network that you just created) and click the Apply button.

    deb1vmnic

    Part 2: Configuring deb1 with a static address on 'network1'

    In this section, we will be using the Gnome Settings graphical tool to connect our deb1 VM to network1.

    Although the private virtual network has been setup via Virtual Machine Manager, each virtual machine has to have its interface configured with a valid static address (either graphically or by command line).

    Perform the following steps:

    1. On your debhost machine, run ip address and make note of the IP address assigned to the virbr1 (i.e. "Virtual Bridge) interface. This will be the default gateway and DNS server for your other VMs.
    2. Select the Console view (instead of Details), start your deb1 VM, and login.
    3. Within your deb1 VM, open a terminal and show the network interfaces with the command ip addressdeb1ipadd1

    You can see the network interface does not have a IPv4 address. DHCP is not available for the network so a static address must be configured

    1. Click on the network icon located on the status bar at the lower left corner of the desktop.
    2. Choose Network Connections

    deb1netstatus

    1. Select Wired Connection 1 and click on the settings icon

    deb1netsettings

    1. Click on the IPv4 Settings tab
    2. Change the Method to Manual and Add the Address 192.168.245.11, Netmask 255.255.255.0
    3. The Gateway address should be the IP address of debhost (192.168.245.1)
    4. Add the same debhost address as the DNS server and click on Save. deb1 should connect to the network

    deb1staticip

    1. Open a terminal and display the network interfaces and route table to confirm the IP address and default gateway.

    deb1ipadd2

    deb1iproute

    1. To check the DNS server and test connectivity try the following commands:
    # To check the DNS server address
    nslookup
    > server

    # To resolve the Debian web server to IP address
    > www.debian.org

    # To resolve google to IP address
    > www.google.com

    # Exit nslookup
    > exit

    # Test IP connectivity to debhost
    ping 192.168.245.1

    # Test IP connectivity to the Internet
    ping www.debian.org

    deb1ping

    Part 3: Configure the static network connection using command line tools (deb2 and deb3)

    The deb2 and deb3 VMs are text-based only systems, we cannot use a graphical tool to configure the connection to our network. We will learn how to perform this task by editing text files and command-line tools.

    Although you can use the ip command to temporarily create a static IP address connection to a network, you need to add the network settings to the /etc/network/interfaces file to automatically connect to the network upon system boot-up.

    Perform the following steps:

    1. Just as you did with deb1 Configure your deb3 VM (in the View -> Details menu of Virtual Machine Manager) to configure the NIC interface to connect to network1, click Apply, and switch your deb3 VM view from details to console.
    2. Start your deb3 VM, login, and use ip address show to check the current address.
    3. The ip command can be used to display information about the interfaces, addresses, and routes configured in the system. It can also be used to control those configurations. Try the following commands on deb3:
    # Display links (interfaces on a network) and the MAC address of those interfdaces
    ip link
    ip -brief link

    # Display configured IP addresses assigned to interfaces
    ip address
    ip -brief address

    # Display routes and default gateway
    ip route
    1. At this time you should see no configured routes and no IPv4 address assigned to the interface
    2. To add a static address and default gateway to the interface use the following commands:
    # Add a static IPv4 address (you may have a different interface name)
    sudo ip address add 192.168.245.13/24 dev enp1s0

    # Add a default gateway address
    sudo ip route add default via 192.168.245.1 dev enp1s0

    # Make an interface down/up
    ip link set enp1s0 down
    ip link set enp1s0 up
    1. Confirm the effect of these commands.
    2. Make sure your link is in an UP state with the static address and default gateway

    deb3ipstatic

    1. Confirm your connection by pinging the addresses of debhost and deb1
    2. Test the connection to the Internet by pinging www.debian.org

    deb3pingtest1

    Hostname resolution via a DNS Server has not been configured

    1. Using sudo edit the file /etc/resolv.conf and modify the nameserver setting to the address of debhost
    nameserver 192.168.245.1
    1. Test the connection to the Internet by pinging www.debian.org

    deb3pingtest1

    1. If everything is working, reboot deb3
    2. Login to deb3 and test your connection with ping and display your configuration with ip
    3. All of the settings have been lost. They need to be made persistent by editing the /etc/network/interfaces file
    4. Edit the file and make the following changes to the "primary network interface" (Your interface name may be different)

    deb3interfaces

    1. Test the settings by bringing the interface down and then up using the commands:
    # Bring down the interface
    sudo ifdown enp1s0

    # Bring up the interface
    sudo ifup enp1s0
    1. Test your connection by pinging www.debian.org
    2. If the test is successful reboot deb3 and test again
    3. Now configure your deb2 VM for a persistent static network connection as well using the IPv4 address of 192.168.245.12. Don't forget to:

    You should now be able to ping all of your VM's by address and any named host on the Internet from each of your VM's

    Answer INVESTIGATION 1 observations / questions in your lab log book.

    Investigation 2: Managing Your New Network

    Creating private networks are an important task, but a system administrator also needs to manage the network to make it convenient to use, and troubleshoot network connectivity problems.

    This investigation will expose you to useful "tools" and utilities to help accomplish this task. Lab 7 requires that you understand these concepts and have a good general understanding how to use troubleshooting utilities (like ss).

    Part 1: Using /etc/hosts File for Local Hostname Resolution

    It is possible to connect to other hosts on the Internet by their domain name using DNS to resolve names to addresses.

    However your 4 VM's are not registered as hosts with a DNS server so are only accessible by IP address.
    It can be hard to try to remember more than a couple of IP addresses. In this section, we will setup your network to use local hostname resolution so that we can connect by hostname.

    Hosts files vs. the Domain Name System

    On large public networks like the Internet or even large private networks we use a network service called Domain Name System (DNS) to resolve the human friendly hostnames like www.debian.org to the numeric addresses used by the IP protocol. On smaller networks we can use the /etc/hosts on each system to resolve names to addresses.

    Perform the following steps:

    1. Complete this investigation on all of your VMs and the debhost machine.
    2. Use the hostname and ip commands on your debhost machine and all of your 3 VM's to gather the information needed to configure the /etc/hosts file on all of your Linux systems.
    3. Edit the /etc/hosts file for the debhost, deb1, deb2 and deb3 VMs. Add the following contents to the bottom of the /etc/hosts file:
    192.168.245.1 debhost
    192.168.245.11 deb1
    192.168.245.12 deb2
    192.168.245.13 deb3
    1. Verify that you can now ping all of your VMs from all of your VMs by the hostname instead of the IP address.

    Part 2: Network Connectivity and Network Service Troubleshooting Utilities

    Troubleshooting network problems is an extremely important and frequent task for a Linux/Unix system administrator. Since network services (such as file-server, print-servers, web-servers, and email-servers) depend on network connectivity, as Linux/Unix sysadmin must be able to quickly and effectively pin-point sources of network problems in order to resolve them.

    Network service problems may not be entirely related to a "broken" network connection, but a service that is not running or not running correctly. The following table lists the most common listing of utilities to assist with detection of network connectivity or network service problems to help correct the problem.

    Common Network Troubleshooting Tools

    PurposeCommand(s)
    Network Connectivityping, arp, ip (replaces deprecated ifconfig)
    Network Service Statusss (replaces deprecated netstat)

    Read the first four sections of this blogpost about using the arp command to examine the arp cache.

    Perform the following steps:

    1. Switch to your debhost machine and start a sudo shell.
    2. Install the net-tools package.
    3. Issue the ping command to test connectivity to your deb1, deb2, and deb3 VMs.
    4. Examine the contents of the ARP cache by using the command: arp What is the purpose of ARP?
    5. Check the contents of the cache again by using the command: arp -n What was the difference in output?
    6. How did the system resolve the IP address to hostname?

    An important task of any System Administrator is to monitor and control the type of connections that can be received by your host. Network applications that connect to (or talk to), Servers/Daemons/Services over a TCP/IP network send requests to a particular TCP or UDP port that is open and accepting requests.

    1. From debhost open 2 more terminals, use the ssh command to connect to deb2 and deb3
    2. Switch to your deb1 VM, open a terminal and use ssh to connect to debhost
    3. Switch to your deb2 VM, login and use ssh to connect to debhost
    4. Switch back to debhost

    Try out the Issue the following commands:

    # Show all active UDP ports
    ss -au

    # Show all active TCP ports
    ss -at

    # Show both
    ss -aut

    # Show all active TCP ports and the process that opened it
    ss -atp

    # Show all active TCP ports numerically
    ss -atn

    # Show all incoming ssh connections
    ss -t src :22

    # Show all outgoing ssh connections
    ss -t dst :22
    1. From deb2 exit your ssh connection into debhost and rerun the command on the ss -at. Instead of ESTABLISHED it should now show a state of CLOSE_WAIT. Indicating that the TCP connection is being closed.
    2. On your debhost VM, try the command: ss -atn How is this output different? Without the -n option ss attempts to resolve IP addresses to host names (using /etc/hosts) and port numbers to service names (using /etc/services)
    3. Examine the /etc/services file and find which ports are used for the services: ssh, sftp, http

    Answer INVESTIGATION 2 observations / questions in your lab log book.

    Investigation 3: Using a bash script to test connectivity to all hosts on the local network

    In this investigation you will create a bash script that will ping the hosts on our local network to test if they are connected to the network.

    1. Create a script Write a script called ~/bin/pingtest.bash that will contains the following code:
    #!/bin/bash

    # ./pingtest.bash
    # Script to test ping to all hosts on local network

    while read line
    do
    if echo $line | grep "^192.168.245" >> /dev/null
    then
    addr=$(echo $line | cut -f1 -d' ')
    host=$(echo $line | cut -f2 -d' ')
    if ping -c1 $addr > /dev/null
    then
    echo "$host online"
    else
    echo "$host offline"
    fi
    fi
    done < /etc/hosts'
    1. Read the script. Try to predict exactly what the script will do.
    2. Make the script executable
    3. To test the script make sure deb1 is shutdown and deb2 & deb3 are running.
    4. Run the script

    pingtest

    1. Using the example of the monitor-disk-space.bash script, modify this script to email your account if the host is offline, instead of sending output to the screen.
    2. Modify your crontab to run this script everyday at 6:00 AM
    3. Run the modified script and take a screenshot of the email you receive.

    Submitting your Lab

    Follow the submission instructions for Llab 6 on Blackboard.

    Time for a new backup!

    If you have successfully completed this lab, make a new backup of your virtual machines as well as your host machine.

    Perform the Following Steps:

    1. Make certain that ALL of your VMs are running.
    2. Switch to your debhost VM.
    3. Change to your user's bin directory.
    4. Issue the Linux command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab6-check.bash
    1. Give the lab6-check.bash file execute permissions (for the file owner).
    2. Run the shell script using sudo and if there are any warnings, make fixes and re-run shell script until you receive "congratulations" message.
    3. Upload screenshots of, the results of lab6-check.bash, and your email message from your pingtest.bash script, to Blackboard.

    Practice For Quizzes, Tests, Midterm & Final Exam

    1. What is a port?
    2. What command will set your IP configuration to 192.168.55.22/24 ?
    3. What is the difference between UDP and TCP?
    4. What port number is used for DHCP servers?
    5. What is the function of the file /etc/hosts ?
    6. What tool is used to show you a list of current TCP connections?
    - + \ No newline at end of file diff --git a/A-Labs/lab7.html b/A-Labs/lab7.html index ae0414d..2dcb0df 100644 --- a/A-Labs/lab7.html +++ b/A-Labs/lab7.html @@ -14,7 +14,7 @@ Lab 7 | OPS245 - Open System Server - + @@ -24,7 +24,7 @@ Debian implements the iptables utility as a "wrapper" for nft. This allows users and organizations with considerable investment in iptables configurations and knowledge to continue to use iptables syntax to configure nftables.

    Chains

    iptables configurations consist of chains of policy rules that a packet must pass-through in order to either enter, leave, or be forwarded by the firewall. If a packet matches a rule, then an action is taken (some examples include: ACCEPT, DROP, REJECT, or LOG). If the packet passes through the chain of rules without a match, then the packet is directed to the chains default policy. (for example: ACCEPT, REJECT, or DROP).

    You can create your own customized chains of rules but to keep thing simple, we only deal with 3 common predefined chains:

    Part 1: Listing and Clearing Existing iptables Rules

    Let's get some practice using the iptables command such as listing CHAIN rules, and clearing the CHAIN rules:

    Perform the following steps:

    1. For the remainder of this section, use your debhost machine.
    2. As working with the firewall requires elevated privileges start a sudo shell
    3. Issue the following command to list the existing iptables policy rules:
    # List all rules for all chains
    iptables -L

    You should see all kinds of rules organized into a number of chains. This is quite overwhelming but most of these rules were added when the libvirtd service was started during boot. libvirtd has to add rules that allow our VM's to communicate over a virtual network.

    For now we will shutoff our VM's and disable libvirtd to simplify everything.

    1. Shutdown the deb1, deb2, and deb3 VM's
    2. On debhost disable the libvirtd service and reboot
    3. After rebooting open a terminal and start a sudo shell
    4. Use the command above to list the iptables rules

    debhostiptables1

    Notice that you have 3 default chains, INPUT, FORWARD, and OUTPUT

    Each of the chains has no current rules but they do have a default policy of ACCEPT Which means that if none of the rules in the chain rejected the packet then it would be accepted.

    A default policy of DROP would mean that if none of the rules accepted the packet then it would be dropped.

    Listing iptables Rules:

    # List rules for all chains in the default table (filter)
    iptables -L

    # List rules for the INPUT chain
    iptables -L INPUT

    # List rules for the OUTPUT chain verbosely
    iptables -v -L OUTPUT
    1. Issue the iptables commands separately to display the rules for the OUTPUT chain and for the FORWARD chain.

    Clearing (Flushing) iptables Rules:

    Sometimes it may be useful to completely clear the rules for all of a particular chain. Note the options that can be used to clear (or flush) the iptables rules,

    # Flush the rules of all chains
    iptables -F

    # Flush the rules of the OUTPUT chain
    iptables -F OUTPUT

    You will have a chance to flush some rules later.

    Part 2: Setting a Default Policy and Setting Policy Exceptions (iptables)

    You will now change the default policy of the INPUT chain to DROP. This means you will have add rules that allow specific types of packets in. A good way to think about setting policies is to have a "safety-net" to take some sort of action to prevent un-handled packets from passing through the firewall by mistake. After the default policy is set-up, then specific exceptions to the default policy can be added to control specific network traffic.

    An example would be to set a default policy for incoming network traffic (INPUT chain) to DROP everything, and then set an exception certain exceptions (like ssh connections). Note the following table below for policy setting examples.

    Policy Setting Examples:

    # Drops all incoming packets regardless of protocol/ports/address
    iptables -P INPUT DROP

    # Accepts all outgoing packets regardless of protocol/ports/address
    iptables -P OUTPUT ACCEPT
    iptables -P INPUT DROPDrops all incoming packets regardless of protocol (eg. tcp, udp, icmp), port numbers (eg. 22, 80) or source or destination IP Addresses. Setting a default rule to DROP all incoming traffic would make it easier to specify a few exceptions.
    iptables -P INPUT ACCEPTAccepts all incoming packets regardless of protocol (eg. tcp, udp, icmp), port numbers (eg. 22, 80) or source or destination IP Addresses. It would seem that setting a default rule to ACCEPT all incoming traffic would require A LOT of exceptions to help "lock-down" the server for protection! The better practice is to use DROP as the default action, and only ACCEPT the traffic you actually want.

    Perform the following steps:

    1. Make certain you are in your debhost machine.
    2. Issue the following Linux command:
    iptables -P INPUT DROP
    1. Issue the iptables -L command. Can you see the policy to DROP all incoming connections?
    2. Open Firefox on debhost and attempt to connect to the internet. Although you have set a default policy to DROP all incoming connections, there is a problem: now, you cannot browse the Internet.

    In order to fix that problem, you can make an exception(rule) to allow incoming web-based traffic (requested via port 80). The iptables commands to create rules need to consider:

    iptables Command Structure for setting rules

    Examples:

    # Append a rule to the INPUT chain allowing incoming ssh traffic from the local network only
    iptables -A INPUT --dport 22 -p tcp -s 192.168.245.0/24 -j ACCEPT

    # Append a rule to the INPUT chain allowing all incoming packets to the loopback interface
    iptables -A INPUT -i lo -p all -j ACCEPT

    # Insert a rule into 2nd position of the INPUT chain to allow incoming traffic related to established connections
    iptables -I 2 INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    # Insert a rule into 1st postition of the INPUT chain to allow incoming pings (icmp) from the local network only
    iptables -I 1 INPUT -p icmp -s 192.168.245.0/24 -j ACCEPT
    Placement in ChainChain NameSpecify ProtocolSource/DestinationTarget
    -A (add / Append to bottom of chain)INPUT-p tcp (tcp packets)-s IPADDR (source host or network address)-j DROP
    -I 2 (insert into 2nd position)OUTPUT-p udp (udp packets)-d IPADDR (destination host or network address)-j ACCEPT
    -R 2 (replace the 2nd rule)FORWARD-p icmp-i ens33 (interface name)-j LOG (accept packet but record in logs)
    -D 3 (delete rule 3)-p all--dport 22 (destination port number)-j REJECT (reject with error)
    -p tcp,udp,icmp (combined)--sport 53 (source port numner)
    (refer to /etc/protocols )(refer to /etc/services)
    1. Issue the following Linux command to ensure the loopback interface is not affected by these rules. The computer needs to be able to communicate with itself with any state and protocol:
    iptables -A INPUT -i lo -p all -j ACCEPT
    1. Issue the following Linux command to ensure the system can get responses to traffic it sends out:
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    1. Use Firefox on debhost to connect to the Internet your other web-browser to confirm that you can now browse the Internet. Because the incoming traffic is a response related to my established connection it is accepted.

    2. Determine the external facing ip address of debhost

    3. Using your Windows machine running VMware (or another machine in your network if you did a bare-metal installation for debhost) try to ping that external facing address. Were you successful?

    4. Issue the following iptables command to allow incoming ping packets (icmp) from only the address of your Windows host. (You will have to use your own IP address)

    My VMware host IP: winhostip

    iptables -A INPUT -p icmp -s 192.168.213.1 -j ACCEPT
    1. Repeat pinging your debhost's external facing IP Address. What happened? Why?

    iptablesping

    1. Try to SSH into YOUR debhost. Were you Successful?
    2. Issue the following Linux command to append a rule to the INPUT chain to allow incoming ssh traffic (ie. port 22):
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    1. Issue an iptables command to confirm that there is a rule to handle incoming tcp packets using port 22.
    2. Try to SSH into your debhost (at least to get a password prompt). Were you Successful? If so, why?
    3. Note that the rule we entered would allow anyone who can reach your debhost to try to log in with ssh. This is not a good idea. What would you have to change about that rule to only allow the one machine you are connecting from?
    4. Reboot debhost open a terminal and start a sudo shell.
    5. List the iptables rules for the INPUT chain. What happened to your iptables rules for the INPUT chain?
    6. Proceed to the next part to learn how to learn how to make your iptables rules persistent.

    Part 3: Making iptables Policies Persistent

    Any changes to your iptables rules will be lost when you restart your Linux server, unless you make your iptables rules persistent. Failure to perform the following steps after setting up your firewall rules can cause confusion and wasted time.

    Don't save copies of rules that libvirtd will auto-add every boot.

    When the libvirtd service starts on debhost it adds some rules to iptables to allow the machines in your virtual network communicate with each other and the outside world. We don't want to include these rules in our configuration because it will cause the rules to be loaded twice. This won't actually break anything, but it does clutter up your iptables and make them harder to read. Before you continue with this investigation, confirm that there are no rules currently loaded.

    Perform the following steps:

    1. Make sure that no rules are currently loaded
    2. Set the default policy for both the INPUT and FORWARD chains to DROP
    3. Append rules to the INPUT chain that allow SSH traffic from your Windows host and from the 192.168.245.0/24 network.
    4. Append a rule to the INPUT chain to allow icmp traffic from your 192.168.245.0/24 network.
    5. Append a rule to the INPUT chain to allow all traffic to the lo (loopback) interface.
    6. Append a rule to the INPUT chain to allow all traffic that is RELATED/ESTABLISHED.
    7. List the INPUT chain. It should look similar to this

    iptables3

    1. Test your rules by doing the following:

    You can't test the traffic from 192.168.245.0/24 until libvirtd starts. Before you start libvirtd you should save your current rules to make them persistent.

    1. Save the current ruleset using the command:
    # Save iptables rules in memory to a file in the correct format
    iptables-save -f /etc/iptables.rules
    1. Verify that the file /etc/iptables.rules exists.
    2. Create a new script file /etc/network/if-pre-up.d/iptables
    3. Add the following to the file
    #!/bin/bash

    /sbin/iptables-restore /etc/iptables.rules
    1. Make the script executable chmod u+x /etc/network/if-pre-up.d/iptables
    2. Reboot debhost and check that the rules are restored during boot.
    3. Start the libvirtd service, and note the rules it adds to your iptables. It will do this automatically every time it starts.
    4. Enable the libvirtd service so that it starts during boot.
    5. After rebooting open a terminal and start a sudo shell
    6. List your iptables rules. If everything there?
    7. Start your deb1, deb2, and deb3 VM's
    8. Confirm that you can ping debhost and that you can connect to debhost using ssh, from each of your VM's

    Answer INVESTIGATION 3 observations / questions in your lab log book.

    Lab 7 Sign-Off (Show Instructor)

    Follow the submission instructions for lab 7 on Blackboard.

    Time for a new backup and system updates!

    If you have successfully completed this lab, make a new backup of your virtual machines as well as your host machine.

    Perform the Following Steps:

    1. Make certain ALL of your VMs are running.
    2. Make sure you are connected to Seneca's VPN on your Windows host.
    3. Switch to your debhost VM and change to your user's bin directory.
    4. Issue the Linux command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab7-check.bash
    1. Give the lab7-check.bash file execute permissions (for the file owner).
    2. Run the shell script and if there are any warnings, make fixes and re-run shell script until you receive "Congratulations" message.
    3. Upload a screenshot of proof from the previous step to Blackboard, as per your Professor's instructions.

    Practice For Quizzes, Tests, Midterm, and Final Exam

    1. What port does sshd use by defaults?
    2. What file is used to configure sshd?
    3. What kind of files are stored in the "~/.ssh/" directory?
    4. How do you determine whether the ssh service is running on your system or not?
    5. What is the purpose of the ~/.ssh/known_hosts file?
    6. What is the purpose of the ~/.ssh/authorized_keys file?
    7. How do you stop the ssh service?
    8. How do you tunnel XWindows applications?
    9. What port is the default ssh port?
    10. What port(s) is/are used by httpd service?
    - + \ No newline at end of file diff --git a/A-Labs/lab8.html b/A-Labs/lab8.html index e74718c..492ef26 100644 --- a/A-Labs/lab8.html +++ b/A-Labs/lab8.html @@ -14,13 +14,13 @@ Lab 8 | OPS245 - Open System Server - +
    Skip to main content

    Lab 8: Setup and Configure a DHCP Server

    Lab Preparation

    DO NOT START THIS LAB BEFORE SUCCESSFULLY SUBMITTING LABS 1-7: This lab will change some system values that make previous lab checks fail. For best results, confirm with your professor before proceeding.

    Overview

    There are different ways in which computers can be networked together. Some computer networks (such as computer labs) configure their workstations for static IP addresses for security and to provide other interesting features such as WOL (Wake Up on Lan) which allows a signal from a computer system to remotely start all or specified workstations within the lab.

    DHCP Pic

    WiFi Hot-spots offer the ability for users to connect to the Internet (via DHCP) from their mobile devices (notebooks, netbooks, tablets, or smart phones). Finally, there are hybrid networks consisting of computers configured with static IP addresses, usually servers, and computers configured via DHCP usually desktop computers and mobile devices.

    In lab6, you learned to connect your VMs to a network using a fixed IP Address. In this final lab, you will learn to set-up a DHCP server to automatically assign IP Addresses to our various VM's.

    Main Objectives

    • To install, configure, and test Internet Systems Consortium's (ISC's) DHCP Server.
    • To obtain log information from DHCP server including lease address information.
    • To lease the same IP address every-time from VM boot-up (instead of having DHCP server randomly assign IP address).

    Note: The Internet Software Consortium has recently deprecated the ISC DHCP Server and provides the modern Kea DHCP Server as the suggested software to replace it. For now we will learn about the Legacy version as it remains widely deployed. You can expect that over time that the newer to become widely used.

    Minimum Required Materials

    • Solid State Drive
    • USB key (for backups)
    • Lab 8 Log Book

    Linux Command Reference

    Networking Utilities

    Managing Services

    Additional Utilities

    Configuration Files

    Investigation 1: Install And Configure A DHCP Server

    This lab will have you configure a DHCP server. The term DHCP stands for Dynamic Host Configuration Protocol. DHCP allows computers (eg. workstations, notebooks, smart-phones) to be automatically configured to communicate over the TCP/IP network. This automatic configuration is absolutely required on any network with mobile devices. Other network devices such as Wireless Routers can provide dynamic configuration. This should be taken into account when designing your network. DHCP configuration allows for various setups including: Dynamic, Automatic, and Static allocation.

    DORA

    The term DORA best describes how DHCP Works:

    TermUsage
    DiscoveryThe client broadcasts a message (IP lease request) on a sub-network to discover available DHCP servers.
    OfferThe DHCP server receives the request from the client, reserves an IP ADDRESS for the client and sends a DHCPOFFER to the client.
    RequestAfter receiving a DHCPOFFER, the DHCP client broadcasts a message request for acceptance (DHCPREQUEST) to all DHCP servers and, in doing so, the DHCP client notifies all DHCP servers which DHCP server this DHCP client is requesting acceptance from.
    AcknowledgementThe DHCP server identified in the DHCPREQUEST sends a message of acceptance to the client and the client then receives from that DHCP server a packet of information containing the lease duration and other configuration information.

    Part 1: Installation of the DHCP Server

    VM Backups and System Updates

    caution

    Before proceeding with this lab make certain that you have backed-up your VM's from lab7, and then perform a update on all VMs

    Perform the following steps:

    1. Launch your debhost machine and your deb3 VM.

    2. Switch to your deb3 VM and start a sudo shell.

      • The version of DHCP server that comes with Debian is maintained and distributed by the Internet Software Consortium (https://www.isc.org/). The source package that you can download from ISC includes not only the DHCP server, but also a DHCP client and a DHCP relay agent. Debian separates it into two .deb packages: the isc-dhcp-client package and the isc-dhcp-server package. The client package is installed by default by the workstation installation.
    3. To check if you have the packages installed:

    # To check if you have the server package installed
    dpkg -l isc-dhcp-server

    # To check if you have the client package installed
    dpkg -l isc-dhcp-client
    1. Install the dhcp server package:
    # Install dhcp server
    apt install isc-dhcp-server

    The service will attempt to start right away but will fail because it is not configured properly.

    1. Find out what your network interface is called
    # Display network interfaces
    ip --brief link
    1. Edit the file /etc/default/isc-dhcp-server and add your interface
    INTERFACESv4="enp1s0"
    1. List the files installed by the package
    # List files installed from a package
    dpkg -L isc-dhcp-server | less

    deb3dhcpfiles

    You can see the location of the IPv4 config file and you can also see that in the documentation directory there is an example file.

    It is worthwhile to investigate the documentation directory of a package. They often contain useful information about the package including Debian specific information.

    Part 2: Configuring the DHCP Server

    Perform the following steps:

    1. Remain in your deb3 VM for this section.
    2. Click on the following link to access the online manual page for the dhcpd.conf file to gain an understanding of the parameters being modified

    The dhcpd.conf file allows the Linux system administrator to customize the DCHP server. Generally, this file contains global settings (options that apply throughout the entire network) and subnet declarations (options that apply only to that subnet). Whenever changes are made to this file, the DCHP service will need to be reloaded to allow new settings to take effect.

    NOTE: Any errors in this file (such as typos or missing semi-colons) can cause the DHCP server not to restart!

    1. Edit the /etc/dhcp/dhcpd.conf file and examine the top section of the file.

    Change the existing global options with the newer values shown below, if the dhcpd.conf file is empty, add them manually:

    # option definitions common to all supprted networks...
    option domain-name "ops245.org";
    option domain-name-servers 192.168.245.1;
    default-lease-time 600;
    max-lease-time 3600;
    • Note: Any values for time are stated in seconds.
    • Note: Carefully check for errors (check for missing semicolons).

    Part 3: Configuring the DHCP Server to lease dynamic addresses to our network

    Perform the following steps:

    1. Remain in your deb3 VM for this section. (and in a sudo shell)
    2. Edit /etc/dhcp/dhcpd.conf
    3. Review the file for example subnet declarations.
    4. Note the syntax and the directive for range, and the option for routers (gateway).

    basicsubnet

    At a minimum, the subnet declaration must include:

      - Subnet address
    - Subnet Netmask
    - Default Gateway Address (option routers)
    - A range of valid addresses that can be leased to DHCP clients

    NOTE: When declaring ranges of addresses it is important to consider that often there are multiple DHCP servers on the network. Each should be configured with unique ranges. In other words the ranges cannot overlap or you could have 2 clients recieve the same address.

    dhcpsubnet

    Subnet declarations can also supply additional options or override global parameters and options

    1. Now, add a new subnet declaration for your virtual network:

      • The network address/netmask is: 192.168.245.0/24
      • The range of available host addresses should be from: 51 to 60
      • The Default Gateway (routers) for the virtual network is: 192.168.245.1
    2. Save your editing session, and exit the text editor.

    Before attempting to start the service, in another terminal, monitor the system journal, displaying entries as they are added in real time.

    If there are any errors in the dhcp.conf file when you start the service they will be recorded in the system journal.

    1. Open another terminal window (Tip: ssh into your deb3 VM from your debhost and start a sudo shell) and issue the following command:
    # Monitor system journal in real time
    journalctl -f -u isc-dhcp-server
    • This will show you the last entries for the unit isc-dhcp-server and continue to display new entries as they are added to the journal for confirmation and troubleshooting.
    1. In your deb3 terminal, attempt to start the isc-dhcp-service service.
    2. You should see new lines being added to the journal.

    dhcpstart

    1. If the service starts successfully you should see success messages in the journal.
    2. If the service fails to start any error messages will be added to the journal.

    Troubleshooting Tip:

    Troubleshooting produces the best results when you are methodical in your approach.

    Often a single error can generate multiple error messages as the configuration file is parsed:

    • Troubleshoot the first error message before working on subsequent errors.
    • When you think you have fixed the first error try to start your service and if it fails again check the journal for the next error message.
    • Fix one error at a time and try again until all errors are resolved.
    1. If your service failed, read the errors and attempt to fix your configuration file.
    2. If your service starts successfully, try to generate errors by editing the configuration file and introduce an error by removing a semicolon and closing curly bracket.

    dhcperrors

    Note: When a line number is identified as the source of the error, it doesn't mean that the error is actually on that line. This is the line it was parsing when it decided that there was an error. The error could be on a preceding line. So start at the line and read up when searching for the error.

    1. Restart your service and observe the error messages generated. This is good practice to learn how to trouble-shoot and solve errors.
    2. Make certain that you have corrected all errors, and that your service starts properly.
    3. Reboot deb3 and start a sudo shell
    4. Confirm that the service successfully started at boot time.

    dhcpd

    The process that actually is running is called dhcpd

    1. Check the status of your network ports to see which port is being used by the dhcpd process.
    # Show active tcp/udp ports
    ss -atunp

    dhcpdports

    Part 4: Testing the DHCP server

    Identifying DHCP Lease Transaction Information

    Recall that the initial DHCP lease transaction consists of 4 broadcast packets, DISCOVER, OFFER, REQUEST and ACKNOWLEDGE. A DHCP lease renewal transaction consists of just 2 unicast packets, REQUEST and ACKNOWLEDGE. You can monitor the system journal for evidence of these transactions.

    Perform the following steps:

    1. Use your deb1 and deb3 VMs for this section.
    2. Connect to deb3 via ssh from debhost and monitor the journal
    # Monitor journal for dhcp entries
    sudo journalctl -f -u isc-dhcp-server
    1. On your deb1 VM, Graphically change the configuration of your network interface to receive dynamic address configuration and Apply
    2. Logout and restart your deb1 VM.
    3. Observe the messages that get added to the journal deb1 VM starts. You should see output similar to the following:

    dhcplease

    1. On your deb1 VM, open a terminal, and confirm the IP address assignment using
    ip address show
    1. Has the IP Address changed? If so, how has the IP Address been assigned according to the dhcpd.conf file settings?
    2. Because the setting for default-lease-time was set to 600 seconds. (10 minutes) address renewal should occur every 5 minutes (50% of lease time)
    3. Continue to monitor the journal until you see the REQUEST and ACK message of a renewal.

    dhcprenew

    Part 5: Configuring the DHCP server to continually lease the same IP Address to the client

    Reserving IP Addresses with DHCP

    Devices on a DHCP network will often be configured with different leased IP addresses. Especially mobile devices. Sometimes however it is better to configure a host with an address that does not change. Allowing for DNS registrations for example.

    Even though DHCP gives out IP address dynamically, it also has the ability to reserve an IP address for a certain computer. In this sense it's almost as if the client computer has a static IP even though it uses DHCP to get it. This is useful if you want to be able to put entries in your /etc/hosts file and not have to worry about the entry becoming invalid over time. In Linux we refer to this as supplying a fixed address to a host. Microsoft calls it a reservation.

    Perform the following steps:

    1. Remain in your deb1 and deb3 VMs for this section.
    2. On the deb3 VM in a sudo shell edit the /etc/dhcp/dchpd.conf file
    3. Examine the file and look for the examples of a host declaration

    dhcphostex1

    DHCP host declarations allow individual DHCP client devices on the network to receive configuration settings that are specific to that device. For example, a reserved IP address, but also other settings.

    dhcpfixedaddress

    When a DHCP client requests an address from DHCP server part of the request packet includes the clients Hardware or MAC address as an identifying value. This allows a DHCP server to deliver specific configurations to specific devices.

    1. Get the hardware (MAC) address of deb1
    # Show network interfaces
    ip --brief link

    macaddr

    1. Create a host declaration with the name: deb1

      • Set the hardware ethernet option for the MAC address of your deb1 VM.
      • Set the fixed-address option to the ip address: 192.168.245.42

    Note: When supplying fixed-address it is important that the address assigned is exclusive of any ranges that have been declared. Otherwise it may be possible for 2 different hosts to receive the same address.

    dhcpdconf

    1. Restart the isc-dhcp-server service
    2. Test the address assignment by disconnecting and reconnecting your interface on deb1 using the following commands:
    # Bring the interface down
    sudo ip link set enp1s0 down

    # Bring the interface up
    sudo ip link set enp1s0 up

    # Show IP address
    ip --brief address

    deb1fixedip

    Answer INVESTIGATION 1 observations / questions in your lab log book.

    Investigation 2: Obtaining Lease Records on the Server and Client

    Part 1: Obtaining Leased Address Information on the server

    Purpose of dhcpd.leases File

    The dhcpd process records address leases records in the file /var/lib/dhcp/dhcpd.leases. If the service is restarted it reads in the file contents to know which addresses are currently leased and for how long.

    Perform the following steps:

    1. Remain in your deb1 and deb3 VMs for this section.
    2. If your deb3 DHCP server successfully issued the proper IP address configuration values to deb1, check the file called: /var/lib/dhcp/dhcpd.leases in your deb3 VM. You should get the similar contents:

    dhcpdleases

    Part 2: Obtaining Leased Address Information on the client

    1. On the client deb1 check the contents of the /var/lib/dhcp directory. The dhclient.leases file in this directory is where the dhclient stores its record of leases.

      • NOTE: If there are no files, then in a shell in your deb1 VM issue the command: sudo dhclient enp1s0
      • Then check to see if there is file containing lease information in that directory. You should get the similar contents:

    dhclientleases

    Answer INVESTIGATION 2 observations / questions in your lab log book.

    Lab 8 Sign-Off (Show Instructor)

    Follow the submission instructions from your Professor for lab 8 on Blackboard.

    Time for a new backup!

    If you have successfully completed this lab, make a new backup of your virtual machines as well as your host machine.

    Perform the Following Steps:

    1. Make certain ALL of your deb1 and deb3 VMs are running.
    2. Switch to your debhost VM and change to your user's bin directory.
    3. Issue the Linux command:
    wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab8-check.bash
    1. Give the lab8-check.bash file execute permissions (for the file owner).
    2. Run the shell script and if any warnings, make fixes and re-run shell script until you receive "congratulations" message.
    3. Follow your Professors instructions for submitting the lab.

    Practice For Quizzes, Tests, Midterm, and Final Exam

    1. What protocol and port does dhcp use?
    2. What file is used to configure dhcpd?
    3. Can a dhcp server also be a dhcp client?
    4. What is the difference between max-lease-time and default-lease-time?
    5. What unit of measurement does default-lease-time require?
    6. What dhcp option is used for configuring a default gateway?
    7. What is the parameter range in the DHCP server configuration file used for?
    8. What is the purpose of a dhcp relay agent?
    9. Why might a dhcp relay agent be required?
    - + \ No newline at end of file diff --git a/B-Assignments/assignment1.html b/B-Assignments/assignment1.html index 4ad6ac6..b5c6b9f 100644 --- a/B-Assignments/assignment1.html +++ b/B-Assignments/assignment1.html @@ -14,13 +14,13 @@ Assignment 1 | OPS245 - Open System Server - +
    Skip to main content

    Assignment 1

    caution

    Do NOT start working on this assignment unless specifically told to do so by your Professor!!

    • This assignment is currently out of date
    • Your Professor may choose to use a different assignment

    The purpose of OPS245 assignments is to showcase your abilities in the course thus far, and conduct a bit of independent research. Some of what you'll be asked to complete will be familiar to you, while other parts will require you to think a bit and do some light Googling. It's expected you won't have all the answers right away, but you can find them. As a result, unlike labs, your professor cannot provide any help or troubleshooting for your assignment.

    This assignment will be completed inside your local c7host virtual machine using additional KVM/QEMU nested VMs.

    Weight: 15% of your overall grade

    Due Date: Refer to your section's Blackboard announcements.

    Create a new virtual machine

    1. Install a new CentOS Minimal VM. (Do not install the GUI version.)
    2. The virtual machine name and the internal hostname for the machine must be your Seneca username. (Example: cjohnson30)
    3. The regular user created during installation must also be your Seneca username.
    4. Ensure LVM is used in your installation partitioning.

    The rest of this assignment should be done after the installation is completed successfully.

    Package Management

    Research the rpm and yum commands to:

    1. Verify the integrity of a package using rpm to see if any of its files have been altered since installation. (you will be asked to demonstrate this when your assignment is marked, it doesn't matter which package you choose)
    2. Demonstrate the install, run, and removal of any rpm package. This means during the demonstration you will show the download, install, and run of any rpm-based package, after doing so show the removal of that package proving that previously installed rpm package is no longer available after removal.
    3. Add the EPEL repository to the yum configuration.

    Alternate Software Installation

    Review the yum group* commands and use them to:

    1. Find and install the Cinnamon desktop environment. Feel free to use the power of Google.
    2. Do the rest of the assignment (including the assignment submission) while running Cinnamon. (Hint: Think about default targets.)

    Lab 3 contains practice in compiling source code. It is recommended you refer to these procedures for compiling and installing software from source code and use them to:

    1. Download and extract the source code for ISO Master.
    2. Compile and install it (you will need gtk2-devel installed).
    3. Run it and have a look at the Help/About dialog box. You will have to change the contents of that box.
    4. Edit the file about.c in the source you use earlier, and change "An application for editing ISO9660 images based on the bkisofs access library and the GTK2 GUI toolkit." to "An application used by YOURNAME for OPS245 Assignment 1".
    5. Compile and install the application again, exactly the same way you did the first time. Your change should be simple enough that complicated bugs are unlikely.
    6. Check that your changes appear in the application.

    Install a Second Linux Distribution as a Virtual Machine

    • Create another virtual machine.
    • The virtual machine name and the hostname for the machine must be your learn user ID followed by -mint. For example asmith15-mint
    • Install Linux Mint as the OS for the new virtual machine (VMWare).

    Submission

    Submit screenshots that show you've completed the work.

    Rubric

    TaskMaximum markActual mark
    New CentOS VM installed (Seneca username)1
    Correct hostname (Seneca username)1
    Using LVM (run lsblk to check)1
    Add, run, and removal of a rpm package1
    Adding EPEL to list of available repositories1
    RPM integrity verification command2
    Command to display repository information2
    Using Cinnamon2
    Modified ISO Master about dialog box2
    Second VM installed and running Linux Mint2
    Second VM using proper hostname1
    Screenshots clearly show you've completed the work4
    Total20
    - + \ No newline at end of file diff --git a/B-Assignments/assignment2.html b/B-Assignments/assignment2.html index 629d10d..8aee8c0 100644 --- a/B-Assignments/assignment2.html +++ b/B-Assignments/assignment2.html @@ -14,13 +14,13 @@ Assignment 2 | OPS245 - Open System Server - +
    Skip to main content

    Assignment 2

    caution

    Do NOT start working on this assignment unless specifically told to do so by your Professor!!

    • This assignment is currently out of date
    • Your Professor may choose to use a different assignment

    Instructions

    You will have received your instructions by email. If you have not done so, contact your professor immediately.

    Due Date

    This assignment is due by midnight on April 12th.

    Submission

    Run this script on your c7host machine. It will generate output for you to upload to blackboard. Make sure you also upload your script.

    Marking

    Shortly before the due date, a rubric will be posted here. The assignment is worth 15% of your final mark.

    Questions & Clarifications

    1. You must install the system-storage-manager package on your assignment VM.
    2. The root user on your c7host must also be able to ssh to your assignment VM.
    3. Seneca's email server might add extra text to any ip addresses in your instructions. It starts with https://protect-us.mimecast.com/, then a string of random characters, then /domain=. Ignore that, and only use the ip addresses.
    4. Your c7host must be able to ssh to your assignment machine.
    5. If your assignment VM does not have the interface name given in the assignment instructions, use the interface you have.
    6. Your iptables rules must persist past the machine rebooting.
    7. Hint: The vgextend command can only add physical volumes to a pre-existing volume group. You need a different command to create a new volume group.
    - + \ No newline at end of file diff --git a/C-ExtraResources/bash-shell-reference-guide.html b/C-ExtraResources/bash-shell-reference-guide.html index 89a3d10..d0a7353 100644 --- a/C-ExtraResources/bash-shell-reference-guide.html +++ b/C-ExtraResources/bash-shell-reference-guide.html @@ -14,13 +14,13 @@ Bash Shell Reference Guide | OPS245 - Open System Server - +
    Skip to main content

    Bash Shell Reference Guide

    Variables

    Environment

    • System-wide or "global" variable
    • Usually appear in UPPERCASE letters
    • Can view with command: set | more
    • $ in front to expand variable to value
    • Examples: USER, PATH, HOME, SHELL

    User-defined

    • Variable created by user (command line, scripting)

    • Examples:

      • myVar="my value"; readonly myVar; export myVar
      • read -p "enter value: " myVar

    Command Substitution

    • Useful method to expand output from a command to be used as an argument for another command.

    • Examples:

      • file $(ls)
      • set $(ls);echo $#;echo $*
      • echo "hostname: $(hostname)"

    if / elif / else statements

    • If a command runs (even pipeline command like to grep to match) will be true (0); otherwise, false (non-zero), thus can use with logic statements.
    • Example:
    if echo $myVar | grep "match"
    then
    echo "Match"
    fi
    • The test command is used to test conditions. Square brackets [ ] is short-cut for test command (args contained inside with spaces). The exit command can be used to terminate the shell script with a false value.
    • Example:
    if [ $USER = "root" ]
    then
    echo "You must be root"
    exit1
    fi
    • For numberic comparison, use the test options: -gt,-ge, -lt, -le, -eq, -ne
    • Example:
    if [ $grade -gt 79 ]
    then
    echo "You get Good Mark"
    elif [ $grade -gt 49 ]
    then
    echo "You pass"
    else
    echo "You fail"
    fi
    • For testing for file information, you can use -d to test if directory pathname exists, and -f if the file pathname exists. You can use ! for negation.
    • Examples:
    if [ -d directory-pathname ]
    then
    echo "directory exists"
    fi

    if [ ! - f file-pathname ]
    then
    echo "File does not exist"
    fi
    - + \ No newline at end of file diff --git a/C-ExtraResources/bash-shell-scripting-tips.html b/C-ExtraResources/bash-shell-scripting-tips.html index edd9013..35d5273 100644 --- a/C-ExtraResources/bash-shell-scripting-tips.html +++ b/C-ExtraResources/bash-shell-scripting-tips.html @@ -14,13 +14,13 @@ Bash Shell Scripting Tips | OPS245 - Open System Server - +
    Skip to main content

    Bash Shell Scripting Tips

    For Lab 5 Investigation 1 Part 2

    Using awk to Manipulate Text

    • Very useful command for report generation, text file repair, or text and floating-point decimal manipulation. The command mimics a C program, with braces { } that surround the action to perform based on records from a database file matching either test conditions, regular expressions, etc. Fields appear as numbers with $.
    • Examples:
    awk '{print}' data-file.txt
    awk -F";" '{print $5,$3}' data-file.txt
    awk -F"," '$4 >= 10000 {print $1, $2}' salary.txt

    Crontab (Chronograph Tables)

    • Used to automatically run (as opposed to manually run) scripts, programs, or commands. There are many tables (files), but the main one is: /etc/cron. The crontab command can be used to list, create, modify or remove scheduled jobs in the file.
    • Examples:
    crontab -e -u user # create/modify
    crontab -r -u user-name # remove specific user's crontab
    crontab -l -u username #List current schedules
    - + \ No newline at end of file diff --git a/C-ExtraResources/bash-shell-tips.html b/C-ExtraResources/bash-shell-tips.html index ddd6f0b..13d6495 100644 --- a/C-ExtraResources/bash-shell-tips.html +++ b/C-ExtraResources/bash-shell-tips.html @@ -14,13 +14,13 @@ Bash Shell Tips | OPS245 - Open System Server - +
    Skip to main content

    Bash Shell Tips

    For Lab 2 - Investigation 3 Part 3

    Data Input

    • A shell can obtain data from a number of methods: reading input files, using arguments when issuing command (positional parameters), or prompting for data to store in a variable. The later method can be accomplished by using the read command.
    • Example:
    read -p "Enter your name: " userName.

    Mathematical Expressions

    • In the bash shell, data is stored in variable as text, not other data types (ints, floats, chars, etc) like in compiled programs like C or Java. In order to have a shell perform mathematical operations, number or variable need to be surrounded by two sets of parenthesis ((..)) in order to convert a number stored as text to a binary number.
    • Examples
    var1=5;var2=10
    echo "$var1 + $var2 = $((var1+var2))"

    Note: shell does not perform floating point calculations (like 5/10). Instead, other commands like awk or bc would be required for floating point calculations (decimals)

    For Lab 3 - Investigation 3 Part 3

    Using sed to Manipulate Text

    • The Linux command sed stands for Streaming Editor which is an effective way to manipulate a text file, output sent from a command, or from within a "here document". This command can manipulate matching text on a variety of criteria (such as line number(s), regular expression match, etc). Commands can then be used for manipulation such as omitting, printing, substituting, adding, and inserting text.
    • The sed option -n suppresses display of text so the print (p) command can be used; otherwise, the text will be displayed (with edits via the sed command instructions).
    • Results of text manipulation with sed can be stored in a variable using command substitution, or redirected to a file. NEVER redirect the stdout from a sed command to the same input file (or the input file will be destroyed)!
    • Examples
    sed 's/|/ /g' <<+
    I|like|weekends!
    +
    sed 's/$/\n/g' <<+
    This text
    should be
    double-spaced!
    +
    - + \ No newline at end of file diff --git a/C-ExtraResources/python-scripting-tips.html b/C-ExtraResources/python-scripting-tips.html index 5b68af1..392ed7c 100644 --- a/C-ExtraResources/python-scripting-tips.html +++ b/C-ExtraResources/python-scripting-tips.html @@ -14,13 +14,13 @@ Python Scripting Tips | OPS245 - Open System Server - +
    Skip to main content

    Python Scripting Tips

    String Methods

    • The string data type has a number of methods that we can use on it to get a modified version of the data a string variable holds.

    • Note that these don't change the existing string, just return a copy of it with some change. You can store this updated copy in a variable, or use it in a command.

    • Some examples include:

      • find() - locates a value (e.g. another string) if it is in this string.
      • lower() - convert the entire string to lower-case
      • replace() - finds a value in the string, and replaces it with a different value.
      • split() - breaks the string up on a value, and returns a list.
      • strip() - removes leading and trailing whitespace
      • upper() - convert the entire string to upper-case
    • There are many more options than this, but you will get a lot of utility out of these.

    Methods in General

    • Python is an object oriented programming language. In this course, that won't actually affect us much, but it does change how you run some commands.
    • In bash, every command ran on its own (while you might provide the command some arguments, or pipe different data into it). In python, the modules we import, and the types of variables we use can (will) have commands built into them. For example: converting all letters in a string to UPPER CASE).
    • While you could write a command in bash that would do that and pass it a variable holding a series of letters as an argument, in python that behaviour (and more) is built into the string type of variable.
    • The actions that are built into types are called methods. To use a method on a variable just add .methodname() to the end of the variable. Instead of getting back the value, you'll get something else (based on what that method does). Suppose we had a variable called course that currently had the value 'ops245'. Course codes are usually written in ALL-CAPS, so instead of just saying print(course), we could say print(course.upper())
    - + \ No newline at end of file diff --git a/C-ExtraResources/scripting-exercise.html b/C-ExtraResources/scripting-exercise.html index 07fbcaf..1d28b8d 100644 --- a/C-ExtraResources/scripting-exercise.html +++ b/C-ExtraResources/scripting-exercise.html @@ -14,13 +14,13 @@ Scripting Exercise | OPS245 - Open System Server - +
    Skip to main content

    Scripting Exercises

    Things on this page

    Terminal vs script file

    A shell script is nothing more than a sequence of shell commands. Any command you put in a shell script can be executed just as well in a terminal. In fact no matter how complex your script is - you can run the entire thing from a terminal window without executing the script.

    Runnning a command

    • How to run a command in the current directory or another directory or a directory in the $PATH
    • That programs you run need to have execute permission
    • What your $PWD is, pwd command
    • Check the return code from a command by examining $?

    Variables

    • How to create a variable and set a value in it
    • How to get the value from a variable
    • Differences in how bash and python handle variables

    Getting input from the user

    • The read command in bash
    • the input() function in python

    Quotes

    • Why use single or double quotes
    • The difference between single and double quotes
    • Backquotes

    Redirecting output

    • How to redirect output from a command to a file
    • How to pipe output from one command to another command

    Basic commands

    • cat
    • grep
    • cut

    Conditional statements

    Bash

    • if
    • test, [

    Python

    • Python has conditional statements, we just haven't covered them yet.

    Exercises

    You can do these exercises in any order, and change them in any way you like.

    • Create a bash script that will print Hello, then list the contents of the / directory, then print Good Bye.

      • Create a python script that does the same thing.
    • Create a bash script that will run your other script twice.

      • Run this new script from different locations, and see if it always works. Fix it if it doesn't.
    • Create a bash script to display the contents of /etc/sysconfig/network-scripts/ifcfg-ens33

      • Pipe the output to cat
        • Pipe that output to cat. See if you understand why that doesn't seem to do anything
    • Create a bash script which will use cat and grep to find the line with BOOTPROTO in /etc/sysconfig/network-scripts/ifcfg-ens33

      • Modify that script so that it doesn't need cat anymore.
    • Create a bash script in which you will create a variable called BP.

      • Assign to that variable the value BOOTPROTO="dhcp" (the equal sign and quotes are part of the value).
      • Use the cut command to retrieve the part between the double-quotes (in this case that's: dhcp).
      • Save the result in a variable, and print that variable.
    • Combine the two scripts above into one. The script should tell you what the value of BOOTPROTO from /etc/sysconfig/network-scripts/ifcfg-ens33 is.

    • Create a python script that will prompt the user for the name of the interface they want to search (e.g. ens33), then prompt them for the parameter they wish to see.

      • Store the responses from the user in variables and use them to grep the appropriate file for the parameter the user asked for. Display it's current value.
      • Note: As we have not covered conditional statements or loops in python yet, you can assume the user always provides usable responses.
    • Use the ls and wc commands to find how many log files there are in /var/log/

      • Add a grep command to find how many of a certain type of log file there are (e.g. vmware-network log files)
    • Use the history and grep commands to find any command you ran in the past that contained a certain keyword (like .sh or cat)

    • Write a bash script which will use the whoami, hostname, date, and lvs commands to create a report.txt file containing all that information.

      • Set it up so that the date (in YYYY-MM-DD format) is in the filename of the report, e.g. report-YYYY-MM-DD.txt
    • Write a bash script that will ask the user for a process name, will check whether that process is running, and if it is: it will print "The process is running". If it isn't: it will print "The process is not running".

      • Modify that script to include the number of processes with that name that are running.
    • Write a script that will use a for loop and the cut command to get a list of usernames from the /etc/passwd file and print one username perline.

      • For each user: using an if statement check whether the directory /home/thatusername exists and then each line will look like: "user1: home directory does not exist" or "user2: home directory exists".
      • Instead of checking for /home/thatusername check for the home directory in the passwd file line for that user.
    - + \ No newline at end of file diff --git a/C-ExtraResources/tips.html b/C-ExtraResources/tips.html index f41e521..587c19d 100644 --- a/C-ExtraResources/tips.html +++ b/C-ExtraResources/tips.html @@ -14,13 +14,13 @@ Tips | OPS245 - Open System Server - +
    Skip to main content

    Tips

    Important Information

    Follow Lab Instructions from the Menu Bar on the Left

    Do NOT use a Net-search to get to the OPS245 notes. You might be sent to an older OPS245 lab that is outdated and will NOT be accepted for lab sign-off!

    All lab instructions used for OPS245 are the pages in the Labs folder on the left side menu

    Read, Read, Read!

    The majority of problems that students face with performing these labs are not following steps in the correct order. If in doubt, it is recommended to ask for assistance to confirm prior to proceeding.

    Can't Graphically Login to Host Machine

    If you get a message about the gnome-power-manager configuration at the login screen, you may have run out of disk space. Switch to a character-mode virtual terminal (for example, switch to VT2 by pressing Ctrl-Alt-F2). Login and take a look at the available space (with the command: df -h). If the / filesystem is full, delete some files (such as unused VM images in /var/lib/libvirt/images) and then reboot the system.

    Bring all of these supplies to each class.

    Even after installation, the Live CD and Installation DVD may be required.

    Place your Full Name and Contact Information on the hard disk tray cover and directly on the disk drive.

    Use an adhesive label and permanent marker, or a white marker on the black cover. No label - no marks for your labs.

    Always "double-check" that you have removed your hard disk tray prior to exiting the lab room.

    You may have your hard drive tray stolen which will result in lost work!

    Do not share your OPS245 disk drive with another course.

    The work you do in other courses may damage the Linux parts on your drive.

    Earlier labs become the foundation for later labs.

    Seemingly "small errors", or "skipping instructions" in earlier labs can have negative consequences when performing other dependent labs. Make backups when requested at the end of labs for "restoration points" in case something goes wrong while performing a lab.

    Always shut down your system under software control, rather than using the reset or power buttons.

    You can shutdown using the GUI or with the poweroff, reboot, init, or shutdown commands. Shut down your virtual machines before shutting down your main system.

    Failure to Listen to these Tips

    Failure to listen to lab "suggestions" by this resource could result in loss of work... (see your reaction below)

    Desk Flip Rage

    - + \ No newline at end of file diff --git a/assets/js/9af68f33.4f295be7.js b/assets/js/9af68f33.4f295be7.js deleted file mode 100644 index 4e9a98f..0000000 --- a/assets/js/9af68f33.4f295be7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkOPS245_db=self.webpackChunkOPS245_db||[]).push([[632],{3905:function(e,t,a){a.d(t,{Zo:function(){return m},kt:function(){return d}});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(a),d=r,c=u["".concat(s,".").concat(d)]||u[d]||k[d]||o;return a?n.createElement(c,i(i({ref:t},m),{},{components:a})):n.createElement(c,i({ref:t},m))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var p=2;p\n\n# To enable a service\nsudo systemctl enable \n\n# To start a service\nsudo systemctl start \n\n# To enable and start a service at the same time\nsudo systemctl enable --now \n\n# To disable a service\nsudo systemctl disable \n\n# To stop a service\nsudo systemctl stop \n\n# To restart a service\nsudo systemctl restart \n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'Issue the correct commands to make sure that the "libvirtd" service is both "active" (started) and "enabled" (will start automatically at boot)'),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nThe behaviour of the ",(0,r.kt)("strong",{parentName:"p"},"libvirtd")," service on Debian Linux is for the service to stop when not in use and restart when required.")),(0,r.kt)("blockquote",{parentName:"li"})),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'In order to manage VMs your user account needs to be added to the "libvirt" group'))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo usermod -aG libvirt \n")),(0,r.kt)("ol",{start:7},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Restart your debhost virtual machine"),". If you fail to do this, you may experience virtualization network problems and issues loading Virtual Machine Manager.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Once you've restarted, confirm your changes took affect by running the following as your regular user (don't use sudo):"))),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"systemctl status libvirtd")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"id"))),(0,r.kt)("p",null,"The ",(0,r.kt)("em",{parentName:"p"},"libvirtd")," daemon should be running, and the ",(0,r.kt)("em",{parentName:"p"},"id")," command should show that your user is part of the ",(0,r.kt)("strong",{parentName:"p"},"libvirt")," group."),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Start the graphical ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),' tool by clicking "Activities " and searching for "virt-manager".'),(0,r.kt)("li",{parentName:"ol"},'Right click on the icon and "Pin to dash" and then run the application or by typing the command ',(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager")," (without sudo!)"),(0,r.kt)("li",{parentName:"ol"},'Confirm that "debhost" is configured to allow nested virtualisation:')),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If you have an ",(0,r.kt)("strong",{parentName:"p"},"Intel"),' CPU, run the following command. The output of this command should be "Y":'),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo cat /sys/module/kvm_intel/parameters/nested\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If you have an ",(0,r.kt)("strong",{parentName:"p"},"AMD"),' CPU, run the following command. The output of this command should be "1":'),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo cat /sys/module/kvm_amd/parameters/nested\n")))),(0,r.kt)("ol",{start:12},(0,r.kt)("li",{parentName:"ol"},"If ",(0,r.kt)("em",{parentName:"li"},"neither"),' of these files outputs the Y or 1, or if you get a "No such file or directory" error, this means nested virtualization ',(0,r.kt)("strong",{parentName:"li"},"has not been successfully enabled on debhost"),".")),(0,r.kt)("h3",{id:"part-2-troubleshooting-nested-virtualization"},"Part 2: Troubleshooting Nested Virtualization"),(0,r.kt)("p",null,"If you confirmed nested virtualization works in debhost in ",(0,r.kt)("em",{parentName:"p"},"Part 1, Step 11")," above, you can skip Part 2 and move on to Investigation 2."),(0,r.kt)("p",null,"Let's run through some common reasons why nested virtualization may not be working for your computer, and how to go about fixing them. Keep in mind, this is not an exhaustive list, and ",(0,r.kt)("em",{parentName:"p"},"you may have more than one of these issues at the same time"),". Just because you fixed one doesn't mean there aren't other problems."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Important Warning:")," Nested virtualization is ",(0,r.kt)("em",{parentName:"p"},"REQUIRED")," for this course."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Double-check you haven't introduced any typos when running the commands from Part 1, Step 11."),(0,r.kt)("li",{parentName:"ol"},"At the VMware Workstation level, open the settings for your debhost VM and check if ",(0,r.kt)("strong",{parentName:"li"},"Virtualize Intel VT-x/EPT or AMD-V/RDI")," is enabled. If not, enable it and try Part 1, Step 11 again. You'll need to fully shut down debhost to change this setting. (Refer to Lab 1, Investigation 1, Part 5, Step 26 for further details.)"),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"On non-Seneca, personal computers running Windows 11:"),' If you get an error from VMware that "Virtualization is not supported" (or something similar), you will need to do a bit of online research to fix this issue, as we cannot officially provide tech support for non-Seneca hardware. That said, here are some good places to start:',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"In Windows' Device Security settings, disable ",(0,r.kt)("strong",{parentName:"li"},"Memory Integrity")," and any other Core Isolation protections. (You are doing so at your own risk.) Restart your computer."),(0,r.kt)("li",{parentName:"ul"},"In ",(0,r.kt)("em",{parentName:"li"},"Windows Features"),", disable all Hyper-V related options. Restart your computer."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"On non-Seneca, personal computers running macOS:")," Due to hardware design limitations, nested virtualization is ",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)("em",{parentName:"strong"},"not possible"))," for M1/M2/M3-based Apple computers at this time. However, nested virtualization will work if you have an older, Intel-based Mac. Check your system's profiler for more details. "),(0,r.kt)("li",{parentName:"ol"},"Ask your fellow classmates for help. Many others have run into this issue and they may be able to show you how to fix it!")),(0,r.kt)("h2",{id:"investigation-2-install-nested-virtual-machines-kvm"},"Investigation 2: Install Nested Virtual Machines (KVM)"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Keep the root password the same for Host and VMs")),(0,r.kt)("p",{parentName:"blockquote"},"In order to simplify running the lab checking scripts in future labs, using the same root password for ALL machines (debhost and virtual machines). Also use the same username and passwords for all of your machines (debhost and virtual machines).")),(0,r.kt)("h3",{id:"part-1-setting-up-the-virtual-network"},"Part 1: Setting up the Virtual Network"),(0,r.kt)("p",null,"Once we have installed our 3 VM's we will want to configure them to be able to communicate on the same network.\nKVM has setup a default virtual network for us to use but it is not configured to start automatically. We will also need to make sure the correct firewall and routing rules are added so that everything works.\nLets start by gathering information"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Open a terminal window in debhost and run the following command to display the networks that debhost is connected to.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List the networks connected and our IP address for each network interface\nip address\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"ipaddr",src:a(9949).Z,width:"953",height:"298"})),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Run the following command to list the current firewall/routing rules. (Note: Running ",(0,r.kt)("em",{parentName:"li"},"iptables")," as a regular user without sudo will make it look like the command doesn't exist. It's there.)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List the iptables rules\nsudo iptables -L\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"iptables1",src:a(7176).Z,width:"571",height:"279"})),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Open virt-manager"),(0,r.kt)("li",{parentName:"ol"},"Select the QEMU/KVM connection and then click on Edit --\x3e Connection Details"),(0,r.kt)("li",{parentName:"ol"},"Select the Virtual Networks tab"),(0,r.kt)("li",{parentName:"ol"},'Check the "Autostart: On Boot" and then click Apply'),(0,r.kt)("li",{parentName:"ol"},"Close virt-manager and reboot. You can use the command ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo reboot")," or the graphical option."),(0,r.kt)("li",{parentName:"ol"},"Open a terminal window and rerun the previous commands to list network addresses and iptables rules\n",(0,r.kt)("img",{alt:"ipaddr2",src:a(5982).Z,width:"1116",height:"392"}),(0,r.kt)("img",{alt:"iptables2",src:a(899).Z,width:"892",height:"933"}),"\nYou can see that debhost has connected to the virtual network and iptables rules have been added to configure access to that network.")),(0,r.kt)("h3",{id:"part-2-installing-deb1"},"Part 2 Installing deb1"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb1"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Network Install with Graphical Desktop Environment"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb1.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 15GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 2")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),' It would be best to download a local copy of the Debian "netinst" ISO'),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("a",{parentName:"p",href:"https://www.debian.org/download"},"Download Debian"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Launch ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),"."),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("strong",{parentName:"li"},"Create a new VM icon")," located near the top left-corner of the application window."),(0,r.kt)("li",{parentName:"ol"},"Select the ",(0,r.kt)("strong",{parentName:"li"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image"),(0,r.kt)("li",{parentName:"ol"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"li"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"li"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vmsource",src:a(1092).Z,width:"469",height:"446"})),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"If a ",(0,r.kt)("strong",{parentName:"li"},'"search permissions"')," dialog box opens, Check ",(0,r.kt)("strong",{parentName:"li"},'"Don\'t ask about these directories again"')," and click ",(0,r.kt)("strong",{parentName:"li"},"yes"))),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"searchperms",src:a(6364).Z,width:"402",height:"266"})),(0,r.kt)("ol",{start:7},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"p"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"p"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"p"},"2"),", then click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".\n",(0,r.kt)("img",{alt:"memcpu",src:a(2758).Z,width:"450",height:"450"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"p"},"15")," GB and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"p"},"deb1"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"p"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Finish"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"p"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"p"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"p"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"p"},"Begin Installation")," at the top left-hand side.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'When the installer starts select ""Graphical Install" and press enter'),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"NOTES")),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},'To have the VM "capture" the keyboard and mouse input click on the viewer window'),(0,r.kt)("li",{parentName:"ul"},"To release the keyboard and mouse from the VM use ",(0,r.kt)("strong",{parentName:"li"},"left-ctrl+left-alt")),(0,r.kt)("li",{parentName:"ul"},"To make the VM easier to display, click on ",(0,r.kt)("strong",{parentName:"li"},"View --\x3e Scale Display --\x3e Always")," > ",(0,r.kt)("img",{alt:"scale",src:a(1647).Z,width:"1044",height:"376"}))))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"English")," as the language")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as the location")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"American English")," as the keyboard")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter a ",(0,r.kt)("strong",{parentName:"p"},"Hostname")," of ",(0,r.kt)("strong",{parentName:"p"},"deb1"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave the ",(0,r.kt)("strong",{parentName:"p"},"Domain name"),": ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Do NOT set a root password")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," > ",(0,r.kt)("strong",{parentName:"p"},"Remember to user the same username and password on all of your VM's")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Full name"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Username"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"password")," twice.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Eastern")," time zone")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When asked for ",(0,r.kt)("strong",{parentName:"p"},"Partitioning method"),": choose ",(0,r.kt)("strong",{parentName:"p"},"Guided - use entire disk and setup LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Virtual disk 1(vda)"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"All files in one partititon"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disk and configure LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Accept the default ",(0,r.kt)("strong",{parentName:"p"},"Amount of volume group to use for guided partitioning"),"\n",(0,r.kt)("img",{alt:"deb1part",src:a(2926).Z,width:"1031",height:"794"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Your storage should be configured as shown above. Select ",(0,r.kt)("strong",{parentName:"p"},"Finish partitioning and write changes to disk"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disks"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Scan extra installation media"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as your ",(0,r.kt)("strong",{parentName:"p"},"Debian archive mirror country"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"deb.debian.org")," as your ",(0,r.kt)("strong",{parentName:"p"},"Debian archive mirror:"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave ",(0,r.kt)("strong",{parentName:"p"},"HTTP proxy information")," as ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Participate in the package survey"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On the ",(0,r.kt)("strong",{parentName:"p"},"Software Selection Screen")," uncheck ",(0,r.kt)("strong",{parentName:"p"},"Gnome")," and select ",(0,r.kt)("strong",{parentName:"p"},"Cinnamon")," instead. Also select ",(0,r.kt)("strong",{parentName:"p"},"SSH Server"),"\n",(0,r.kt)("img",{alt:"softsel",src:a(2137).Z,width:"1032",height:"798"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Install the GRUB boot loader"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"/dev/vda")," as the ",(0,r.kt)("strong",{parentName:"p"},"Device for boot loader installation"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the installation is complete ",(0,r.kt)("strong",{parentName:"p"},"Reboot")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou may need to go into the VM details and remove the media from the ",(0,r.kt)("strong",{parentName:"p"},"CDROM")," device")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Repeat the steps as you did in Lab 1 to ",(0,r.kt)("strong",{parentName:"li"},"set the root account password"),", ",(0,r.kt)("strong",{parentName:"li"},"perform a system update"),", and ",(0,r.kt)("strong",{parentName:"li"},"disable AppArmor"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the following command to obtain the IPv4 address for your deb1 VM to record in your Lab 2 logbook:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ip address show\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Explore the Cinnamon Desktop Environment.")),(0,r.kt)("h3",{id:"part-3-installing-deb2-non-graphical-install"},"Part 3: Installing deb2 (Non-Graphical Install)"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Network Install with TTY (command line) Interface only"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb2.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 20GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 1")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create the VM (called ",(0,r.kt)("strong",{parentName:"p"},"deb2"),") as you did with the ",(0,r.kt)("strong",{parentName:"p"},"deb1")," VM.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Launch ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Click the ",(0,r.kt)("strong",{parentName:"p"},"Create a new VM icon")," located near the top left-corner of the application window.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"p"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"p"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"p"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"p"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"p"},"1"),", then click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"p"},"20")," GB and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"p"},"deb2"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"p"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Finish"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"p"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"p"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"p"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"p"},"Begin Installation")," at the top left-hand side.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'When the installer starts select ""Graphical Install" and press enter')),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"English")," as the language")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as the location")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"American English")," as the keyboard")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter a ",(0,r.kt)("strong",{parentName:"p"},"Hostname")," of ",(0,r.kt)("strong",{parentName:"p"},"deb2"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave the ",(0,r.kt)("strong",{parentName:"p"},"Domain name"),": ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Do NOT set a root password")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," > ",(0,r.kt)("strong",{parentName:"p"},"Remember to user the same username and password on all of your VM's")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Full name"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Username"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"password")," twice.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Eastern")," time zone")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When asked for ",(0,r.kt)("strong",{parentName:"p"},"Partitioning method"),": choose ",(0,r.kt)("strong",{parentName:"p"},"Guided - use entire disk and setup LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Virtual disk 1(vda)"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Separate /home partition"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disk and configure LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Accept the default ",(0,r.kt)("strong",{parentName:"p"},"Amount of volume group to use for guided partitioning"),"\n",(0,r.kt)("img",{alt:"deb2part",src:a(7740).Z,width:"1061",height:"564"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disks"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Scan extra installation media"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Participate in the package survey"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On the ",(0,r.kt)("strong",{parentName:"p"},"Software Selection Screen")," uncheck ",(0,r.kt)("strong",{parentName:"p"},"Debian desktop environment")," and ",(0,r.kt)("strong",{parentName:"p"},"Gnome"),". Also add the selection ",(0,r.kt)("strong",{parentName:"p"},"SSH Server"),"\n",(0,r.kt)("img",{alt:"softsel2",src:a(5616).Z,width:"1340",height:"647"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Install the GRUB boot loader"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"/dev/vda")," as the ",(0,r.kt)("strong",{parentName:"p"},"Device for boot loader installation"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the installation is complete ",(0,r.kt)("strong",{parentName:"p"},"Reboot")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou may need to go into the VM details and remove the media from the ",(0,r.kt)("strong",{parentName:"p"},"CDROM")," device")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"First change the ",(0,r.kt)("strong",{parentName:"li"},"tty")," display font.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Reconfigure the console font\nsudo dpkg-reconfigure console-setup\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"deb3tty",src:a(6450).Z,width:"467",height:"575"})),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"UTF-8")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"Latin1")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"Terminus")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"11x22"))),(0,r.kt)("p",null,"You can experiment with different settings for Font and Font size."),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Repeat the steps as you did in Lab 1 to ",(0,r.kt)("strong",{parentName:"li"},"set the root account password"),", ",(0,r.kt)("strong",{parentName:"li"},"perform a system update"),", and ",(0,r.kt)("strong",{parentName:"li"},"disable AppArmor"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the following command to obtain the IPv4 address for your ",(0,r.kt)("strong",{parentName:"li"},"deb2")," VM to record in your Lab 2 logbook:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ip address show\n")),(0,r.kt)("h3",{id:"part-4-installing-deb3-using-a-preseed-file"},"Part 4: Installing deb3 using a preseed file"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb3"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Automated Install with preseed file (command line) Interface only"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb3.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Preseed URL"),": ",(0,r.kt)("a",{parentName:"li",href:"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg"},"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 15GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 1")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Preseed Installations")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"READ")," the first 6 sections of the following ",(0,r.kt)("a",{parentName:"li",href:"https://wiki.debian.org/DebianInstaller/Preseed"},"Debian wiki Document"))),(0,r.kt)("p",null,"Preseed files can be be quite complex and difficult to create from scratch. Debian provides an example preseed file that documents the default settings."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.debian.org/releases/stable/example-preseed.txt"},"Example preseed file")),(0,r.kt)("p",null,"We are going to use this ",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg"},"preseed file")," to install our ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VM."),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Read")," the preseed file and answer the following questions")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"What locale will be chosen?"),(0,r.kt)("li",{parentName:"ul"},"What mirror will be used?"),(0,r.kt)("li",{parentName:"ul"},"Will the root account be enabled?"),(0,r.kt)("li",{parentName:"ul"},'What is the regular user account "Full Name"?'),(0,r.kt)("li",{parentName:"ul"},"What is the regular user account name?"),(0,r.kt)("li",{parentName:"ul"},"what is the regular user's password?"),(0,r.kt)("li",{parentName:"ul"},"Will the account have access to ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo"),"?"),(0,r.kt)("li",{parentName:"ul"},"What time zone will be selected?"),(0,r.kt)("li",{parentName:"ul"},"Will the ssh server be installed?"),(0,r.kt)("li",{parentName:"ul"},"What will the hostname be?"),(0,r.kt)("li",{parentName:"ul"},"What partitions or LVM volumes will be created?")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Create the VM (called ",(0,r.kt)("strong",{parentName:"li"},"deb3"),") as you did with the ",(0,r.kt)("strong",{parentName:"li"},"deb2")," VM."),(0,r.kt)("li",{parentName:"ol"},"Launch ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),"."),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("strong",{parentName:"li"},"Create a new VM icon")," located near the top left-corner of the application window."),(0,r.kt)("li",{parentName:"ol"},"Select the ",(0,r.kt)("strong",{parentName:"li"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image"),(0,r.kt)("li",{parentName:"ol"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"li"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"li"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Set ",(0,r.kt)("strong",{parentName:"li"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"li"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"li"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"li"},"1"),", then click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Set ",(0,r.kt)("strong",{parentName:"li"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"li"},"15")," GB and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"li"},"deb3"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"li"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Finish"),"."),(0,r.kt)("li",{parentName:"ol"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"li"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"li"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"li"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"li"},"Begin Installation")," at the top left-hand side."),(0,r.kt)("li",{parentName:"ol"},"When the installer starts hit the ",(0,r.kt)("strong",{parentName:"li"},"ESC")," key to access the ",(0,r.kt)("strong",{parentName:"li"},"boot:")," prompt"),(0,r.kt)("li",{parentName:"ol"},"At the ",(0,r.kt)("strong",{parentName:"li"},"boot:")," prompt enter the following and type enter")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"auto url=https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"deb3boot",src:a(5410).Z,width:"1102",height:"320"})),(0,r.kt)("p",null,"The installer should start and will perform an auto install using the information in the ",(0,r.kt)("strong",{parentName:"p"},"preseed")," file. When ",(0,r.kt)("strong",{parentName:"p"},"deb3")," reboots login to the ",(0,r.kt)("strong",{parentName:"p"},"tty")," as the user ",(0,r.kt)("strong",{parentName:"p"},"ops245"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Follow the same procedure to set the TTY(console) font to your preference."),(0,r.kt)("li",{parentName:"ol"},"Create a new regular user account and password that matches your other VM's (We will learn more about these commands in a future lab)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'# Create the user\nsudo useradd -m -s /bin/bash -c "Full Name" \n\n# Set the users password\nsudo passwd \n\n# Add the user to the sudo group\nsudo usermod -aG sudo \n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Type ",(0,r.kt)("inlineCode",{parentName:"li"},"exit")," to logout and then login as the new user"),(0,r.kt)("li",{parentName:"ol"},"Test ",(0,r.kt)("strong",{parentName:"li"},"sudo")," access using the command ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo whoami")),(0,r.kt)("li",{parentName:"ol"},"Follow the same process as you did for previous VM's to enable the ",(0,r.kt)("strong",{parentName:"li"},"root")," account, perform an update, and disable the apparmor service")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 2 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"investigation-3-managing-virtual-machines-kvm"},"Investigation 3: Managing Virtual Machines (KVM)"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Root Privileges")),(0,r.kt)("p",null,"As part of this investigation you will learn how to switch over to the root account in order to run several privileged commands in sequence. It can be tempting to just use this technique all the time, and never have to worry about sudo, but do ",(0,r.kt)("strong",{parentName:"p"},"not")," do so. It undermines the security of your system. Use it only when you need it."),(0,r.kt)("h3",{id:"part-1-backing-up-virtual-machines"},"Part 1: Backing Up Virtual Machines"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),'\nTaking the time to backup the image of the Virtual Machines filesystem allows the user to return to a "',(0,r.kt)("strong",{parentName:"p"},"restoration point"),'" using the ',(0,r.kt)("strong",{parentName:"p"},"gunzip")," command."),(0,r.kt)("p",{parentName:"blockquote"},"This allows us to recover in case something bad occurs during a Lab!"),(0,r.kt)("p",{parentName:"blockquote"},"Failure to take the time to make and confirm backups can result in loss of lab work for the student!"),(0,r.kt)("p",{parentName:"blockquote"},"There are three general steps to back up your Virtual Machines:"),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"Shutdown the VM"),(0,r.kt)("li",{parentName:"ul"},"Create a compressed copy of your ",(0,r.kt)("strong",{parentName:"li"},"Disk Images")," using the ",(0,r.kt)("strong",{parentName:"li"},"gzip")," command."),(0,r.kt)("li",{parentName:"ul"},"Backup the VM xml configuration using the ",(0,r.kt)("strong",{parentName:"li"},"virsh")," shell command."))),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command is a command line tool/shell for managing VM's"),(0,r.kt)("p",null,"We use it to connect to the hypervisor and then interact with our VM's"),(0,r.kt)("p",null,"In order to use the ",(0,r.kt)("strong",{parentName:"p"},"virsh")," command as a regular user to connect to our VM's we must configure an ENVIRONMENT variable."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Edit the file ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.bashrc")," as your regular user on ",(0,r.kt)("inlineCode",{parentName:"li"},"debhost")),(0,r.kt)("li",{parentName:"ol"},"Add the following to the file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# virsh connection variable\nexport LIBVIRT_DEFAULT_URI='qemu:///system'\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Logout and login again to ",(0,r.kt)("inlineCode",{parentName:"li"},"debhost"))),(0,r.kt)("p",null,"The following example ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," commands will be useful"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List all running (active) VM's\nvirsh list\n\n# List all inactive VM's\nvirsh list --inactive\n\n# List all VM's (active or not)\nvirsh list --all\n\n# Start a VM\nvirsh start \n\n# Shutdown a VM\nvirsh shutdown \n\n# Force off a VM (if shutdown fails)\nvirsh destroy \n\n# Display the xml data that defines the VM configuration\nvirsh dumpxml \n")),(0,r.kt)("p",null,"To view the VM in a window without launching ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Open VM in viewer window\nvirt-viewer &\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Shut down your ",(0,r.kt)("strong",{parentName:"p"},"deb1"),", ",(0,r.kt)("strong",{parentName:"p"},"deb2"),", and ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VMs. (Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command)"),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou can shutdown the VM's from the user interface, (For ",(0,r.kt)("em",{parentName:"p"},"deb2")," and ",(0,r.kt)("em",{parentName:"p"},"deb3"),", which are CLI-only, you can issue the following command to shutdown: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo poweroff"),", or you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command.\nPlease be patient, the VMs will shut down!"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create a directory for your backups. ",(0,r.kt)("inlineCode",{parentName:"p"},"mkdir ~/backups"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the command ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh dumpxml deb1")),(0,r.kt)("p",{parentName:"li"},"This command will output the xml data that is used to define (create) this VM\nIf we save this output we could use that xml data to recreate the VM")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the command ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh dumpxml deb1 > ~/backups/deb1.xml")," to save a copy of the output.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter 2 more commands to save the xml data for ",(0,r.kt)("inlineCode",{parentName:"p"},"deb2")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"deb3")),(0,r.kt)("p",{parentName:"li"},"Backing up the xml data only has to be done when the VM is created, or if the configuration is modified.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We will need to use elevated privileges to backup our disk image files from the default location of ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/libvirt/images/"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Use the command ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo -i")," and enter your password if prompted."))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("inlineCode",{parentName:"p"},"sudo -i")," will start a new shell as the root user, you can run a number of commands and then type ",(0,r.kt)("inlineCode",{parentName:"p"},"exit")," to return to your previous shell.")),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Change to the images directory: ",(0,r.kt)("inlineCode",{parentName:"p"},"cd /var/lib/libvirt/images/"),". Note that you did not need to use sudo, as you are already using elevated permissions.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type ",(0,r.kt)("inlineCode",{parentName:"p"},"ls -lh")," to see the contents")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"To make a compressed copy of your ",(0,r.kt)("strong",{parentName:"p"},"deb1.qcow2"),", ",(0,r.kt)("strong",{parentName:"p"},"deb2.qcow2"),", and ",(0,r.kt)("strong",{parentName:"p"},"deb3.qcow2")," files we will use the ",(0,r.kt)("inlineCode",{parentName:"p"},"gzip")," command."),(0,r.kt)("p",{parentName:"li"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"gzip")," command will compress the file in place and rename the file with a ",(0,r.kt)("inlineCode",{parentName:"p"},".gz")," extension.\nHowever, this will make the file unusable and doesn't create a copy. We will use STDIN and STDOUT redirection to overcome this.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Issue the commands:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"gzip < deb1.qcow2 > ~YourRegularUsername/backups/deb1.qcow2.gz\n\ngzip < deb2.qcow2 > ~YourRegularUsername/backups/deb2.qcow2.gz\n\ngzip < deb3.qcow2 > ~YourRegularUsername/backups/deb3.qcow2.gz\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE"),': Make certain to use the redirection signs "<" and "',">",'" properly in the command!'),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Please be patient")),(0,r.kt)("p",{parentName:"blockquote"},"It may look like the command prompt is stuck but it could take a while for gzip to compress an entire operating system."),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"NOTE"),": Do ",(0,r.kt)("strong",{parentName:"p"},"NOT")," press ",(0,r.kt)("inlineCode",{parentName:"p"},"c")," to cancel this process. If you do, your archive will become incomplete and your recovery will be corrupt.")),(0,r.kt)("ol",{start:13},(0,r.kt)("li",{parentName:"ol"},"Compare the size of the compressed and original files (hint: use ",(0,r.kt)("inlineCode",{parentName:"li"},"ls -lh"),"). If file is very large (like 15GB), you didn't compress it and you need to remove that file and perform the previous step until you get it right!"),(0,r.kt)("li",{parentName:"ol"},"Once you are ",(0,r.kt)("strong",{parentName:"li"},"sure you have all three VM disk images backed up"),", use the ",(0,r.kt)("inlineCode",{parentName:"li"},"exit")," command to revert back to your normal user.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vmbackup",src:a(3142).Z,width:"601",height:"316"})),(0,r.kt)("h3",{id:"part-2-testing-the-backup"},"Part 2: Testing the backup"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start the ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VM and login."),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," ",(0,r.kt)("strong",{parentName:"p"},"THIS WILL DESTROY YOUR SYSTEM")),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"Make certain that you are in your ",(0,r.kt)("inlineCode",{parentName:"strong"},"deb3")," VM and not in ",(0,r.kt)("inlineCode",{parentName:"strong"},"debhost"),"!")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type this command inside the deb3 virtual machine: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo rm -rf /*")," (ignore error messages).")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type the command ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo poweroff"),", try other commands.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Force the VM to poweroff and restart")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the machine restarts it will not boot since all system files have been removed!")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Use the ",(0,r.kt)("strong",{parentName:"p"},"Force Off")," option to turn deb3 back off.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Run ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager")," right click on the ",(0,r.kt)("inlineCode",{parentName:"p"},"deb3")," VM and select ",(0,r.kt)("strong",{parentName:"p"},"Delete")," make sure that ",(0,r.kt)("strong",{parentName:"p"},"Delete associated storage file")," is selected and ",(0,r.kt)("strong",{parentName:"p"},"Delete")),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"deb3")," is now completely gone. Time to test the backup!")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"To restore the VM configuration:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List all VM's\nvirsh list --all\n\n# Define a VM from xml data\nvirsh define ~/backups/deb3.xml\n\n# List all VM's\nvirsh list --all\n")),(0,r.kt)("ol",{start:8},(0,r.kt)("li",{parentName:"ol"},"To restore the ",(0,r.kt)("inlineCode",{parentName:"li"},"deb3")," disk image file:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Start a sudo shell\nsudo -i\n\n# Change to images directory\ncd /var/lib/libvirt/images\n\n# Restore file\ngunzip < ~YourRegularUserName/backups/deb3.qcow2.gz > deb3.qcow2\n\n# Return to previous shell\nexit\n\n")),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Start the ",(0,r.kt)("inlineCode",{parentName:"li"},"deb3")," VM and login to make sure it was successfully restored")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Shutting Down the Host while Virtual Machines are Running")),(0,r.kt)("p",{parentName:"blockquote"},"If you shut down your host system while virtual machines are running, they will be suspended, and will resume the next time you boot your host system. Note that it is better to shut down the VMs prior to shutting down the host")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"For the remainder of these labs, it is assumed that you will backup ",(0,r.kt)("strong",{parentName:"li"},"both")," the images and XML configuration files for ",(0,r.kt)("strong",{parentName:"li"},"all"),' Virtual machines, when asked to backup your virtual machines. It is also highly recommended to backup these files to an external storage device (eg. USB key) in case the host machine gets "wiped" and you need to rebuild your HOST machine and then restore your Virtual Machines...'),(0,r.kt)("li",{parentName:"ol"},"Answer this question in your log book:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In order to fully back up a virtual machine, what information should be saved in addition to the virtual machine image?")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 3 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"investigation-4-using-shell-scripts-for-vm-backup--management"},"Investigation 4: Using Shell Scripts for VM Backup & Management"),(0,r.kt)("p",null,"You will continue our use of Bash Shell scripting by first creating a Bash Shell script that will allow the Linux sysadmin to select their created VMs for backup. Afterwards you will download, view and run a couple of Bash Shell scripts that use the virsh command to start and stop your virtual machines."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Please check out these ",(0,r.kt)("a",{parentName:"strong",href:"/OPS245-db/C-ExtraResources/bash-shell-scripting-tips"},"Bash Shell Scripting Tips")," first before continuing with the following steps")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Start the ",(0,r.kt)("strong",{parentName:"li"},"deb1")," virtual machine, and stop the ",(0,r.kt)("strong",{parentName:"li"},"deb2")," and ",(0,r.kt)("strong",{parentName:"li"},"deb3")," virtual machines."),(0,r.kt)("li",{parentName:"ol"},"Switch to the ",(0,r.kt)("strong",{parentName:"li"},"debhost")," machine, and open a shell terminal."),(0,r.kt)("li",{parentName:"ol"},"Enter these admin commands into your ",(0,r.kt)("strong",{parentName:"li"},"debhost")," machine and note the result:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list --all\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list --inactive\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Now, shut-down your deb1 VM normally, and close the deb1 VM window."),(0,r.kt)("li",{parentName:"ol"},"Switch to your terminal and issue the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh start deb1\n")),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Using the appropriate command check to see if your deb1 VM is now running."),(0,r.kt)("li",{parentName:"ol"},"There are other commands that can be used (such as ",(0,r.kt)("strong",{parentName:"li"},"suspend"),", or ",(0,r.kt)("strong",{parentName:"li"},"shutdown"),'). The "shutdown" command may not always work since it relies on the guest handling a particular ACPI event. Why do you think it is useful to have commands to manipulate VMs?'),(0,r.kt)("li",{parentName:"ol"},"Since this is a text-based version of Linux, you do not need to turn off the screen-saver.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Virtual Machine Does not Shutdown from Command")),(0,r.kt)("p",null,"If the Virtual machine fails to shutdown from the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh shutdown")," command, then you can go to the ",(0,r.kt)("strong",{parentName:"p"},"Virtual Machine manager")," and ",(0,r.kt)("strong",{parentName:"p"},"halt")," or ",(0,r.kt)("strong",{parentName:"p"},"shutdown")," within the VM itself, then you can click the ",(0,r.kt)("strong",{parentName:"p"},"PowerOff")," button in the VM window. You'll want to avoid a forced shutdown since those are equivalent to yanking the power cord out of the wall on a physical machine!"),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Open a Bash shell terminal and login as root."),(0,r.kt)("li",{parentName:"ol"},"Use a text editor (such as ",(0,r.kt)("inlineCode",{parentName:"li"},"vi")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"nano"),") to create a Bash Shell script called: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/bin/backupVM.bash")),(0,r.kt)("li",{parentName:"ol"},"Enter the following text content into your file:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'#!/bin/bash\n\n\n# backupVM.bash\n# Purpose: Backup VM images\n#\n# USAGE: ./backupVM.bash\n#\n# Author: *** INSERT YOUR NAME ***\n# Date: *** CURRENT DATE ***\n\nuser=$(whoami)\nif [ $user != "root" ] # only runs if using sudo or root\nthen\n echo "You must run this script with root privileges. Please use sudo" >&2\n exit 1\nfi\n')),(0,r.kt)("ol",{start:12},(0,r.kt)("li",{parentName:"ol"},"Save your editing session, but remain in the text editor."),(0,r.kt)("li",{parentName:"ol"},"This shell script is designed particularly for your deb1, deb2, and deb3 VMS."),(0,r.kt)("li",{parentName:"ol"},"The code displayed below will prompt the user if they wish for all VMs to be backed-up; otherwise, allow the user the option of specifying which VMs to be backed-up. Add the following code.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Make sure you edit the code with the correct username!")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'# Set variables for source path and backup path\nimg_path="/var/lib/libvirt/images/"\nbackup_path="/home/username/backups/"\n\n# prompt if all VMs to be backed-up\nread -p "Backup all VMs? (y|n):" answer\n\n# Backup all VMs if answer is yes\nif [ "$answer" = "y" ]\nthen\n for num in 1 2 3 # Determinant loop for 3 arguments: 1, 2, and 3\n do\n vm="deb${num}"\n echo "Backing up VM ${vm}"\n gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz\n echo "${vm} BACKUP DONE"\n done\n\n# Prompt for VM is answer is no\nelif [ "$answer" = "n" ]\nthen\n read -p "Which VM should be backed up? (1|2|3): " numanswer\n until echo $numanswer | grep "^[123]$" >> /dev/null # Look for match of single digit: 1,2, or 3\n do\n read -p "Invalid Selection. Select 1, 2, or 3: " numanswer\n done\n vm="deb${numanswer}"\n echo "Backing up VM ${vm}"\n gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz\n echo "${vm} BACKUP DONE"\nelse\n echo "Invalid Selection... Aborting program"\n exit 2\nfi\n')),(0,r.kt)("ol",{start:15},(0,r.kt)("li",{parentName:"ol"},"Save, set the permissions, and then run that shell script to backup deb1. Confirm that this script did backup this image to ~/backups"),(0,r.kt)("li",{parentName:"ol"},"What happens if you enter an invalid answer to any of the prompts?"),(0,r.kt)("li",{parentName:"ol"},'You have completed lab2. Proceed to Completing The Lab, and follow the instructions for "lab sign-off".')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 4 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"lab-2-sign-off-show-instructor"},"Lab 2 Sign-Off (Show Instructor)"),(0,r.kt)("p",null,"Follow the submission instructions that your Professor provides."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Backup ALL of your VMs!")),(0,r.kt)("p",null,"If you have successfully completed this lab, make a new backup of all of your virtual machines onto your USB Key."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the Following Steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Use the ",(0,r.kt)("strong",{parentName:"li"},"virsh start")," command to launch all the VMs (",(0,r.kt)("strong",{parentName:"li"},"deb1"),", ",(0,r.kt)("strong",{parentName:"li"},"deb2"),", and ",(0,r.kt)("strong",{parentName:"li"},"deb3"),")."),(0,r.kt)("li",{parentName:"ol"},"Inside each virtual machine, run ",(0,r.kt)("inlineCode",{parentName:"li"},"ip a")," on the command line. Open a Terminal window in deb1 to do so. You'll need the IP address of each machine for the next steps."),(0,r.kt)("li",{parentName:"ol"},"Switch to your ",(0,r.kt)("strong",{parentName:"li"},"debhost")," VM, open a terminal, and change directory to ",(0,r.kt)("strong",{parentName:"li"},"~/bin"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab2-check.bash\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"Give the ",(0,r.kt)("strong",{parentName:"li"},"lab2-check.bash")," execute permissions for the file owner."),(0,r.kt)("li",{parentName:"ol"},'Run the shell script and if there are any warnings, make fixes and re-run shell script until you receive the "Congratulations" message.'),(0,r.kt)("li",{parentName:"ol"},"Follow the submission instructions of your Professor:")),(0,r.kt)("h2",{id:"practice-for-quizzes-tests-midterm--final-exam"},"Practice For Quizzes, Tests, Midterm & Final Exam"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"How do you start and stop virtual machines?"),(0,r.kt)("li",{parentName:"ol"},"What is the purpose of the virsh command?"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly backup your VM's xml data"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly backup your VM's disk images"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly restore your VMs"),(0,r.kt)("li",{parentName:"ol"},"How can you prompt the user for data and store into a variable?"),(0,r.kt)("li",{parentName:"ol"},"Show a few examples of bash loops that can be used to error-check user input."),(0,r.kt)("li",{parentName:"ol"},"What does the command ",(0,r.kt)("strong",{parentName:"li"},"apt update")," do and why is it important?"),(0,r.kt)("li",{parentName:"ol"},"What does the command ",(0,r.kt)("strong",{parentName:"li"},"apt upgrade")," do and why is it important?")))}k.isMDXComponent=!0},5251:function(e,t){t.Z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGuUlEQVR4nO1aCWwUVRj+SqlyCFhEKFCkKIQWihxC5GqhXG05eyEBgSgeBA/kEgkBCsh9eHAGUaiAHEVKu++15UgEFWJENEYFNQoERVFRAbl2puJv/mnfdunstNuytLvtfsmXzM7ue/N//3vz3j/fLOCHH3744YcfflQE6BCqUzoCURVhF0jRBC4z7dlIRlXCtRyEagJXdQliahLXr0s0R1WBLpGuxDsosAtVAXnZ6GMSX8A8Gwagsi96usBXLPZaVjWaPbWdQT4umAUn6DiCUFmhS0xWo/3ySx1owGMx1H94jHHsdCtMQmUE7UdDTeIii/x2Sx1q0DOZzu6oST/vqkH3RyXTN2l18xdEgcuUi8aobNAFNqtRjh/Rm5bPDHeM+rKZ4dRveB/n9WATKhP0bHTWJG6yuD3LQykiblDhfS9B120BFBk/kDJWhKpZ8J+eg66oDKBUVNMkPmVhVzKrUcv+Q0i+0di0A+xf1Yha9B1K/2QGqnOfc1v4OnSJZ5XIOdMiKXlMT5dbIDNxTBTNnRbp+KwJPANfBkkEawJ/sJjT22sZC98PW2tbJqDobzSBvygD98FXoQmssRpdK6a+HElJTrNEk1gNX4QmEKkJ5LGIfatCit7fliy6TmgS/2oC7eFr0CQOO6/we1c2LVG8YtGdQhM4QoQA+Ao0gceVmKUzI4xqz13xVrWClo1R8AVQOu7RJc5x0EWrvNLQuVosmAXnKQd14e3QJJYqEaPHdaPpznV+KcnPCGOf6uq8IC6BN+NGFlpqAnYO9qP1DSi0dwL9nVHdJIxnxsgnulPdbsMNjnqyO53bWcP0O27bNCaBPljbUCVAs+eiNbwVmkAOB2oXAdR5SCxtW9zcJIp3grZxAwmdRt3CyLiBxg5Q9PdbFoVRx0FxdEMEqFvhALwRdhsSVNBrUltRj4T+HKxJUNrCMJN4xa2LzAlj9krqS+vmtnR8tgsMhTeBDqGGLnGag/t9910UEp1Ex98Odilm+gsPWyZgxsR2Ltt8uakeNYxOovO771bnTvE14S3QJVJVsOPHd6Hnn+tsubAtmBJumYCFU1tbtpswobNBxzmB2fAGXN+LZsrhPbYxuOhImbj11VDLBGybn/847IpqZn22MdjhJN/IRZg3GB17ChYnikrqRxvmPVTs1nZkTbBlAo6ucX3bKPI60N15bRF4v0LF59nQVwW3eUEL6jQ4ztgBihPx644gywSc3xlUbFvuu8uQWGNnUOfyBGIrzuGV+JqD+CsjyNivP17foMTixm4D1e2aYhJfr1uK8V1J7T/ZUJ8a90qkP/cUJEvgZIU4ybrENBXUlBc70hNPP1pi8IptBsSbEtC2f7zb7bk6nDbRqcK0YUq5iqcsNNIELvHFT757a83uDmOTo00JiEuJcrs9V423OMkS/5Srk6wLbHGIGRFDK2dZb1+u+My4TqYE8LnS9LHc7CSnlY94ie6GaytB6cuamRxed/jqZHMtsKCYGsAVlc/A3oExCzgmgajycHiP8QUvZwZSWN+hdGB1o1IFblULFFcDWJGd5GYxw+jS3oIHLoEv7uj/DXSBCeri/E5v+NgepQ6a+d3mmhT4yEiHeD7+fpP7a4gz2T9kt9np3Pg7Ip72ob4mcYEvcuq92sbC9+M2a4e3ON7IAq2Y3IIa9kw0uHJqmHGuLH25dJJtaODxBGgS69VFh46KpvnT25YpYMWLu0BnNuSTj2+nL3aS2XVWnzWBtZ4Vn4OO7M5y57lvhtCD/dxzeMuLykkWrzuc5Jv8Os4j4okQoAl8yB1fzapGrQcMpszXmtx20NxHk94JRgVp80B//F4xPHaws5N81CNOsiYwVl1k8YwI452+J0aNxatFsGmvBI/0yU4yv2l23AoSo29v9DNRR5f4hTv7qaD6OpFWxyPBhkQXJqBxlGcSYHKSJX6jg6hX9tGXWKE6ZxNzxqT2HrtvN89qQiFRCYb4tFnmt8W34ySzG+2YBQLLyiTeLhGhCejcyeF191s6vGXl5d2gM2/l7wJ87Kl+uSh6oM+wQidZQLfbEF760RfI5Q7YjW0/KJ62L3nAY0HeabK52mFQfKGTLHGwdKOfjWTV2ao5rahnYj+XDq83k53ktam3OMmJbomndNTUBc7kNwowfLgv3rm3wgWVluxKs3HiNHBnyYZa7kz9eYVZCzC2q6kTO9LCV9r4FNmk4QelIjM3tfjRP44gTeKKcybZ8OBSk1dXXyLHzNuisxbDODmE6iU97l6o6Ol7p6hJ/FniH6/sAonqfz2ViazJ7YXQDz/88MMPP/xAVcD/A7vKkHQBotAAAAAASUVORK5CYII="},2926:function(e,t,a){t.Z=a.p+"assets/images/deb1part-7df8236ca6914350a46d97ecc8562249.png"},7740:function(e,t,a){t.Z=a.p+"assets/images/deb2part-afc7d7f45486a21f7f1b4105cf911426.png"},5410:function(e,t,a){t.Z=a.p+"assets/images/deb3boot-7a1171795c1b10cf24f14802061f317e.png"},6450:function(e,t,a){t.Z=a.p+"assets/images/deb3tty-2e90dc360487f7d20db9d6dcae51e342.png"},9949:function(e,t,a){t.Z=a.p+"assets/images/ipaddr-47a5cc3ce0ae05429175f7e220aed449.png"},5982:function(e,t,a){t.Z=a.p+"assets/images/ipaddr2-90ab0adf6ac42bdab8d637aa4f241ce7.png"},7176:function(e,t,a){t.Z=a.p+"assets/images/iptables1-c85eba8bf6b7d8c106363a7955c86c47.png"},899:function(e,t,a){t.Z=a.p+"assets/images/iptables2-df32a8daf66f54f862ce1faab696e855.png"},3737:function(e,t,a){t.Z=a.p+"assets/images/labenv-9cdc9ec6c2df7d751f585f8f64b73929.png"},1964:function(e,t,a){t.Z=a.p+"assets/images/libvirtdstatus-e31bc28a98e564cc0920ff28b4560a48.png"},2758:function(e,t,a){t.Z=a.p+"assets/images/memcpu-82e2f90ad23c0b4d3b31a6bfce82dd58.png"},1647:function(e,t,a){t.Z=a.p+"assets/images/scale-b0a1316b41c50f8715e7546801182f25.png"},6364:function(e,t,a){t.Z=a.p+"assets/images/searchperms-9f89a5fa7839f7f5d7677fa74346cee2.png"},2137:function(e,t,a){t.Z=a.p+"assets/images/softsel-4b046cb044747458f1516b57f78638c6.png"},5616:function(e,t,a){t.Z=a.p+"assets/images/softsel2-237b4c394227f0547a770cab6b79d7c4.png"},3142:function(e,t,a){t.Z=a.p+"assets/images/vmbackup-3bccd0c117ba1826e789bd908c880016.png"},1092:function(e,t,a){t.Z=a.p+"assets/images/vmsource-63351551fd812f36ad9774343f09e5c1.png"}}]); \ No newline at end of file diff --git a/assets/js/9af68f33.f25e8a4f.js b/assets/js/9af68f33.f25e8a4f.js new file mode 100644 index 0000000..513bd8d --- /dev/null +++ b/assets/js/9af68f33.f25e8a4f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkOPS245_db=self.webpackChunkOPS245_db||[]).push([[632],{3905:function(e,t,a){a.d(t,{Zo:function(){return m},kt:function(){return d}});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},m=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=p(a),d=r,c=u["".concat(s,".").concat(d)]||u[d]||k[d]||o;return a?n.createElement(c,i(i({ref:t},m),{},{components:a})):n.createElement(c,i({ref:t},m))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var p=2;p\n\n# To enable a service\nsudo systemctl enable \n\n# To start a service\nsudo systemctl start \n\n# To enable and start a service at the same time\nsudo systemctl enable --now \n\n# To disable a service\nsudo systemctl disable \n\n# To stop a service\nsudo systemctl stop \n\n# To restart a service\nsudo systemctl restart \n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'Issue the correct commands to make sure that the "libvirtd" service is both "active" (started) and "enabled" (will start automatically at boot)'),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nThe behaviour of the ",(0,r.kt)("strong",{parentName:"p"},"libvirtd")," service on Debian Linux is for the service to stop when not in use and restart when required.")),(0,r.kt)("blockquote",{parentName:"li"})),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'In order to manage VMs your user account needs to be added to the "libvirt" group'))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo usermod -aG libvirt \n")),(0,r.kt)("ol",{start:7},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Restart your debhost virtual machine"),". If you fail to do this, you may experience virtualization network problems and issues loading Virtual Machine Manager.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Once you've restarted, confirm your changes took affect by running the following as your regular user (don't use sudo):"))),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"systemctl status libvirtd")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"id"))),(0,r.kt)("p",null,"The ",(0,r.kt)("em",{parentName:"p"},"libvirtd")," daemon should be running, and the ",(0,r.kt)("em",{parentName:"p"},"id")," command should show that your user is part of the ",(0,r.kt)("strong",{parentName:"p"},"libvirt")," group."),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Start the graphical ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),' tool by clicking "Activities " and searching for "virt-manager".'),(0,r.kt)("li",{parentName:"ol"},'Right click on the icon and "Pin to dash" and then run the application or by typing the command ',(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager")," (without sudo!)"),(0,r.kt)("li",{parentName:"ol"},'Confirm that "debhost" is configured to allow nested virtualisation:')),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If you have an ",(0,r.kt)("strong",{parentName:"p"},"Intel"),' CPU, run the following command. The output of this command should be "Y":'),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo cat /sys/module/kvm_intel/parameters/nested\n"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"If you have an ",(0,r.kt)("strong",{parentName:"p"},"AMD"),' CPU, run the following command. The output of this command should be "1":'),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"sudo cat /sys/module/kvm_amd/parameters/nested\n")))),(0,r.kt)("ol",{start:12},(0,r.kt)("li",{parentName:"ol"},"If ",(0,r.kt)("em",{parentName:"li"},"neither"),' of these files outputs the Y or 1, or if you get a "No such file or directory" error, this means nested virtualization ',(0,r.kt)("strong",{parentName:"li"},"has not been successfully enabled on debhost"),".")),(0,r.kt)("h3",{id:"part-2-troubleshooting-nested-virtualization"},"Part 2: Troubleshooting Nested Virtualization"),(0,r.kt)("p",null,"If you confirmed nested virtualization works in debhost in ",(0,r.kt)("em",{parentName:"p"},"Part 1, Step 11")," above, you can skip Part 2 and move on to Investigation 2."),(0,r.kt)("p",null,"Let's run through some common reasons why nested virtualization may not be working for your computer, and how to go about fixing them. Keep in mind, this is not an exhaustive list, and ",(0,r.kt)("em",{parentName:"p"},"you may have more than one of these issues at the same time"),". Just because you fixed one doesn't mean there aren't other problems."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Important Warning:")," Nested virtualization is ",(0,r.kt)("em",{parentName:"p"},"REQUIRED")," for this course."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Double-check you haven't introduced any typos when running the commands from Part 1, Step 11."),(0,r.kt)("li",{parentName:"ol"},"At the VMware Workstation level, open the settings for your debhost VM and check if ",(0,r.kt)("strong",{parentName:"li"},"Virtualize Intel VT-x/EPT or AMD-V/RDI")," is enabled. If not, enable it and try Part 1, Step 11 again. You'll need to fully shut down debhost to change this setting. (Refer to Lab 1, Investigation 1, Part 5, Step 26 for further details.)"),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"On non-Seneca, personal computers running Windows 11:"),' If you get an error from VMware that "Virtualization is not supported" (or something similar), you will need to do a bit of online research to fix this issue, as we cannot officially provide tech support for non-Seneca hardware. That said, here are some good places to start:',(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"In Windows' Device Security settings, disable ",(0,r.kt)("strong",{parentName:"li"},"Memory Integrity")," and any other Core Isolation protections. (You are doing so at your own risk.) Restart your computer."),(0,r.kt)("li",{parentName:"ul"},"In ",(0,r.kt)("em",{parentName:"li"},"Windows Features"),", disable all Hyper-V related options. Restart your computer."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"On non-Seneca, personal computers running macOS:")," Due to hardware design limitations, nested virtualization is ",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)("em",{parentName:"strong"},"not possible"))," for M1/M2/M3-based Apple computers at this time. However, nested virtualization will work if you have an older, Intel-based Mac. Check your system's profiler for more details. "),(0,r.kt)("li",{parentName:"ol"},"Ask your fellow classmates for help. Many others have run into this issue and they may be able to show you how to fix it!")),(0,r.kt)("h2",{id:"investigation-2-install-nested-virtual-machines-kvm"},"Investigation 2: Install Nested Virtual Machines (KVM)"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Keep the root password the same for Host and VMs")),(0,r.kt)("p",{parentName:"blockquote"},"In order to simplify running the lab checking scripts in future labs, using the same root password for ALL machines (debhost and virtual machines). Also use the same username and passwords for all of your machines (debhost and virtual machines).")),(0,r.kt)("h3",{id:"part-1-setting-up-the-virtual-network"},"Part 1: Setting up the Virtual Network"),(0,r.kt)("p",null,"Once we have installed our 3 VM's we will want to configure them to be able to communicate on the same network.\nKVM has setup a default virtual network for us to use but it is not configured to start automatically. We will also need to make sure the correct firewall and routing rules are added so that everything works.\nLets start by gathering information"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Open a terminal window in debhost and run the following command to display the networks that debhost is connected to.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List the networks connected and our IP address for each network interface\nip address\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"ipaddr",src:a(9949).Z,width:"953",height:"298"})),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Run the following command to list the current firewall/routing rules. (Note: Running ",(0,r.kt)("em",{parentName:"li"},"iptables")," as a regular user without sudo will make it look like the command doesn't exist. It's there.)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List the iptables rules\nsudo iptables -L\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"iptables1",src:a(7176).Z,width:"571",height:"279"})),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Open virt-manager"),(0,r.kt)("li",{parentName:"ol"},"Select the QEMU/KVM connection and then click on Edit --\x3e Connection Details"),(0,r.kt)("li",{parentName:"ol"},"Select the Virtual Networks tab"),(0,r.kt)("li",{parentName:"ol"},'Check the "Autostart: On Boot" and then click Apply'),(0,r.kt)("li",{parentName:"ol"},"Close virt-manager and reboot. You can use the command ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo reboot")," or the graphical option."),(0,r.kt)("li",{parentName:"ol"},"Open a terminal window and rerun the previous commands to list network addresses and iptables rules\n",(0,r.kt)("img",{alt:"ipaddr2",src:a(5982).Z,width:"1116",height:"392"}),(0,r.kt)("img",{alt:"iptables2",src:a(899).Z,width:"892",height:"933"}),"\nYou can see that debhost has connected to the virtual network and iptables rules have been added to configure access to that network.")),(0,r.kt)("h3",{id:"part-2-installing-deb1"},"Part 2 Installing deb1"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb1"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Network Install with Graphical Desktop Environment"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb1.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 15GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 2")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),' It would be best to download a local copy of the Debian "netinst" ISO'),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("a",{parentName:"p",href:"https://www.debian.org/download"},"Download Debian"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Launch ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),"."),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("strong",{parentName:"li"},"Create a new VM icon")," located near the top left-corner of the application window."),(0,r.kt)("li",{parentName:"ol"},"Select the ",(0,r.kt)("strong",{parentName:"li"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image"),(0,r.kt)("li",{parentName:"ol"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"li"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"li"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vmsource",src:a(1092).Z,width:"469",height:"446"})),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"If a ",(0,r.kt)("strong",{parentName:"li"},'"search permissions"')," dialog box opens, Check ",(0,r.kt)("strong",{parentName:"li"},'"Don\'t ask about these directories again"')," and click ",(0,r.kt)("strong",{parentName:"li"},"yes"))),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"searchperms",src:a(6364).Z,width:"402",height:"266"})),(0,r.kt)("ol",{start:7},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"p"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"p"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"p"},"2"),", then click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".\n",(0,r.kt)("img",{alt:"memcpu",src:a(2758).Z,width:"450",height:"450"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"p"},"15")," GB and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"p"},"deb1"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"p"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Finish"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"p"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"p"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"p"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"p"},"Begin Installation")," at the top left-hand side.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'When the installer starts select ""Graphical Install" and press enter'),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"NOTES")),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},'To have the VM "capture" the keyboard and mouse input click on the viewer window'),(0,r.kt)("li",{parentName:"ul"},"To release the keyboard and mouse from the VM use ",(0,r.kt)("strong",{parentName:"li"},"left-ctrl+left-alt")),(0,r.kt)("li",{parentName:"ul"},"To make the VM easier to display, click on ",(0,r.kt)("strong",{parentName:"li"},"View --\x3e Scale Display --\x3e Always")," > ",(0,r.kt)("img",{alt:"scale",src:a(1647).Z,width:"1044",height:"376"}))))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"English")," as the language")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as the location")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"American English")," as the keyboard")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter a ",(0,r.kt)("strong",{parentName:"p"},"Hostname")," of ",(0,r.kt)("strong",{parentName:"p"},"deb1"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave the ",(0,r.kt)("strong",{parentName:"p"},"Domain name"),": ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Do NOT set a root password")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," > ",(0,r.kt)("strong",{parentName:"p"},"Remember to user the same username and password on all of your VM's")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Full name"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Username"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"password")," twice.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Eastern")," time zone")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When asked for ",(0,r.kt)("strong",{parentName:"p"},"Partitioning method"),": choose ",(0,r.kt)("strong",{parentName:"p"},"Guided - use entire disk and setup LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Virtual disk 1(vda)"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"All files in one partititon"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disk and configure LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Accept the default ",(0,r.kt)("strong",{parentName:"p"},"Amount of volume group to use for guided partitioning"),"\n",(0,r.kt)("img",{alt:"deb1part",src:a(2926).Z,width:"1031",height:"794"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Your storage should be configured as shown above. Select ",(0,r.kt)("strong",{parentName:"p"},"Finish partitioning and write changes to disk"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disks"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Scan extra installation media"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as your ",(0,r.kt)("strong",{parentName:"p"},"Debian archive mirror country"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"deb.debian.org")," as your ",(0,r.kt)("strong",{parentName:"p"},"Debian archive mirror:"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave ",(0,r.kt)("strong",{parentName:"p"},"HTTP proxy information")," as ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Participate in the package survey"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On the ",(0,r.kt)("strong",{parentName:"p"},"Software Selection Screen")," uncheck ",(0,r.kt)("strong",{parentName:"p"},"Gnome")," and select ",(0,r.kt)("strong",{parentName:"p"},"Cinnamon")," instead. Also select ",(0,r.kt)("strong",{parentName:"p"},"SSH Server"),"\n",(0,r.kt)("img",{alt:"softsel",src:a(2137).Z,width:"1032",height:"798"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Install the GRUB boot loader"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"/dev/vda")," as the ",(0,r.kt)("strong",{parentName:"p"},"Device for boot loader installation"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the installation is complete ",(0,r.kt)("strong",{parentName:"p"},"Reboot")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou may need to go into the VM details and remove the media from the ",(0,r.kt)("strong",{parentName:"p"},"CDROM")," device")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Repeat the steps as you did in Lab 1 to ",(0,r.kt)("strong",{parentName:"li"},"set the root account password"),", ",(0,r.kt)("strong",{parentName:"li"},"perform a system update"),", and ",(0,r.kt)("strong",{parentName:"li"},"disable AppArmor"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the following command to obtain the IPv4 address for your deb1 VM to record in your Lab 2 logbook:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ip address show\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Explore the Cinnamon Desktop Environment.")),(0,r.kt)("h3",{id:"part-3-installing-deb2-non-graphical-install"},"Part 3: Installing deb2 (Non-Graphical Install)"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Network Install with TTY (command line) Interface only"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb2.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 20GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 1")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create the VM (called ",(0,r.kt)("strong",{parentName:"p"},"deb2"),") as you did with the ",(0,r.kt)("strong",{parentName:"p"},"deb1")," VM.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Launch ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Click the ",(0,r.kt)("strong",{parentName:"p"},"Create a new VM icon")," located near the top left-corner of the application window.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"p"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"p"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"p"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"p"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"p"},"1"),", then click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("strong",{parentName:"p"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"p"},"20")," GB and click ",(0,r.kt)("strong",{parentName:"p"},"Forward"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"p"},"deb2"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"p"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"p"},"Finish"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"p"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"p"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"p"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"p"},"Begin Installation")," at the top left-hand side.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},'When the installer starts select ""Graphical Install" and press enter')),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"English")," as the language")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Canada")," as the location")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"American English")," as the keyboard")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter a ",(0,r.kt)("strong",{parentName:"p"},"Hostname")," of ",(0,r.kt)("strong",{parentName:"p"},"deb2"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Leave the ",(0,r.kt)("strong",{parentName:"p"},"Domain name"),": ",(0,r.kt)("em",{parentName:"p"},"blank"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Do NOT set a root password")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," > ",(0,r.kt)("strong",{parentName:"p"},"Remember to user the same username and password on all of your VM's")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Full name"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"Username"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter your ",(0,r.kt)("strong",{parentName:"p"},"password")," twice.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select the ",(0,r.kt)("strong",{parentName:"p"},"Eastern")," time zone")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When asked for ",(0,r.kt)("strong",{parentName:"p"},"Partitioning method"),": choose ",(0,r.kt)("strong",{parentName:"p"},"Guided - use entire disk and setup LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Virtual disk 1(vda)"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Separate /home partition"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disk and configure LVM"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Accept the default ",(0,r.kt)("strong",{parentName:"p"},"Amount of volume group to use for guided partitioning"),"\n",(0,r.kt)("img",{alt:"deb2part",src:a(7740).Z,width:"1061",height:"564"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Write the changes to disks"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Scan extra installation media"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"No")," to ",(0,r.kt)("strong",{parentName:"p"},"Participate in the package survey"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"On the ",(0,r.kt)("strong",{parentName:"p"},"Software Selection Screen")," uncheck ",(0,r.kt)("strong",{parentName:"p"},"Debian desktop environment")," and ",(0,r.kt)("strong",{parentName:"p"},"Gnome"),". Also add the selection ",(0,r.kt)("strong",{parentName:"p"},"SSH Server"),"\n",(0,r.kt)("img",{alt:"softsel2",src:a(5616).Z,width:"1340",height:"647"}))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"Yes")," to ",(0,r.kt)("strong",{parentName:"p"},"Install the GRUB boot loader"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Select ",(0,r.kt)("strong",{parentName:"p"},"/dev/vda")," as the ",(0,r.kt)("strong",{parentName:"p"},"Device for boot loader installation"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the installation is complete ",(0,r.kt)("strong",{parentName:"p"},"Reboot")),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou may need to go into the VM details and remove the media from the ",(0,r.kt)("strong",{parentName:"p"},"CDROM")," device")))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"First change the ",(0,r.kt)("strong",{parentName:"li"},"tty")," display font.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Reconfigure the console font\nsudo dpkg-reconfigure console-setup\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"deb3tty",src:a(6450).Z,width:"467",height:"575"})),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"UTF-8")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"Latin1")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"Terminus")),(0,r.kt)("li",{parentName:"ol"},"Select ",(0,r.kt)("strong",{parentName:"li"},"11x22"))),(0,r.kt)("p",null,"You can experiment with different settings for Font and Font size."),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Repeat the steps as you did in Lab 1 to ",(0,r.kt)("strong",{parentName:"li"},"set the root account password"),", ",(0,r.kt)("strong",{parentName:"li"},"perform a system update"),", and ",(0,r.kt)("strong",{parentName:"li"},"disable AppArmor"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the following command to obtain the IPv4 address for your ",(0,r.kt)("strong",{parentName:"li"},"deb2")," VM to record in your Lab 2 logbook:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ip address show\n")),(0,r.kt)("h3",{id:"part-4-installing-deb3-using-a-preseed-file"},"Part 4: Installing deb3 using a preseed file"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"VM Details:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Name (and hostname)"),": deb3"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Debian Automated Install with preseed file (command line) Interface only"),":"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"VM Image Pathname"),": /var/lib/libvirt/images/deb3.qcow2"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Preseed URL"),": ",(0,r.kt)("a",{parentName:"li",href:"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg"},"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Memory"),": 2048MB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Disk space"),": 15GB"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CPUs"),": 1")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Preseed Installations")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"READ")," the first 6 sections of the following ",(0,r.kt)("a",{parentName:"li",href:"https://wiki.debian.org/DebianInstaller/Preseed"},"Debian wiki Document"))),(0,r.kt)("p",null,"Preseed files can be be quite complex and difficult to create from scratch. Debian provides an example preseed file that documents the default settings."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.debian.org/releases/stable/example-preseed.txt"},"Example preseed file")),(0,r.kt)("p",null,"We are going to use this ",(0,r.kt)("a",{parentName:"p",href:"https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg"},"preseed file")," to install our ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VM."),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Read")," the preseed file and answer the following questions")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"What locale will be chosen?"),(0,r.kt)("li",{parentName:"ul"},"What mirror will be used?"),(0,r.kt)("li",{parentName:"ul"},"Will the root account be enabled?"),(0,r.kt)("li",{parentName:"ul"},'What is the regular user account "Full Name"?'),(0,r.kt)("li",{parentName:"ul"},"What is the regular user account name?"),(0,r.kt)("li",{parentName:"ul"},"what is the regular user's password?"),(0,r.kt)("li",{parentName:"ul"},"Will the account have access to ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo"),"?"),(0,r.kt)("li",{parentName:"ul"},"What time zone will be selected?"),(0,r.kt)("li",{parentName:"ul"},"Will the ssh server be installed?"),(0,r.kt)("li",{parentName:"ul"},"What will the hostname be?"),(0,r.kt)("li",{parentName:"ul"},"What partitions or LVM volumes will be created?")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Create the VM (called ",(0,r.kt)("strong",{parentName:"li"},"deb3"),") as you did with the ",(0,r.kt)("strong",{parentName:"li"},"deb2")," VM."),(0,r.kt)("li",{parentName:"ol"},"Launch ",(0,r.kt)("inlineCode",{parentName:"li"},"virt-manager"),"."),(0,r.kt)("li",{parentName:"ol"},"Click the ",(0,r.kt)("strong",{parentName:"li"},"Create a new VM icon")," located near the top left-corner of the application window."),(0,r.kt)("li",{parentName:"ol"},"Select the ",(0,r.kt)("strong",{parentName:"li"},"Local install media")," option and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Browse to the location of your ISO image. (probably ~/Downloads) and select the iso image"),(0,r.kt)("li",{parentName:"ol"},"If the Operating System is not auto detected, uncheck the ",(0,r.kt)("strong",{parentName:"li"},'"Automatically detect from the installation media"')," and Choose ",(0,r.kt)("strong",{parentName:"li"},"Debian 11"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Set ",(0,r.kt)("strong",{parentName:"li"},"Memory"),": size to ",(0,r.kt)("strong",{parentName:"li"},"2048")," MB and ",(0,r.kt)("strong",{parentName:"li"},"CPUs")," to ",(0,r.kt)("strong",{parentName:"li"},"1"),", then click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Set ",(0,r.kt)("strong",{parentName:"li"},"Hard Disk")," size to ",(0,r.kt)("strong",{parentName:"li"},"15")," GB and click ",(0,r.kt)("strong",{parentName:"li"},"Forward"),"."),(0,r.kt)("li",{parentName:"ol"},"Enter the Name: ",(0,r.kt)("strong",{parentName:"li"},"deb3"),", AND then select the option: ",(0,r.kt)("strong",{parentName:"li"},"Customize configuration before install"),", and click ",(0,r.kt)("strong",{parentName:"li"},"Finish"),"."),(0,r.kt)("li",{parentName:"ol"},"Another dialog will appear. Click ",(0,r.kt)("strong",{parentName:"li"},"CPUs"),' (or "processors") and on right-side under Configuration select ',(0,r.kt)("strong",{parentName:"li"},"Copy Host CPU Configuration"),", click ",(0,r.kt)("strong",{parentName:"li"},"Apply"),", and then click ",(0,r.kt)("strong",{parentName:"li"},"Begin Installation")," at the top left-hand side."),(0,r.kt)("li",{parentName:"ol"},"When the installer starts hit the ",(0,r.kt)("strong",{parentName:"li"},"ESC")," key to access the ",(0,r.kt)("strong",{parentName:"li"},"boot:")," prompt"),(0,r.kt)("li",{parentName:"ol"},"At the ",(0,r.kt)("strong",{parentName:"li"},"boot:")," prompt enter the following and type enter")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"auto url=https://raw.githubusercontent.com/OPS245/debian-labs/main/deb3-preseed.cfg\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"deb3boot",src:a(5410).Z,width:"1102",height:"320"})),(0,r.kt)("p",null,"The installer should start and will perform an auto install using the information in the ",(0,r.kt)("strong",{parentName:"p"},"preseed")," file. When ",(0,r.kt)("strong",{parentName:"p"},"deb3")," reboots login to the ",(0,r.kt)("strong",{parentName:"p"},"tty")," as the user ",(0,r.kt)("strong",{parentName:"p"},"ops245"),"."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Post Installation Tasks")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Follow the same procedure to set the TTY(console) font to your preference."),(0,r.kt)("li",{parentName:"ol"},"Create a new regular user account and password that matches your other VM's (We will learn more about these commands in a future lab)")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'# Create the user\nsudo useradd -m -s /bin/bash -c "Full Name" \n\n# Set the users password\nsudo passwd \n\n# Add the user to the sudo group\nsudo usermod -aG sudo \n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Type ",(0,r.kt)("inlineCode",{parentName:"li"},"exit")," to logout and then login as the new user"),(0,r.kt)("li",{parentName:"ol"},"Test ",(0,r.kt)("strong",{parentName:"li"},"sudo")," access using the command ",(0,r.kt)("inlineCode",{parentName:"li"},"sudo whoami")),(0,r.kt)("li",{parentName:"ol"},"Follow the same process as you did for previous VM's to enable the ",(0,r.kt)("strong",{parentName:"li"},"root")," account, perform an update, and disable the apparmor service")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 2 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"investigation-3-managing-virtual-machines-kvm"},"Investigation 3: Managing Virtual Machines (KVM)"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Root Privileges")),(0,r.kt)("p",null,"As part of this investigation you will learn how to switch over to the root account in order to run several privileged commands in sequence. It can be tempting to just use this technique all the time, and never have to worry about sudo, but do ",(0,r.kt)("strong",{parentName:"p"},"not")," do so. It undermines the security of your system. Use it only when you need it."),(0,r.kt)("h3",{id:"part-1-backing-up-virtual-machines"},"Part 1: Backing Up Virtual Machines"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),'\nTaking the time to backup the image of the Virtual Machines filesystem allows the user to return to a "',(0,r.kt)("strong",{parentName:"p"},"restoration point"),'" using the ',(0,r.kt)("strong",{parentName:"p"},"gunzip")," command."),(0,r.kt)("p",{parentName:"blockquote"},"This allows us to recover in case something bad occurs during a Lab!"),(0,r.kt)("p",{parentName:"blockquote"},"Failure to take the time to make and confirm backups can result in loss of lab work for the student!"),(0,r.kt)("p",{parentName:"blockquote"},"There are three general steps to back up your Virtual Machines:"),(0,r.kt)("ul",{parentName:"blockquote"},(0,r.kt)("li",{parentName:"ul"},"Shutdown the VM"),(0,r.kt)("li",{parentName:"ul"},"Create a compressed copy of your ",(0,r.kt)("strong",{parentName:"li"},"Disk Images")," using the ",(0,r.kt)("strong",{parentName:"li"},"gzip")," command."),(0,r.kt)("li",{parentName:"ul"},"Backup the VM xml configuration using the ",(0,r.kt)("strong",{parentName:"li"},"virsh")," shell command."))),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command is a command line tool/shell for managing VM's"),(0,r.kt)("p",null,"We use it to connect to the hypervisor and then interact with our VM's"),(0,r.kt)("p",null,"In order to use the ",(0,r.kt)("strong",{parentName:"p"},"virsh")," command as a regular user to connect to our VM's we must configure an ENVIRONMENT variable."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Edit the file ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.bashrc")," as your regular user on ",(0,r.kt)("inlineCode",{parentName:"li"},"debhost")),(0,r.kt)("li",{parentName:"ol"},"Add the following to the file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# virsh connection variable\nexport LIBVIRT_DEFAULT_URI='qemu:///system'\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Logout and login again to ",(0,r.kt)("inlineCode",{parentName:"li"},"debhost"))),(0,r.kt)("p",null,"The following example ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," commands will be useful"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List all running (active) VM's\nvirsh list\n\n# List all inactive VM's\nvirsh list --inactive\n\n# List all VM's (active or not)\nvirsh list --all\n\n# Start a VM\nvirsh start \n\n# Shutdown a VM\nvirsh shutdown \n\n# Force off a VM (if shutdown fails)\nvirsh destroy \n\n# Display the xml data that defines the VM configuration\nvirsh dumpxml \n")),(0,r.kt)("p",null,"To view the VM in a window without launching ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Open VM in viewer window\nvirt-viewer &\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Shut down your ",(0,r.kt)("strong",{parentName:"p"},"deb1"),", ",(0,r.kt)("strong",{parentName:"p"},"deb2"),", and ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VMs. (Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command)"),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),"\nYou can shutdown the VM's from the user interface, (For ",(0,r.kt)("em",{parentName:"p"},"deb2")," and ",(0,r.kt)("em",{parentName:"p"},"deb3"),", which are CLI-only, you can issue the following command to shutdown: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo poweroff"),", or you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh")," command.\nPlease be patient, the VMs will shut down!"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create a directory for your backups. ",(0,r.kt)("inlineCode",{parentName:"p"},"mkdir ~/backups"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the command ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh dumpxml deb1")),(0,r.kt)("p",{parentName:"li"},"This command will output the xml data that is used to define (create) this VM\nIf we save this output we could use that xml data to recreate the VM")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter the command ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh dumpxml deb1 > ~/backups/deb1.xml")," to save a copy of the output.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Enter 2 more commands to save the xml data for ",(0,r.kt)("inlineCode",{parentName:"p"},"deb2")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"deb3")),(0,r.kt)("p",{parentName:"li"},"Backing up the xml data only has to be done when the VM is created, or if the configuration is modified.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"We will need to use elevated privileges to backup our disk image files from the default location of ",(0,r.kt)("inlineCode",{parentName:"p"},"/var/lib/libvirt/images/"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Use the command ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo -i")," and enter your password if prompted."))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("inlineCode",{parentName:"p"},"sudo -i")," will start a new shell as the root user, you can run a number of commands and then type ",(0,r.kt)("inlineCode",{parentName:"p"},"exit")," to return to your previous shell.")),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Change to the images directory: ",(0,r.kt)("inlineCode",{parentName:"p"},"cd /var/lib/libvirt/images/"),". Note that you did not need to use sudo, as you are already using elevated permissions.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type ",(0,r.kt)("inlineCode",{parentName:"p"},"ls -lh")," to see the contents")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"To make a compressed copy of your ",(0,r.kt)("strong",{parentName:"p"},"deb1.qcow2"),", ",(0,r.kt)("strong",{parentName:"p"},"deb2.qcow2"),", and ",(0,r.kt)("strong",{parentName:"p"},"deb3.qcow2")," files we will use the ",(0,r.kt)("inlineCode",{parentName:"p"},"gzip")," command."),(0,r.kt)("p",{parentName:"li"},"The ",(0,r.kt)("inlineCode",{parentName:"p"},"gzip")," command will compress the file in place and rename the file with a ",(0,r.kt)("inlineCode",{parentName:"p"},".gz")," extension.\nHowever, this will make the file unusable and doesn't create a copy. We will use STDIN and STDOUT redirection to overcome this.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Issue the commands:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"gzip < deb1.qcow2 > ~YourRegularUsername/backups/deb1.qcow2.gz\n\ngzip < deb2.qcow2 > ~YourRegularUsername/backups/deb2.qcow2.gz\n\ngzip < deb3.qcow2 > ~YourRegularUsername/backups/deb3.qcow2.gz\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOTE"),': Make certain to use the redirection signs "<" and "',">",'" properly in the command!'),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Please be patient")),(0,r.kt)("p",{parentName:"blockquote"},"It may look like the command prompt is stuck but it could take a while for gzip to compress an entire operating system."),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"NOTE"),": Do ",(0,r.kt)("strong",{parentName:"p"},"NOT")," press ",(0,r.kt)("inlineCode",{parentName:"p"},"c")," to cancel this process. If you do, your archive will become incomplete and your recovery will be corrupt.")),(0,r.kt)("ol",{start:13},(0,r.kt)("li",{parentName:"ol"},"Compare the size of the compressed and original files (hint: use ",(0,r.kt)("inlineCode",{parentName:"li"},"ls -lh"),"). If file is very large (like 15GB), you didn't compress it and you need to remove that file and perform the previous step until you get it right!"),(0,r.kt)("li",{parentName:"ol"},"Once you are ",(0,r.kt)("strong",{parentName:"li"},"sure you have all three VM disk images backed up"),", use the ",(0,r.kt)("inlineCode",{parentName:"li"},"exit")," command to revert back to your normal user.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vmbackup",src:a(3142).Z,width:"601",height:"316"})),(0,r.kt)("h3",{id:"part-2-testing-the-backup"},"Part 2: Testing the backup"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Start the ",(0,r.kt)("strong",{parentName:"p"},"deb3")," VM and login."),(0,r.kt)("blockquote",{parentName:"li"},(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"})," ",(0,r.kt)("strong",{parentName:"p"},"THIS WILL DESTROY YOUR SYSTEM")),(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("strong",{parentName:"p"},"Make certain that you are in your ",(0,r.kt)("inlineCode",{parentName:"strong"},"deb3")," VM and not in ",(0,r.kt)("inlineCode",{parentName:"strong"},"debhost"),"!")))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type this command inside the deb3 virtual machine: ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo rm -rf /*")," (ignore error messages).")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Type the command ",(0,r.kt)("inlineCode",{parentName:"p"},"sudo poweroff"),", try other commands.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Force the VM to poweroff and restart")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"When the machine restarts it will not boot since all system files have been removed!")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Use the ",(0,r.kt)("strong",{parentName:"p"},"Force Off")," option to turn deb3 back off.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Run ",(0,r.kt)("inlineCode",{parentName:"p"},"virt-manager")," right click on the ",(0,r.kt)("inlineCode",{parentName:"p"},"deb3")," VM and select ",(0,r.kt)("strong",{parentName:"p"},"Delete")," make sure that ",(0,r.kt)("strong",{parentName:"p"},"Delete associated storage file")," is selected and ",(0,r.kt)("strong",{parentName:"p"},"Delete")),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("inlineCode",{parentName:"p"},"deb3")," is now completely gone. Time to test the backup!")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"To restore the VM configuration:"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# List all VM's\nvirsh list --all\n\n# Define a VM from xml data\nvirsh define ~/backups/deb3.xml\n\n# List all VM's\nvirsh list --all\n")),(0,r.kt)("ol",{start:8},(0,r.kt)("li",{parentName:"ol"},"To restore the ",(0,r.kt)("inlineCode",{parentName:"li"},"deb3")," disk image file:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"# Start a sudo shell\nsudo -i\n\n# Change to images directory\ncd /var/lib/libvirt/images\n\n# Restore file\ngunzip < ~YourRegularUserName/backups/deb3.qcow2.gz > deb3.qcow2\n\n# Return to previous shell\nexit\n\n")),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Start the ",(0,r.kt)("inlineCode",{parentName:"li"},"deb3")," VM and login to make sure it was successfully restored")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},(0,r.kt)("img",{alt:"caution",src:a(5251).Z,width:"64",height:"64"}),(0,r.kt)("strong",{parentName:"p"},"Shutting Down the Host while Virtual Machines are Running")),(0,r.kt)("p",{parentName:"blockquote"},"If you shut down your host system while virtual machines are running, they will be suspended, and will resume the next time you boot your host system. Note that it is better to shut down the VMs prior to shutting down the host")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"For the remainder of these labs, it is assumed that you will backup ",(0,r.kt)("strong",{parentName:"li"},"both")," the images and XML configuration files for ",(0,r.kt)("strong",{parentName:"li"},"all"),' Virtual machines, when asked to backup your virtual machines. It is also highly recommended to backup these files to an external storage device (eg. USB key) in case the host machine gets "wiped" and you need to rebuild your HOST machine and then restore your Virtual Machines...'),(0,r.kt)("li",{parentName:"ol"},"Answer this question in your log book:")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"In order to fully back up a virtual machine, what information should be saved in addition to the virtual machine image?")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 3 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"investigation-4-using-shell-scripts-for-vm-backup--management"},"Investigation 4: Using Shell Scripts for VM Backup & Management"),(0,r.kt)("p",null,"You will continue our use of Bash Shell scripting by first creating a Bash Shell script that will allow the Linux sysadmin to select their created VMs for backup. Afterwards you will download, view and run a couple of Bash Shell scripts that use the virsh command to start and stop your virtual machines."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Please check out these ",(0,r.kt)("a",{parentName:"strong",href:"/OPS245-db/C-ExtraResources/bash-shell-scripting-tips"},"Bash Shell Scripting Tips")," first before continuing with the following steps")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the following steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Start the ",(0,r.kt)("strong",{parentName:"li"},"deb1")," virtual machine, and stop the ",(0,r.kt)("strong",{parentName:"li"},"deb2")," and ",(0,r.kt)("strong",{parentName:"li"},"deb3")," virtual machines."),(0,r.kt)("li",{parentName:"ol"},"Switch to the ",(0,r.kt)("strong",{parentName:"li"},"debhost")," machine, and open a shell terminal."),(0,r.kt)("li",{parentName:"ol"},"Enter these admin commands into your ",(0,r.kt)("strong",{parentName:"li"},"debhost")," machine and note the result:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list --all\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh list --inactive\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Now, shut-down your deb1 VM normally, and close the deb1 VM window."),(0,r.kt)("li",{parentName:"ol"},"Switch to your terminal and issue the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"virsh start deb1\n")),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Using the appropriate command check to see if your deb1 VM is now running."),(0,r.kt)("li",{parentName:"ol"},"There are other commands that can be used (such as ",(0,r.kt)("strong",{parentName:"li"},"suspend"),", or ",(0,r.kt)("strong",{parentName:"li"},"shutdown"),'). The "shutdown" command may not always work since it relies on the guest handling a particular ACPI event. Why do you think it is useful to have commands to manipulate VMs?'),(0,r.kt)("li",{parentName:"ol"},"Since this is a text-based version of Linux, you do not need to turn off the screen-saver.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Virtual Machine Does not Shutdown from Command")),(0,r.kt)("p",null,"If the Virtual machine fails to shutdown from the ",(0,r.kt)("inlineCode",{parentName:"p"},"virsh shutdown")," command, then you can go to the ",(0,r.kt)("strong",{parentName:"p"},"Virtual Machine manager")," and ",(0,r.kt)("strong",{parentName:"p"},"halt")," or ",(0,r.kt)("strong",{parentName:"p"},"shutdown")," within the VM itself, then you can click the ",(0,r.kt)("strong",{parentName:"p"},"PowerOff")," button in the VM window. You'll want to avoid a forced shutdown since those are equivalent to yanking the power cord out of the wall on a physical machine!"),(0,r.kt)("ol",{start:9},(0,r.kt)("li",{parentName:"ol"},"Open a Bash shell terminal and login as root."),(0,r.kt)("li",{parentName:"ol"},"Use a text editor (such as ",(0,r.kt)("inlineCode",{parentName:"li"},"vi")," or ",(0,r.kt)("inlineCode",{parentName:"li"},"nano"),") to create a Bash Shell script called: ",(0,r.kt)("inlineCode",{parentName:"li"},"~/bin/backupVM.bash")),(0,r.kt)("li",{parentName:"ol"},"Enter the following text content into your file:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'#!/bin/bash\n\n\n# backupVM.bash\n# Purpose: Backup VM images\n#\n# USAGE: ./backupVM.bash\n#\n# Author: *** INSERT YOUR NAME ***\n# Date: *** CURRENT DATE ***\n\nuser=$(whoami)\nif [ $user != "root" ] # only runs if using sudo or root\nthen\n echo "You must run this script with root privileges. Please use sudo" >&2\n exit 1\nfi\n')),(0,r.kt)("ol",{start:12},(0,r.kt)("li",{parentName:"ol"},"Save your editing session, but remain in the text editor."),(0,r.kt)("li",{parentName:"ol"},"This shell script is designed particularly for your deb1, deb2, and deb3 VMS."),(0,r.kt)("li",{parentName:"ol"},"The code displayed below will prompt the user if they wish for all VMs to be backed-up; otherwise, allow the user the option of specifying which VMs to be backed-up. Add the following code.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Make sure you edit the code with the correct username!")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},'# Set variables for source path and backup path\nimg_path="/var/lib/libvirt/images/"\nbackup_path="/home/username/backups/"\n\n# prompt if all VMs to be backed-up\nread -p "Backup all VMs? (y|n):" answer\n\n# Backup all VMs if answer is yes\nif [ "$answer" = "y" ]\nthen\n for num in 1 2 3 # Determinant loop for 3 arguments: 1, 2, and 3\n do\n vm="deb${num}"\n echo "Backing up VM ${vm}"\n gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz\n echo "${vm} BACKUP DONE"\n done\n\n# Prompt for VM is answer is no\nelif [ "$answer" = "n" ]\nthen\n read -p "Which VM should be backed up? (1|2|3): " numanswer\n until echo $numanswer | grep "^[123]$" >> /dev/null # Look for match of single digit: 1,2, or 3\n do\n read -p "Invalid Selection. Select 1, 2, or 3: " numanswer\n done\n vm="deb${numanswer}"\n echo "Backing up VM ${vm}"\n gzip < ${img_path}${vm}.qcow2 > ${backup_path}${vm}.qcow2.gz\n echo "${vm} BACKUP DONE"\nelse\n echo "Invalid Selection... Aborting program"\n exit 2\nfi\n')),(0,r.kt)("ol",{start:15},(0,r.kt)("li",{parentName:"ol"},"Save, set the permissions, and then run that shell script to backup deb1. Confirm that this script did backup this image to ~/backups"),(0,r.kt)("li",{parentName:"ol"},"What happens if you enter an invalid answer to any of the prompts?"),(0,r.kt)("li",{parentName:"ol"},'You have completed lab2. Proceed to Completing The Lab, and follow the instructions for "lab sign-off".')),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Answer INVESTIGATION 4 observations / questions in your lab log book.")),(0,r.kt)("h2",{id:"lab-2-sign-off-show-instructor"},"Lab 2 Sign-Off (Show Instructor)"),(0,r.kt)("p",null,"Follow the submission instructions that your Professor provides."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Backup ALL of your VMs!")),(0,r.kt)("p",null,"If you have successfully completed this lab, make a new backup of all of your virtual machines onto your USB Key."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Perform the Following Steps:")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Use the ",(0,r.kt)("strong",{parentName:"li"},"virsh start")," command to launch all the VMs (",(0,r.kt)("strong",{parentName:"li"},"deb1"),", ",(0,r.kt)("strong",{parentName:"li"},"deb2"),", and ",(0,r.kt)("strong",{parentName:"li"},"deb3"),")."),(0,r.kt)("li",{parentName:"ol"},"Inside each virtual machine, run ",(0,r.kt)("inlineCode",{parentName:"li"},"ip a")," on the command line. Open a Terminal window in deb1 to do so. You'll need the IP address of each machine for the next steps."),(0,r.kt)("li",{parentName:"ol"},"Switch to your ",(0,r.kt)("strong",{parentName:"li"},"debhost")," VM, open a terminal, and change directory to ",(0,r.kt)("strong",{parentName:"li"},"~/bin"),"."),(0,r.kt)("li",{parentName:"ol"},"Issue the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"wget https://raw.githubusercontent.com/OPS245/debian-labs/main/lab2-check.bash\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"Give the ",(0,r.kt)("strong",{parentName:"li"},"lab2-check.bash")," execute permissions for the file owner."),(0,r.kt)("li",{parentName:"ol"},'Run the shell script and if there are any warnings, make fixes and re-run shell script until you receive the "Congratulations" message.'),(0,r.kt)("li",{parentName:"ol"},"Follow the submission instructions of your Professor:")),(0,r.kt)("h2",{id:"practice-for-quizzes-tests-midterm--final-exam"},"Practice For Quizzes, Tests, Midterm & Final Exam"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"How do you start and stop virtual machines?"),(0,r.kt)("li",{parentName:"ol"},"What is the purpose of the virsh command?"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly backup your VM's xml data"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly backup your VM's disk images"),(0,r.kt)("li",{parentName:"ol"},"List the steps to correctly restore your VMs"),(0,r.kt)("li",{parentName:"ol"},"How can you prompt the user for data and store into a variable?"),(0,r.kt)("li",{parentName:"ol"},"Show a few examples of bash loops that can be used to error-check user input."),(0,r.kt)("li",{parentName:"ol"},"What does the command ",(0,r.kt)("strong",{parentName:"li"},"apt update")," do and why is it important?"),(0,r.kt)("li",{parentName:"ol"},"What does the command ",(0,r.kt)("strong",{parentName:"li"},"apt upgrade")," do and why is it important?")))}k.isMDXComponent=!0},5251:function(e,t){t.Z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGuUlEQVR4nO1aCWwUVRj+SqlyCFhEKFCkKIQWihxC5GqhXG05eyEBgSgeBA/kEgkBCsh9eHAGUaiAHEVKu++15UgEFWJENEYFNQoERVFRAbl2puJv/mnfdunstNuytLvtfsmXzM7ue/N//3vz3j/fLOCHH3744YcfflQE6BCqUzoCURVhF0jRBC4z7dlIRlXCtRyEagJXdQliahLXr0s0R1WBLpGuxDsosAtVAXnZ6GMSX8A8Gwagsi96usBXLPZaVjWaPbWdQT4umAUn6DiCUFmhS0xWo/3ySx1owGMx1H94jHHsdCtMQmUE7UdDTeIii/x2Sx1q0DOZzu6oST/vqkH3RyXTN2l18xdEgcuUi8aobNAFNqtRjh/Rm5bPDHeM+rKZ4dRveB/n9WATKhP0bHTWJG6yuD3LQykiblDhfS9B120BFBk/kDJWhKpZ8J+eg66oDKBUVNMkPmVhVzKrUcv+Q0i+0di0A+xf1Yha9B1K/2QGqnOfc1v4OnSJZ5XIOdMiKXlMT5dbIDNxTBTNnRbp+KwJPANfBkkEawJ/sJjT22sZC98PW2tbJqDobzSBvygD98FXoQmssRpdK6a+HElJTrNEk1gNX4QmEKkJ5LGIfatCit7fliy6TmgS/2oC7eFr0CQOO6/we1c2LVG8YtGdQhM4QoQA+Ao0gceVmKUzI4xqz13xVrWClo1R8AVQOu7RJc5x0EWrvNLQuVosmAXnKQd14e3QJJYqEaPHdaPpznV+KcnPCGOf6uq8IC6BN+NGFlpqAnYO9qP1DSi0dwL9nVHdJIxnxsgnulPdbsMNjnqyO53bWcP0O27bNCaBPljbUCVAs+eiNbwVmkAOB2oXAdR5SCxtW9zcJIp3grZxAwmdRt3CyLiBxg5Q9PdbFoVRx0FxdEMEqFvhALwRdhsSVNBrUltRj4T+HKxJUNrCMJN4xa2LzAlj9krqS+vmtnR8tgsMhTeBDqGGLnGag/t9910UEp1Ex98Odilm+gsPWyZgxsR2Ltt8uakeNYxOovO771bnTvE14S3QJVJVsOPHd6Hnn+tsubAtmBJumYCFU1tbtpswobNBxzmB2fAGXN+LZsrhPbYxuOhImbj11VDLBGybn/847IpqZn22MdjhJN/IRZg3GB17ChYnikrqRxvmPVTs1nZkTbBlAo6ucX3bKPI60N15bRF4v0LF59nQVwW3eUEL6jQ4ztgBihPx644gywSc3xlUbFvuu8uQWGNnUOfyBGIrzuGV+JqD+CsjyNivP17foMTixm4D1e2aYhJfr1uK8V1J7T/ZUJ8a90qkP/cUJEvgZIU4ybrENBXUlBc70hNPP1pi8IptBsSbEtC2f7zb7bk6nDbRqcK0YUq5iqcsNNIELvHFT757a83uDmOTo00JiEuJcrs9V423OMkS/5Srk6wLbHGIGRFDK2dZb1+u+My4TqYE8LnS9LHc7CSnlY94ie6GaytB6cuamRxed/jqZHMtsKCYGsAVlc/A3oExCzgmgajycHiP8QUvZwZSWN+hdGB1o1IFblULFFcDWJGd5GYxw+jS3oIHLoEv7uj/DXSBCeri/E5v+NgepQ6a+d3mmhT4yEiHeD7+fpP7a4gz2T9kt9np3Pg7Ip72ob4mcYEvcuq92sbC9+M2a4e3ON7IAq2Y3IIa9kw0uHJqmHGuLH25dJJtaODxBGgS69VFh46KpvnT25YpYMWLu0BnNuSTj2+nL3aS2XVWnzWBtZ4Vn4OO7M5y57lvhtCD/dxzeMuLykkWrzuc5Jv8Os4j4okQoAl8yB1fzapGrQcMpszXmtx20NxHk94JRgVp80B//F4xPHaws5N81CNOsiYwVl1k8YwI452+J0aNxatFsGmvBI/0yU4yv2l23AoSo29v9DNRR5f4hTv7qaD6OpFWxyPBhkQXJqBxlGcSYHKSJX6jg6hX9tGXWKE6ZxNzxqT2HrtvN89qQiFRCYb4tFnmt8W34ySzG+2YBQLLyiTeLhGhCejcyeF191s6vGXl5d2gM2/l7wJ87Kl+uSh6oM+wQidZQLfbEF760RfI5Q7YjW0/KJ62L3nAY0HeabK52mFQfKGTLHGwdKOfjWTV2ao5rahnYj+XDq83k53ktam3OMmJbomndNTUBc7kNwowfLgv3rm3wgWVluxKs3HiNHBnyYZa7kz9eYVZCzC2q6kTO9LCV9r4FNmk4QelIjM3tfjRP44gTeKKcybZ8OBSk1dXXyLHzNuisxbDODmE6iU97l6o6Ol7p6hJ/FniH6/sAonqfz2ViazJ7YXQDz/88MMPP/xAVcD/A7vKkHQBotAAAAAASUVORK5CYII="},2926:function(e,t,a){t.Z=a.p+"assets/images/deb1part-7df8236ca6914350a46d97ecc8562249.png"},7740:function(e,t,a){t.Z=a.p+"assets/images/deb2part-afc7d7f45486a21f7f1b4105cf911426.png"},5410:function(e,t,a){t.Z=a.p+"assets/images/deb3boot-7a1171795c1b10cf24f14802061f317e.png"},6450:function(e,t,a){t.Z=a.p+"assets/images/deb3tty-2e90dc360487f7d20db9d6dcae51e342.png"},9949:function(e,t,a){t.Z=a.p+"assets/images/ipaddr-47a5cc3ce0ae05429175f7e220aed449.png"},5982:function(e,t,a){t.Z=a.p+"assets/images/ipaddr2-90ab0adf6ac42bdab8d637aa4f241ce7.png"},7176:function(e,t,a){t.Z=a.p+"assets/images/iptables1-c85eba8bf6b7d8c106363a7955c86c47.png"},899:function(e,t,a){t.Z=a.p+"assets/images/iptables2-df32a8daf66f54f862ce1faab696e855.png"},3737:function(e,t,a){t.Z=a.p+"assets/images/labenv-9cdc9ec6c2df7d751f585f8f64b73929.png"},1964:function(e,t,a){t.Z=a.p+"assets/images/libvirtdstatus-e31bc28a98e564cc0920ff28b4560a48.png"},2758:function(e,t,a){t.Z=a.p+"assets/images/memcpu-82e2f90ad23c0b4d3b31a6bfce82dd58.png"},1647:function(e,t,a){t.Z=a.p+"assets/images/scale-b0a1316b41c50f8715e7546801182f25.png"},6364:function(e,t,a){t.Z=a.p+"assets/images/searchperms-9f89a5fa7839f7f5d7677fa74346cee2.png"},2137:function(e,t,a){t.Z=a.p+"assets/images/softsel-4b046cb044747458f1516b57f78638c6.png"},5616:function(e,t,a){t.Z=a.p+"assets/images/softsel2-237b4c394227f0547a770cab6b79d7c4.png"},3142:function(e,t,a){t.Z=a.p+"assets/images/vmbackup-3bccd0c117ba1826e789bd908c880016.png"},1092:function(e,t,a){t.Z=a.p+"assets/images/vmsource-63351551fd812f36ad9774343f09e5c1.png"}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.03c9e40a.js b/assets/js/runtime~main.7167277b.js similarity index 98% rename from assets/js/runtime~main.03c9e40a.js rename to assets/js/runtime~main.7167277b.js index a76e1b3..f16f5ad 100644 --- a/assets/js/runtime~main.03c9e40a.js +++ b/assets/js/runtime~main.7167277b.js @@ -1 +1 @@ -!function(){"use strict";var e,t,n,r,o,f={},c={};function a(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={id:e,loaded:!1,exports:{}};return f[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=f,a.c=c,e=[],a.O=function(t,n,r,o){if(!n){var f=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(c=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var f={};t=t||[null,n({}),n([]),n(n)];for(var c=2&r&&e;"object"==typeof c&&!~t.indexOf(c);c=n(c))Object.getOwnPropertyNames(c).forEach((function(t){f[t]=function(){return e[t]}}));return f.default=function(){return e},a.d(o,f),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return"assets/js/"+({18:"9310cf6f",27:"7ca83706",53:"935f2afb",55:"c0e20c00",109:"eb6a5da1",134:"61c5f690",202:"20d773fc",366:"5f827bca",396:"59490aaf",422:"30eb2287",430:"ae58fe3c",514:"1be78505",531:"66689c68",620:"b9232272",632:"9af68f33",659:"ebee8391",705:"2e0c27b7",813:"ea934244",858:"8661af7e",884:"c396239e",886:"701584c5",918:"17896441"}[e]||e)+"."+{18:"7195b2cb",27:"03cd6287",53:"c5d8109b",55:"63ef2779",109:"2eab5f99",131:"c4ccb2cd",134:"03486121",202:"59e18fb2",283:"70aa2b79",366:"287b3b47",396:"c4d4b317",422:"e0a67066",430:"5b4a7739",514:"e6a34e9d",531:"f577c772",539:"9ddb32f0",620:"59db8861",632:"4f295be7",659:"9f8fafb2",705:"8ec8f7b9",813:"a5393965",858:"27fbddfe",884:"c0185faf",886:"63835578",918:"a060fd85",972:"c12578e7"}[e]+".js"},a.miniCssF=function(e){},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="OPS245-db:",a.l=function(e,t,n,f){if(r[e])r[e].push(t);else{var c,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(c=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var f={};t=t||[null,n({}),n([]),n(n)];for(var c=2&r&&e;"object"==typeof c&&!~t.indexOf(c);c=n(c))Object.getOwnPropertyNames(c).forEach((function(t){f[t]=function(){return e[t]}}));return f.default=function(){return e},a.d(o,f),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return"assets/js/"+({18:"9310cf6f",27:"7ca83706",53:"935f2afb",55:"c0e20c00",109:"eb6a5da1",134:"61c5f690",202:"20d773fc",366:"5f827bca",396:"59490aaf",422:"30eb2287",430:"ae58fe3c",514:"1be78505",531:"66689c68",620:"b9232272",632:"9af68f33",659:"ebee8391",705:"2e0c27b7",813:"ea934244",858:"8661af7e",884:"c396239e",886:"701584c5",918:"17896441"}[e]||e)+"."+{18:"7195b2cb",27:"03cd6287",53:"c5d8109b",55:"63ef2779",109:"2eab5f99",131:"c4ccb2cd",134:"03486121",202:"59e18fb2",283:"70aa2b79",366:"287b3b47",396:"c4d4b317",422:"e0a67066",430:"5b4a7739",514:"e6a34e9d",531:"f577c772",539:"9ddb32f0",620:"59db8861",632:"f25e8a4f",659:"9f8fafb2",705:"8ec8f7b9",813:"a5393965",858:"27fbddfe",884:"c0185faf",886:"63835578",918:"a060fd85",972:"c12578e7"}[e]+".js"},a.miniCssF=function(e){},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="OPS245-db:",a.l=function(e,t,n,f){if(r[e])r[e].push(t);else{var c,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d Welcome to OPS245 | OPS245 - Open System Server - +

    Welcome to OPS245 - Open Systems Servers

    Weekly ScheduleCourse OutlineAssignment 1Assignment 2

    What This Course is About

    This course is the second in a series of courses about Linux technologies

    • ULI101 taught you to be a Linux user. In OPS245, you will move from being a Linux user to being a Linux system administrator.
    • As a system administrator, you will be responsible for installing, configuring, adjusting, maintaining, and troubleshooting the operation of computer systems. This is a lot of responsibility, and with that responsibility comes power. You will be able to change anything on the system, and you will also have the ability to damage or destroy the system.
    • In addition to manually configuring machines, you will learn to use automation tools to "deploy" changes to multiple systems within our organization. Although this course will not cover the full features of these tools, it will serve as an introduction to scripting and automation to make you a more capable and efficient system administrator.
    • In this course you will use an external SSD drive (USB 3) with the lab computers on campus to set up a Linux system.
    • Alternatively you can use your own computer to complete the labs providing it meets the hardware requirements.
    • You will also set up at least four additional Linux systems using "Virtual Machines", and therefore gain experience with different types of system configurations as well as setting up networking between systems.
    • The next course in the OPS stream (OPS345) will expand on what you learn here and teach you to administer Linux servers (web servers, DNS servers, FTP servers, file sharing servers) in a cloud environment.

    caution

    Attention:

    This semester there are many changes being made to this course.

    • Switch from Virtualization to direct boot for the Debian host installation
    • Switch to Debian distribution
    • Changes to automation scripting

    Please be patient this semester as there may be occasional bugs and technical glitches along the way.

    Learning by Doing

    Most of the learning in this course occurs through the hands-on problem solving that takes place in the eight labs and two assignments.

    Requirements for Success:

    • It is very important to stay up-to-date with the coursework, and to practice until you have confidently mastered each task.
    • All of the software used in this course is open source software, so you are free to use, modify, and redistribute it. This means that you can install it as many times as you want on as many different computers as you would like. It also means that you can tinker with it -- you can take it apart, see how it works, and put it back together in the same or a different way, limited only by your time and ambition. You are encouraged to experiment and question liberally.
    • You should take good notes as you learn new concepts, commands, and the configuration changes that you will make during the labs and assignments. Your Professor will provide more instructions regarding the "Lab Log Book"
    • You are encouraged to experiment and explore. There is so much to learn about Linux and Open Source Software if you are prepared to immerse yourself. Feel free to setup other VM's to experiment with.
    • Carefully read ALL lab instructions and check your work regularly. The labs have been designed with backup safeguards to prevent the student from losing their work. On the other hand, students may lose their work if they fail to follow lab instructions or accidentally forget their ssd devices in the Lab!

    Required Materials

    1. Solid State Drive (SSD) Minimum Capacity: 240 GB

    2. Debian 12 netinstaller ISO Image

    3. USB Flash Drive (3.0 preferred) Minimum Capacity: 16 GB

    4. Lab Logbook (download & print Both sides per lab permitted)

      • Download Doc
      • NOTE: If you've taken this class in a previous semester, you MAY NOT bring that version of the lab logbook to any testing.
      • Your Professor will direct you on what they want you to do with the Lab Lag Book
    5. Dos and Don'ts (PLEASE READ)

    Course Faculty

    During the Fall 2024 semester, OPS245 is taught by:

    Hans Heim

    Hans Heim | Section NAA, NBB, NCC, NDD

    Evaluation

    EvaluationMarks
    Labs and Quizzes25%
    Assignments (minimum of 2)30%
    Tests (minimum of 1)20%
    Final Assessment25%
    - + \ No newline at end of file diff --git a/sw.js b/sw.js index ce54003..fa6c9ab 100644 --- a/sw.js +++ b/sw.js @@ -1 +1 @@ -(()=>{"use strict";var e={913:()=>{try{self["workbox:core:6.5.2"]&&_()}catch(e){}},977:()=>{try{self["workbox:precaching:6.5.2"]&&_()}catch(e){}},80:()=>{try{self["workbox:routing:6.5.2"]&&_()}catch(e){}},873:()=>{try{self["workbox:strategies:6.5.2"]&&_()}catch(e){}}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a](i,i.exports,s),i.exports}(()=>{s(913);const e=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class t extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},n=e=>[a.prefix,e,a.suffix].filter((e=>e&&e.length>0)).join("-"),i=e=>e||n(a.precache),r=e=>e||n(a.runtime);function c(e,t){const s=t();return e.waitUntil(s),s}s(977);function o(e){if(!e)throw new t("add-to-cache-list-unexpected-type",{entry:e});if("string"==typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:s,url:a}=e;if(!a)throw new t("add-to-cache-list-unexpected-type",{entry:e});if(!s){const e=new URL(a,location.href);return{cacheKey:e.href,url:e.href}}const n=new URL(a,location.href),i=new URL(a,location.href);return n.searchParams.set("__WB_REVISION__",s),{cacheKey:n.href,url:i.href}}class h{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if("install"===e.type&&t&&t.originalRequest&&t.originalRequest instanceof Request){const e=t.originalRequest.url;s?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return s}}}class l{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const s=(null==t?void 0:t.cacheKey)||this._precacheController.getCacheKeyForURL(e.url);return s?new Request(s,{headers:e.headers}):e},this._precacheController=e}}let u;async function f(e,s){let a=null;if(e.url){a=new URL(e.url).origin}if(a!==self.location.origin)throw new t("cross-origin-copy-response",{origin:a});const n=e.clone(),i={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},r=s?s(i):i,c=function(){if(void 0===u){const e=new Response("");if("body"in e)try{new Response(e.body),u=!0}catch(e){u=!1}u=!1}return u}()?n.body:await n.blob();return new Response(c,r)}function d(e,t){const s=new URL(e);for(const e of t)s.searchParams.delete(e);return s.href}class p{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}const g=new Set;s(873);function y(e){return"string"==typeof e?new Request(e):e}class w{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new p,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:s}=this;let a=y(e);if("navigate"===a.mode&&s instanceof FetchEvent&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}const n=this.hasCallback("fetchDidFail")?a.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))a=await e({request:a.clone(),event:s})}catch(e){if(e instanceof Error)throw new t("plugin-error-request-will-fetch",{thrownErrorMessage:e.message})}const i=a.clone();try{let e;e=await fetch(a,"navigate"===a.mode?void 0:this._strategy.fetchOptions);for(const t of this.iterateCallbacks("fetchDidSucceed"))e=await t({event:s,request:i,response:e});return e}catch(e){throw n&&await this.runCallbacks("fetchDidFail",{error:e,event:s,originalRequest:n.clone(),request:i.clone()}),e}}async fetchAndCachePut(e){const t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){const t=y(e);let s;const{cacheName:a,matchOptions:n}=this._strategy,i=await this.getCacheKey(t,"read"),r=Object.assign(Object.assign({},n),{cacheName:a});s=await caches.match(i,r);for(const e of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await e({cacheName:a,matchOptions:n,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(e,s){const a=y(e);var n;await(n=0,new Promise((e=>setTimeout(e,n))));const i=await this.getCacheKey(a,"write");if(!s)throw new t("cache-put-with-no-response",{url:(r=i.url,new URL(String(r),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var r;const c=await this._ensureResponseSafeToCache(s);if(!c)return!1;const{cacheName:o,matchOptions:h}=this._strategy,l=await self.caches.open(o),u=this.hasCallback("cacheDidUpdate"),f=u?await async function(e,t,s,a){const n=d(t.url,s);if(t.url===n)return e.match(t,a);const i=Object.assign(Object.assign({},a),{ignoreSearch:!0}),r=await e.keys(t,i);for(const t of r)if(n===d(t.url,s))return e.match(t,a)}(l,i.clone(),["__WB_REVISION__"],h):null;try{await l.put(i,u?c.clone():c)}catch(e){if(e instanceof Error)throw"QuotaExceededError"===e.name&&await async function(){for(const e of g)await e()}(),e}for(const e of this.iterateCallbacks("cacheDidUpdate"))await e({cacheName:o,oldResponse:f,newResponse:c.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){const s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let a=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))a=y(await e({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[s]=a}return this._cacheKeys[s]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"==typeof t[e]){const s=this._pluginStateMap.get(t),a=a=>{const n=Object.assign(Object.assign({},a),{state:s});return t[e](n)};yield a}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(const e of this.iterateCallbacks("cacheWillUpdate"))if(t=await e({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&200!==t.status&&(t=void 0),t}}class _ extends class{constructor(e={}){this.cacheName=r(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,s="string"==typeof e.request?new Request(e.request):e.request,a="params"in e?e.params:void 0,n=new w(this,{event:t,request:s,params:a}),i=this._getResponse(n,s,t);return[i,this._awaitComplete(i,n,s,t)]}async _getResponse(e,s,a){let n;await e.runCallbacks("handlerWillStart",{event:a,request:s});try{if(n=await this._handle(s,e),!n||"error"===n.type)throw new t("no-response",{url:s.url})}catch(t){if(t instanceof Error)for(const i of e.iterateCallbacks("handlerDidError"))if(n=await i({error:t,event:a,request:s}),n)break;if(!n)throw t}for(const t of e.iterateCallbacks("handlerWillRespond"))n=await t({event:a,request:s,response:n});return n}async _awaitComplete(e,t,s,a){let n,i;try{n=await e}catch(i){}try{await t.runCallbacks("handlerDidRespond",{event:a,request:s,response:n}),await t.doneWaiting()}catch(e){e instanceof Error&&(i=e)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:s,response:n,error:i}),t.destroy(),i)throw i}}{constructor(e={}){e.cacheName=i(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(_.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const s=await t.cacheMatch(e);return s||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,s){let a;const n=s.params||{};if(!this._fallbackToNetwork)throw new t("missing-precache-entry",{cacheName:this.cacheName,url:e.url});{0;const t=n.integrity,i=e.integrity,r=!i||i===t;if(a=await s.fetch(new Request(e,{integrity:i||t})),t&&r){this._useDefaultCacheabilityPluginIfNeeded();await s.cachePut(e,a.clone());0}}return a}async _handleInstall(e,s){this._useDefaultCacheabilityPluginIfNeeded();const a=await s.fetch(e);if(!await s.cachePut(e,a.clone()))throw new t("bad-precaching-response",{url:e.url,status:a.status});return a}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[s,a]of this.plugins.entries())a!==_.copyRedirectedCacheableResponsesPlugin&&(a===_.defaultPrecacheCacheabilityPlugin&&(e=s),a.cacheWillUpdate&&t++);0===t?this.plugins.push(_.defaultPrecacheCacheabilityPlugin):t>1&&null!==e&&this.plugins.splice(e,1)}}_.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:e})=>!e||e.status>=400?null:e},_.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:e})=>e.redirected?await f(e):e};class v{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new _({cacheName:i(e),plugins:[...t,new l({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const s=[];for(const a of e){"string"==typeof a?s.push(a):a&&void 0===a.revision&&s.push(a.url);const{cacheKey:e,url:n}=o(a),i="string"!=typeof a&&a.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==e)throw new t("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:e});if("string"!=typeof a&&a.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==a.integrity)throw new t("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(e,a.integrity)}if(this._urlsToCacheKeys.set(n,e),this._urlsToCacheModes.set(n,i),s.length>0){const e=`Workbox is precaching URLs without revision info: ${s.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return c(e,(async()=>{const t=new h;this.strategy.plugins.push(t);for(const[t,s]of this._urlsToCacheKeys){const a=this._cacheKeysToIntegrities.get(s),n=this._urlsToCacheModes.get(t),i=new Request(t,{integrity:a,cache:n,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:e}))}const{updatedURLs:s,notUpdatedURLs:a}=t;return{updatedURLs:s,notUpdatedURLs:a}}))}activate(e){return c(e,(async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),s=new Set(this._urlsToCacheKeys.values()),a=[];for(const n of t)s.has(n.url)||(await e.delete(n),a.push(n.url));return{deletedURLs:a}}))}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const t=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(t);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(e){const s=this.getCacheKeyForURL(e);if(!s)throw new t("non-precached-url",{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:s},t.params),this.strategy.handle(t))}}s(80);(async()=>{const e=function(){const e=JSON.parse(new URLSearchParams(self.location.search).get("params"));return e.debug&&console.log("[Docusaurus-PWA][SW]: Service Worker params:",e),e}(),t=[{"revision":"cce82bf51395a1fed26ec8471a5e8c7b","url":"404.html"},{"revision":"2aa13c333def715cea58621fea85d1b4","url":"A-Labs/lab1.html"},{"revision":"fdbfc6ac61a60139d3a603bff2b261ca","url":"A-Labs/lab2.html"},{"revision":"6d2024c685ed3bcca8235d6019fcfa79","url":"A-Labs/lab3.html"},{"revision":"ae9f7db83bbf5efd50d5fea1067dc042","url":"A-Labs/lab4.html"},{"revision":"79b2bbf91e1e0bfbfe0affe8353f2f87","url":"A-Labs/lab5.html"},{"revision":"705ad54283341b9c82ce6330854c4a66","url":"A-Labs/lab6.html"},{"revision":"cfec4802cb8fae89c3c395df1725b41d","url":"A-Labs/lab7.html"},{"revision":"abac54c60ad1a54164616b715d0be2c9","url":"A-Labs/lab8.html"},{"revision":"4a30e0992a6a9401f7f666bf4fc5df74","url":"assets/css/styles.099fe1a9.css"},{"revision":"c0641430c94e826ce21f7571949b9785","url":"assets/js/131.c4ccb2cd.js"},{"revision":"9052b08f588d2ffc6d3989e80fc7f728","url":"assets/js/17896441.a060fd85.js"},{"revision":"51c7667886a508e98803e50ad448ad1b","url":"assets/js/1be78505.e6a34e9d.js"},{"revision":"d28e1c3f848ddd4429d7231f1f7f335c","url":"assets/js/20d773fc.59e18fb2.js"},{"revision":"191989f06e3bb07ef39e1b3da9c9712f","url":"assets/js/283.70aa2b79.js"},{"revision":"8a62c2f3ab4ac6734337c0cb98c4ce3f","url":"assets/js/2e0c27b7.8ec8f7b9.js"},{"revision":"77b9983b8c591f0747c257a40bf1d5ec","url":"assets/js/30eb2287.e0a67066.js"},{"revision":"b466603781aefc81d9273ef6cc4ab250","url":"assets/js/539.9ddb32f0.js"},{"revision":"796891eecbf72b3c7b6e7f3711b561bb","url":"assets/js/59490aaf.c4d4b317.js"},{"revision":"6439fcc5638da26755406c46ba49bf9f","url":"assets/js/5f827bca.287b3b47.js"},{"revision":"46b50e7e0aa0bc8a4cfab7c9063975d1","url":"assets/js/61c5f690.03486121.js"},{"revision":"e6b44ba2e21a8d60d52fdd937f74042d","url":"assets/js/66689c68.f577c772.js"},{"revision":"551cf9bb2c983d4e2de0b6b468178ce2","url":"assets/js/701584c5.63835578.js"},{"revision":"934b46b5a5e45eaa2cb83d6d352632d3","url":"assets/js/7ca83706.03cd6287.js"},{"revision":"3538d9b2910ef2fd4e827c7813544286","url":"assets/js/8661af7e.27fbddfe.js"},{"revision":"08d1760e46889d7e5606f0508738b2ee","url":"assets/js/9310cf6f.7195b2cb.js"},{"revision":"323f57afbdcec3c5dc46396028347b30","url":"assets/js/935f2afb.c5d8109b.js"},{"revision":"1ee34918a5cccaf0693ac4d6e27aef52","url":"assets/js/972.c12578e7.js"},{"revision":"8ab6ba4b37a10140457ac9b8be8b273d","url":"assets/js/9af68f33.4f295be7.js"},{"revision":"2baf5e0a8fb7c7093b42fb93b8ece35e","url":"assets/js/ae58fe3c.5b4a7739.js"},{"revision":"da8969905e2b2c816b2f3a98a4af4fe0","url":"assets/js/b9232272.59db8861.js"},{"revision":"c1f17dbb120962a8d61b6f50dab80b0e","url":"assets/js/c0e20c00.63ef2779.js"},{"revision":"5c59fb065f8c350e23bf67fcb2b8952d","url":"assets/js/c396239e.c0185faf.js"},{"revision":"5166a1daf2f004e30bcaecfdca64186c","url":"assets/js/ea934244.a5393965.js"},{"revision":"b3cc46f13745f95008ad3f1d2b5fa1e5","url":"assets/js/eb6a5da1.2eab5f99.js"},{"revision":"722b9a79d128163c6333d9fc4d211b92","url":"assets/js/ebee8391.9f8fafb2.js"},{"revision":"1f7968a76ac62ae36771bc048880d156","url":"assets/js/main.70260956.js"},{"revision":"3e5afba600279892686a40dbf0cb8e54","url":"assets/js/runtime~main.03c9e40a.js"},{"revision":"2d692db88f0c823c38aaec1ab18b0537","url":"B-Assignments/assignment1.html"},{"revision":"6604667b993c94cb7e65d7e27fbe0fb5","url":"B-Assignments/assignment2.html"},{"revision":"c80584691f58ff2f371f6660b87f9c49","url":"C-ExtraResources/bash-shell-reference-guide.html"},{"revision":"c8ca6681df6df0a5b4325d4bec657332","url":"C-ExtraResources/bash-shell-scripting-tips.html"},{"revision":"f00a1cb09560951693eb28609cdae6aa","url":"C-ExtraResources/bash-shell-tips.html"},{"revision":"510f562a68117a5bdd2a078ed98a4877","url":"C-ExtraResources/python-scripting-tips.html"},{"revision":"a6b6d1d9be24558aee6a11f4d88e5a28","url":"C-ExtraResources/scripting-exercise.html"},{"revision":"6e96349e37e981a01630ea6da7799b01","url":"C-ExtraResources/tips.html"},{"revision":"29ada7d95ee89e78d3a466995211dd37","url":"index.html"},{"revision":"2524df02c6e551be5aef857403777080","url":"manifest.json"},{"revision":"ac742eea8ec49e86cc2ed2f4438f4832","url":"weekly-schedule.html"},{"revision":"68aac15bf6cd0b961cfa46d2dacd1edd","url":"assets/images/basicsubnet-0eb522d5d32dffe632c4a41acc456d43.png"},{"revision":"cf5d8d13f8f7d0a37ef76d8ea74d4571","url":"assets/images/Chains-85c8540e54b680d4e983ce44177a7a27.png"},{"revision":"e63f4b9f1dbcbf243dfe822efefbc804","url":"assets/images/cron-eed842dff3680778b52aea1ec19ad84e.png"},{"revision":"14222b5684d521dd6df32790b519ef8a","url":"assets/images/deb1fixedip-7e9d6f48b6ee28e416365945e0b2ad15.png"},{"revision":"1c5a7b01d097ccc00e03bf145641849b","url":"assets/images/deb1groups1-b44262266b1615db77c7d56bc4e667f3.png"},{"revision":"d4105241616028c481a53dee64ca3c9b","url":"assets/images/deb1groups2-72a1904523edb5b83d31c5a994919aca.png"},{"revision":"7ee1c02a4926527bd891716ec5969977","url":"assets/images/deb1groups3-321eb083074a92c982fab22b3b9f7f0a.png"},{"revision":"3fd25ae10ea25ae2325a147bf77ff183","url":"assets/images/deb1groups5-80a9924b068c4c3001d13b976a288f62.png"},{"revision":"95bc38cfd41b75440b3f49907bb42ca3","url":"assets/images/deb1grub-a8bb0d401b9746bfc0c0b304a0d90cba.png"},{"revision":"d31d508519a9ad1ecc076787b17f879b","url":"assets/images/deb1grubinit-61108924e504c9e216e9463dc768cc1c.png"},{"revision":"bb22770aff2333a38a51f4705ba0c6e0","url":"assets/images/deb1grubsingle-7199c603be10dae571840dcdd9f5ad03.png"},{"revision":"4973f1f92bcde23e79d07f28dbea5b05","url":"assets/images/deb1home1-b73351a0b4af12340a0ae8551b100381.png"},{"revision":"b2c21cf10c758c8990561abeb2d3d8fb","url":"assets/images/deb1home2-a57dcec2e26c939e5c1fe12516d90dc7.png"},{"revision":"4adca846c7229368fd3b7078186d0070","url":"assets/images/deb1home3-b3e6aa5fc5b4f022c5b9d82b9cad0ff9.png"},{"revision":"d2698347da714bec15dca770e6f38a25","url":"assets/images/deb1init1-ef61fed69083f1d67ffb1744a9cf863a.png"},{"revision":"89cd98205da91aa127794767624643b2","url":"assets/images/deb1ipadd1-6efc0f533af12817aeb5df1667ad82a6.png"},{"revision":"7564312e40a1ffb7d463ce5c6cc24fce","url":"assets/images/deb1ipadd2-dbb5d80d8cf16a65ffb6b7393a46b5de.png"},{"revision":"04d59bcb5163d91c8e4400029b7673cc","url":"assets/images/deb1iproute-80e030d0941ca69cbd6dc2dd09f769d3.png"},{"revision":"6fc6f9beab41e4f4f596a1e2d36dc120","url":"assets/images/deb1journal-25f1748ebcb7cfa53046f8ce2e7c353f.png"},{"revision":"c2563bd47caf00900a38e16218488bc6","url":"assets/images/deb1login-237a2d1965d5c7c717d6b21888ab2ab2.png"},{"revision":"28fbd0d16b35a10bca7e2a4622ea6b1e","url":"assets/images/deb1netsettings-fcf74bd9415ce851e1ac67aa9a587a0f.png"},{"revision":"62f1eb1ca208730738d73cc5c849a62b","url":"assets/images/deb1netstatus-35e2bc044aa3ad51dcfd35eaea9e02b8.png"},{"revision":"6c7d14b79f00dffbebb6ef38950d433e","url":"assets/images/deb1part-7df8236ca6914350a46d97ecc8562249.png"},{"revision":"8b2c03463929c23aac7dd5181a3063a1","url":"assets/images/deb1ping-397ea4d8a4420d2b1bbaa900d1e5e5df.png"},{"revision":"98e710a89292e5f0ec3699c467ff64a1","url":"assets/images/deb1shadow1-d094d97fbb23cb44af60324965c90cef.png"},{"revision":"e99abaf2da343943a2be37539c4ad587","url":"assets/images/deb1skel1-a46d0c3ced9d2d881674c92578a05d80.png"},{"revision":"f8a3f04e33dadc119544422d0a855101","url":"assets/images/deb1staticip-73a5c688699ebe1f048cc454c7301fdd.png"},{"revision":"7f7867c9f7e9c6a64204249dbb93e571","url":"assets/images/deb1status-7ccd86345cf35c0fcf0a3bbd7aff3553.png"},{"revision":"59ec4d1934b1c4171e450ae1f4e334a5","url":"assets/images/deb1sudo1-7f3d7c53cdbcb3119bcc12a9f78eb0f8.png"},{"revision":"5fb52cffd15a86e157f3167968754ede","url":"assets/images/deb1systemd-be8fe31ca0538422153bba8b4e6d3eaa.png"},{"revision":"9222c62c98624617f142a00c8b25e072","url":"assets/images/deb1tty-4b1fc05496becd9c9f936778089b55ef.png"},{"revision":"0a8cce4d45d7fefeba55dbc724d6928c","url":"assets/images/deb1users1-05d265c6b3b8c7c02defad67bfaf6c80.png"},{"revision":"a423905c09e07c431fea2fe1e9089d75","url":"assets/images/deb1users2-ba79f3ba09a0ffdd414518482c7b0a90.png"},{"revision":"1eba3c1dcd5a6fba6f1c9c0bd4574fad","url":"assets/images/deb1vmnic-ec42fb1e37d2aeb50a490a0b968d8c6a.png"},{"revision":"9e55c5101e19aaf14e9973fcb176dba9","url":"assets/images/deb2dfh-0f2bb29ec16ec00d37e71de38d34a569.png"},{"revision":"c547028c4832cdcb6dea1738f8819d8c","url":"assets/images/deb2diskadd-889cd7f513b335699a0d01b38c11314f.png"},{"revision":"dc030cff2512ec8b8748ec9f19f588a9","url":"assets/images/deb2fdiskl-a1cd31fbab080b869762a7790804f8b2.png"},{"revision":"b5eaf60eb71610e5b6ec4315cd222a84","url":"assets/images/deb2fstab-000b1d49c79ce62772ad5b24ea743235.png"},{"revision":"edaedecf6ee26422c5fbe92d53653495","url":"assets/images/deb2lvfn-09072f16a1a8df00a81ed7b6d1489333.png"},{"revision":"a8d4aa5df222d24da04f92a7216621ff","url":"assets/images/deb2lvm-15af18cfe6ffc7ec3f63ac4a20529fcb.png"},{"revision":"e7ff0ddcc04d86dbd904ca9a26ab74e7","url":"assets/images/deb2lvreduce-69c88a3c7d47d726b3f53d8d4a029558.png"},{"revision":"cac2ff5f9a66b211d8d409d148e0296d","url":"assets/images/deb2mount-47535d1fc30be8a5130a84d08c5baffa.png"},{"revision":"252bc8189d4b24dbb82e959e667a0f3e","url":"assets/images/deb2part-afc7d7f45486a21f7f1b4105cf911426.png"},{"revision":"5bfe4497ab660b266f1ba9fb94f58318","url":"assets/images/deb2vda-df380a329348a998d653741c510b0f1f.png"},{"revision":"47f8a94c600439abc01cdecca84280a0","url":"assets/images/deb2vdb-8f3efe08930f9955f5a2027c21b171eb.png"},{"revision":"bdd628727c423c1ddbf0333e7bca0bb3","url":"assets/images/deb2vdbfdisk-ed7327e6ee27dc606530b44854355bbd.png"},{"revision":"91b82f194d3337c646f0e065701d6028","url":"assets/images/deb2vdbls-2551627e4265f86532a732860b1a25cc.png"},{"revision":"5113b136b2983a0d019b669bfc19c77d","url":"assets/images/deb2vgextend-38da286bfa1f643833d3e194fccc4b45.png"},{"revision":"adfc463d74f039b5d9ffdac43e6aa901","url":"assets/images/deb3authkeys-542d755b32840d4666e70cebffa94201.png"},{"revision":"91df8b8546e557e018ec70bb66bbaee2","url":"assets/images/deb3boot-7a1171795c1b10cf24f14802061f317e.png"},{"revision":"4701af967aa69cab31fd02574663dff8","url":"assets/images/deb3dhcpfiles-d28bd55a87311155ccc0b7ee37e09178.png"},{"revision":"ec183b1a9e8f5b41a5668c2f2085f5f4","url":"assets/images/deb3interfaces-60f34a7d500e7f7fdb0951e1d9d57b6e.png"},{"revision":"e650028723f90c9cdb88b2bd8a7c246a","url":"assets/images/deb3ipstatic-3718ca17f123687ed10bbbcd357e7ddf.png"},{"revision":"50a49b72562d13a647ead24fe5b52815","url":"assets/images/deb3pingtest1-9c7af002e67c6244f0f6c24a0e874e97.png"},{"revision":"7a37108ca2b4d241f6215d871bb065da","url":"assets/images/deb3sshports-2731d42b835f5895099585c53d51846e.png"},{"revision":"6747442a5a9b8a985d4cee8cc57b80a0","url":"assets/images/deb3tty-2e90dc360487f7d20db9d6dcae51e342.png"},{"revision":"5c92ca285aa1731240a0400f015a6474","url":"assets/images/debgpt-91af182cd6dab26997d3d48be59b28ee.png"},{"revision":"57b640470b4af4e45b050750e1f01b1e","url":"assets/images/debgptlvm-10-c67da4b6c204b6033826515ce2f6aad1.png"},{"revision":"3a9f972ba7ae7e38739c303a1c199167","url":"assets/images/debhostipadd-ef3c4c933e3fc19c6152749ab34f15fd.png"},{"revision":"c70c5f24e9415376e81a47b931816689","url":"assets/images/debhostiproute-8eb5bc3e4d74063b0b9db75083a858da.png"},{"revision":"f9d977e5f8009ee7594b940897a394cb","url":"assets/images/debhostiptables1-1e66efe47984827f51a3bcb020fb7be5.png"},{"revision":"7cb537a8f055d7481ee3fb31c7e1ec20","url":"assets/images/debhostss2-2ea404dbb1f700f00494b36391a8722d.png"},{"revision":"5991a5dfd86c896c7317970a621ee1b3","url":"assets/images/debinstfb-ddfba98b1a5cbeeea65166a534dece35.png"},{"revision":"592c3b27a55c3678150ef76288ce0b5c","url":"assets/images/deblvm1-89ca80dd6f0f298903aa86367bfedc4a.png"},{"revision":"d6f7a711530831fde73bea6a8fc91707","url":"assets/images/debsettings-4378fdda61de4ab1c43742b898a0c0f9.png"},{"revision":"70922632d765e1d46f94765a20d16ac8","url":"assets/images/debsettings2-51aaf7488da8a155153b00a96238c29c.png"},{"revision":"9f3cf4ee692f03d01a1a146bef9ebc53","url":"assets/images/Desk_flip-421c45a0c59b297140d88dd5a57d6aa5.png"},{"revision":"893fa21cf917cd058d39a629d5cf09af","url":"assets/images/df-acc9ad4640a93bae36da5a44cfb8ef0b.png"},{"revision":"fd1f70b0b4a601b75fd8685fedf77636","url":"assets/images/dfdh-694270de46d7c05e71d72d0090c9aeb8.png"},{"revision":"7a633d760cfcdc62707452292c456bee","url":"assets/images/dhclientleases-a35f022dc500545c4975c3ac336bf956.png"},{"revision":"ebc24e8de480873fbedeb7df626a6334","url":"assets/images/Dhcp-pic-a50a5e1b51324c506011084bccdf7fe2.png"},{"revision":"1a855705b8371cbfbd70a9d71e4255d6","url":"assets/images/dhcpd-65112591c22fa90409c57a50d1db4ee0.png"},{"revision":"395d70b353e1beb7ba1f0b1b4ee75642","url":"assets/images/dhcpdconf-8095df47da1ca653db2a7212a630ce1d.png"},{"revision":"55b417578d6b9b8b845a2b37f9373609","url":"assets/images/dhcpdleases-d131ad21e387ef3e46fa5c17aa005c94.png"},{"revision":"6e2f46b26c1aade5a40fe3ed511f1450","url":"assets/images/dhcpdports-fdb722977cdc250ad07bdafd5e3334d4.png"},{"revision":"13425d7315f65ed2b307342e54751595","url":"assets/images/dhcperrors-4fec26881dbdf767fb51a623ca6174ee.png"},{"revision":"5d30b864b91753ccb7c0329e252ed936","url":"assets/images/dhcphostex1-20b9c85bb9f9aa6bb70bd63971af9c74.png"},{"revision":"6a515d8dab12b11135de6b4bed2af0e2","url":"assets/images/dhcplease-726b15096282a39fa2191df083792f2a.png"},{"revision":"8806b249a8fcaed5a02f6f303d51a3ce","url":"assets/images/dhcprenew-38c93714b69544ef712c962229470948.png"},{"revision":"aa907d3f4e61b91bba27151db5226951","url":"assets/images/dhcpstart-4b75ff9a61562ec6a8db2a98992a5950.png"},{"revision":"c0a1a637e010fabb385ec1ca900b9080","url":"assets/images/dhcpsubnet-a87b29643ddde08f0c805db10ed54a7f.png"},{"revision":"0caafa10167b650efea400b1aa46ddba","url":"assets/images/Dora-67a1e54f9f13a472b7173ed2b1ac73b9.png"},{"revision":"6dde2592011dafd00dea727a0e1d30d5","url":"assets/images/Firewall-47ee633533b09162d89becea33f4d978.png"},{"revision":"4b5fe89d949b71e2480f5b09d15ab9eb","url":"assets/images/Format_ExFAT-30d42c25bc240178fb1826d93ec60f92.png"},{"revision":"5ac8d5be7b0c4b5428f3df3eaf36d669","url":"assets/images/hexchat-6d570501c8c1b09203bc41e2d6c7d5f6.png"},{"revision":"0b3b64fa51e85730d44ed9676dc2a8ef","url":"assets/images/hheim-9c82dcda10df94671c430bb5d6ff5925.jpg"},{"revision":"961eff939cdf710a7f95f20997ab1111","url":"assets/images/ipaddr-47a5cc3ce0ae05429175f7e220aed449.png"},{"revision":"c82442c506ac918278f7ef03d21dff02","url":"assets/images/ipaddr2-90ab0adf6ac42bdab8d637aa4f241ce7.png"},{"revision":"fcea0f5e3d10bf1835b0ab717e7e585b","url":"assets/images/iptables1-c85eba8bf6b7d8c106363a7955c86c47.png"},{"revision":"363ba5b9df4300fea029f10b2dd010ec","url":"assets/images/iptables2-df32a8daf66f54f862ce1faab696e855.png"},{"revision":"c770b68e1f21daf6c416f398d2845af2","url":"assets/images/iptables3-21f24fc039ebcaa482b44475fab06528.png"},{"revision":"f2ffb71cb733ff01e98bb258959c8e09","url":"assets/images/iptablesping-4f2802962d91c97a14031b12ea8ab771.png"},{"revision":"68579db0a1d1f325c8e3b37b1fc01a75","url":"assets/images/labenv-9cdc9ec6c2df7d751f585f8f64b73929.png"},{"revision":"f5945c4de8270ea397b02d5f1777eb71","url":"assets/images/Lbreakout2-781121048be19c8e23859aef95b630b8.png"},{"revision":"e5388c515a603469a87818309d456f33","url":"assets/images/lbreakout2run-a5feb22773d7727ee131c7004244f182.png"},{"revision":"52a7d5976b572c873d9460de88219ccd","url":"assets/images/lbreakoutsrc-5337c4fba60d6599e8cb77141c52527f.png"},{"revision":"6d4391ff200176b4d0179094a397ede1","url":"assets/images/libvirtdstatus-e31bc28a98e564cc0920ff28b4560a48.png"},{"revision":"37ef1e8508d7fd1e219e7c7c6bee0554","url":"assets/images/lvm-6fbd5702529da4b1a99ac075a5fe7281.png"},{"revision":"c5f1b19626e4d99f65c7c406907dcdef","url":"assets/images/macaddr-b96e6c5347749c6dfc47c15c03dd1bbb.png"},{"revision":"467c6aab04d4864be20e5a98b230a360","url":"assets/images/memcpu-82e2f90ad23c0b4d3b31a6bfce82dd58.png"},{"revision":"7ee830ad8b76f4ac7c8f010cb4cc85b2","url":"assets/images/My-network-6dda78825fb0ed51c882ba6656cea939.png"},{"revision":"e3ec885f5211dfee51be8e5a50144653","url":"assets/images/ops245net-b82b586dc0ca01b3184a432f1f53dd2c.png"},{"revision":"88713f2b177634edf59be6854098c87d","url":"assets/images/Passwd-file-1daf9dfed5c1484a9966af672d2a99cf.png"},{"revision":"79f3509650fab32dba5ef1afd3b01843","url":"assets/images/pingtest-148fe70b6f99f6af004fd4e5bbb154e0.png"},{"revision":"6106d5abc8e83a777cd3f1ad7948facb","url":"assets/images/scale-b0a1316b41c50f8715e7546801182f25.png"},{"revision":"454cd9ec39d5a57ea4a8ac222b4b6912","url":"assets/images/searchperms-9f89a5fa7839f7f5d7677fa74346cee2.png"},{"revision":"40ba61071a3292f3b91b4b244fdc1988","url":"assets/images/single-0e6933c8c35a91e4164395b882786d60.png"},{"revision":"fb2b828e2f0d77b740901108e9cb0ce7","url":"assets/images/softsel-4b046cb044747458f1516b57f78638c6.png"},{"revision":"6afb740c9fe0bdf084b2f90002d9c009","url":"assets/images/softsel2-237b4c394227f0547a770cab6b79d7c4.png"},{"revision":"d181eb061fcf8ac87e9ae62d277a9b6e","url":"assets/images/Software-ad583618dfc81275bab4da7518b86eb8.png"},{"revision":"b1d193f44c2add93418aa94b1a31cc27","url":"assets/images/Spoof-33a214307013854d9d325b6da862c8c2.png"},{"revision":"6c3d1ee13ba8ce3c55771fa86cc6f1bc","url":"assets/images/sshcopyid-8b6f8a77ec11361ed8f7e91b1b47d287.png"},{"revision":"5323f3652cbbc5c081ceedbee0a88a92","url":"assets/images/sshfingerprint-81531098c0c4404e31c5f3549a45f80e.png"},{"revision":"752cde3df3e8b856803128b07bdf2c7c","url":"assets/images/sshfingerprint2-7cc3123abc96e8dfc628890bfdc2e47c.png"},{"revision":"02c75399a77b926fc4a99e32cd250224","url":"assets/images/sshkeygen-15149528718779ff61c2d0f418e41d47.png"},{"revision":"ebc2bf5f682613d8046decf89238fcce","url":"assets/images/sshpki-9d68829d493cb909c7f3494f3ef2dd83.png"},{"revision":"838a4b3859942eb37869447d86119b77","url":"assets/images/sshx-0d4c723305dc0a14fd57ba1acc4a9164.png"},{"revision":"a60a866f006535c0266b57cbb59677a6","url":"assets/images/tasksel-8338116af69996ab5dda8eb90e8b36b8.png"},{"revision":"a6e10e4a57ca3deea7c3a725898e2992","url":"assets/images/vboxprefs-1f242d29d4497f54ecb4862cdf4116bf.png"},{"revision":"ae8d6367194c2dd1ce8d22c5aa0554ec","url":"assets/images/vmbackup-3bccd0c117ba1826e789bd908c880016.png"},{"revision":"2f50783fa545673b6bf8b6b3f02c8083","url":"assets/images/vmmdefnet-33643f926fa3730be5342ede26c3e9b0.png"},{"revision":"7ffcf69c1d643a17419b960ef528071a","url":"assets/images/vmmedit-1c14d417bc0a2a74f5270e134c019ffb.png"},{"revision":"200f4058159fd3797481e1990060569b","url":"assets/images/vmmnet1start-9d89e96c79d64d8040b05992036c2af6.png"},{"revision":"8efac30d11afd0df28a5b9b0f8d0a5fe","url":"assets/images/vmmnetwork1-02171385f065f6f0d78d022a398fad43.png"},{"revision":"15e551008cab97b38d1e2fb07500a50a","url":"assets/images/vmsource-63351551fd812f36ad9774343f09e5c1.png"},{"revision":"b5aee3b82bc6c93b7ad9a75d31a5607f","url":"assets/images/winhostip-2316e0274f4f00784aa240647278452a.png"},{"revision":"d710471700766a0a27fe0577e10a7df8","url":"img/Andrew.jpg"},{"revision":"f7cbd8988d6b1a8303bb0fffb57499c7","url":"img/ansible-sample-report.png"},{"revision":"c74c206538eae814ebdc9bd4485caf1f","url":"img/Ataur-RTN.jpg"},{"revision":"68aac15bf6cd0b961cfa46d2dacd1edd","url":"img/basicsubnet.png"},{"revision":"7843e5ea6990222327f842c71f52ebeb","url":"img/bgray.png"},{"revision":"b1f473bb93daae30550f6f3ae3f44768","url":"img/caution.png"},{"revision":"cf5d8d13f8f7d0a37ef76d8ea74d4571","url":"img/Chains.png"},{"revision":"67177051b6d4752ef257f8857b0000fb","url":"img/Chris.jpg"},{"revision":"e63f4b9f1dbcbf243dfe822efefbc804","url":"img/cron.png"},{"revision":"6f1937ab17c7ee5341c3db8f58e24c7f","url":"img/crontab.png"},{"revision":"0edffba99e0cbb1ca89e7f465b4af9fd","url":"img/deb1dhcp.png"},{"revision":"14222b5684d521dd6df32790b519ef8a","url":"img/deb1fixedip.png"},{"revision":"1c5a7b01d097ccc00e03bf145641849b","url":"img/deb1groups1.png"},{"revision":"d4105241616028c481a53dee64ca3c9b","url":"img/deb1groups2.png"},{"revision":"7ee1c02a4926527bd891716ec5969977","url":"img/deb1groups3.png"},{"revision":"41497f3345ed6631622446cefffdb53c","url":"img/deb1groups4.png"},{"revision":"3fd25ae10ea25ae2325a147bf77ff183","url":"img/deb1groups5.png"},{"revision":"95bc38cfd41b75440b3f49907bb42ca3","url":"img/deb1grub.png"},{"revision":"0b20bec90ef3277616c1ac3ca0c5595d","url":"img/deb1grub2.png"},{"revision":"288cff0f05faf7c57cbc06b093aed4c1","url":"img/deb1grub3.png"},{"revision":"d31d508519a9ad1ecc076787b17f879b","url":"img/deb1grubinit.png"},{"revision":"bb22770aff2333a38a51f4705ba0c6e0","url":"img/deb1grubsingle.png"},{"revision":"4973f1f92bcde23e79d07f28dbea5b05","url":"img/deb1home1.png"},{"revision":"b2c21cf10c758c8990561abeb2d3d8fb","url":"img/deb1home2.png"},{"revision":"4adca846c7229368fd3b7078186d0070","url":"img/deb1home3.png"},{"revision":"d2698347da714bec15dca770e6f38a25","url":"img/deb1init1.png"},{"revision":"89cd98205da91aa127794767624643b2","url":"img/deb1ipadd1.png"},{"revision":"7564312e40a1ffb7d463ce5c6cc24fce","url":"img/deb1ipadd2.png"},{"revision":"04d59bcb5163d91c8e4400029b7673cc","url":"img/deb1iproute.png"},{"revision":"6fc6f9beab41e4f4f596a1e2d36dc120","url":"img/deb1journal.png"},{"revision":"c2563bd47caf00900a38e16218488bc6","url":"img/deb1login.png"},{"revision":"28fbd0d16b35a10bca7e2a4622ea6b1e","url":"img/deb1netsettings.png"},{"revision":"62f1eb1ca208730738d73cc5c849a62b","url":"img/deb1netstatus.png"},{"revision":"6c7d14b79f00dffbebb6ef38950d433e","url":"img/deb1part.png"},{"revision":"8b2c03463929c23aac7dd5181a3063a1","url":"img/deb1ping.png"},{"revision":"98e710a89292e5f0ec3699c467ff64a1","url":"img/deb1shadow1.png"},{"revision":"e99abaf2da343943a2be37539c4ad587","url":"img/deb1skel1.png"},{"revision":"f8a3f04e33dadc119544422d0a855101","url":"img/deb1staticip.png"},{"revision":"7f7867c9f7e9c6a64204249dbb93e571","url":"img/deb1status.png"},{"revision":"59ec4d1934b1c4171e450ae1f4e334a5","url":"img/deb1sudo1.png"},{"revision":"5fb52cffd15a86e157f3167968754ede","url":"img/deb1systemd.png"},{"revision":"9222c62c98624617f142a00c8b25e072","url":"img/deb1tty.png"},{"revision":"0a8cce4d45d7fefeba55dbc724d6928c","url":"img/deb1users1.png"},{"revision":"a423905c09e07c431fea2fe1e9089d75","url":"img/deb1users2.png"},{"revision":"1eba3c1dcd5a6fba6f1c9c0bd4574fad","url":"img/deb1vmnic.png"},{"revision":"9e55c5101e19aaf14e9973fcb176dba9","url":"img/deb2dfh.png"},{"revision":"c547028c4832cdcb6dea1738f8819d8c","url":"img/deb2diskadd.png"},{"revision":"dc030cff2512ec8b8748ec9f19f588a9","url":"img/deb2fdiskl.png"},{"revision":"b5eaf60eb71610e5b6ec4315cd222a84","url":"img/deb2fstab.png"},{"revision":"edaedecf6ee26422c5fbe92d53653495","url":"img/deb2lvfn.png"},{"revision":"a8d4aa5df222d24da04f92a7216621ff","url":"img/deb2lvm.png"},{"revision":"e7ff0ddcc04d86dbd904ca9a26ab74e7","url":"img/deb2lvreduce.png"},{"revision":"cac2ff5f9a66b211d8d409d148e0296d","url":"img/deb2mount.png"},{"revision":"252bc8189d4b24dbb82e959e667a0f3e","url":"img/deb2part.png"},{"revision":"5bfe4497ab660b266f1ba9fb94f58318","url":"img/deb2vda.png"},{"revision":"47f8a94c600439abc01cdecca84280a0","url":"img/deb2vdb.png"},{"revision":"bdd628727c423c1ddbf0333e7bca0bb3","url":"img/deb2vdbfdisk.png"},{"revision":"91b82f194d3337c646f0e065701d6028","url":"img/deb2vdbls.png"},{"revision":"5113b136b2983a0d019b669bfc19c77d","url":"img/deb2vgextend.png"},{"revision":"adfc463d74f039b5d9ffdac43e6aa901","url":"img/deb3authkeys.png"},{"revision":"91df8b8546e557e018ec70bb66bbaee2","url":"img/deb3boot.png"},{"revision":"4701af967aa69cab31fd02574663dff8","url":"img/deb3dhcpfiles.png"},{"revision":"ec183b1a9e8f5b41a5668c2f2085f5f4","url":"img/deb3interfaces.png"},{"revision":"e650028723f90c9cdb88b2bd8a7c246a","url":"img/deb3ipstatic.png"},{"revision":"50a49b72562d13a647ead24fe5b52815","url":"img/deb3pingtest1.png"},{"revision":"6356a0624e86614b2f795087ca08dd09","url":"img/deb3pingtest2.png"},{"revision":"7a37108ca2b4d241f6215d871bb065da","url":"img/deb3sshports.png"},{"revision":"6747442a5a9b8a985d4cee8cc57b80a0","url":"img/deb3tty.png"},{"revision":"5c92ca285aa1731240a0400f015a6474","url":"img/debgpt.png"},{"revision":"57b640470b4af4e45b050750e1f01b1e","url":"img/debgptlvm-10.png"},{"revision":"3a9f972ba7ae7e38739c303a1c199167","url":"img/debhostipadd.png"},{"revision":"c70c5f24e9415376e81a47b931816689","url":"img/debhostiproute.png"},{"revision":"f9d977e5f8009ee7594b940897a394cb","url":"img/debhostiptables1.png"},{"revision":"e0eea3c05ea1df51e3bb2e83d74d948d","url":"img/debhostss1.png"},{"revision":"7cb537a8f055d7481ee3fb31c7e1ec20","url":"img/debhostss2.png"},{"revision":"ec7ff67256e650afe8497d9f71031aa0","url":"img/debinst.png"},{"revision":"5991a5dfd86c896c7317970a621ee1b3","url":"img/debinstfb.png"},{"revision":"592c3b27a55c3678150ef76288ce0b5c","url":"img/deblvm1.png"},{"revision":"1268fb010585ffc4e04110c999f3a9ff","url":"img/debpower.png"},{"revision":"d6f7a711530831fde73bea6a8fc91707","url":"img/debsettings.png"},{"revision":"70922632d765e1d46f94765a20d16ac8","url":"img/debsettings2.png"},{"revision":"0f8fbf94cd991b46ba5a7928be9bc925","url":"img/debswitch.png"},{"revision":"9f3cf4ee692f03d01a1a146bef9ebc53","url":"img/Desk_flip.png"},{"revision":"893fa21cf917cd058d39a629d5cf09af","url":"img/df.png"},{"revision":"fd1f70b0b4a601b75fd8685fedf77636","url":"img/dfdh.png"},{"revision":"7a633d760cfcdc62707452292c456bee","url":"img/dhclientleases.png"},{"revision":"b76426be5dc9a9d42ea459e686454489","url":"img/Dhcp-config.png"},{"revision":"ebc24e8de480873fbedeb7df626a6334","url":"img/Dhcp-pic.png"},{"revision":"1a855705b8371cbfbd70a9d71e4255d6","url":"img/dhcpd.png"},{"revision":"395d70b353e1beb7ba1f0b1b4ee75642","url":"img/dhcpdconf.png"},{"revision":"55b417578d6b9b8b845a2b37f9373609","url":"img/dhcpdleases.png"},{"revision":"6e2f46b26c1aade5a40fe3ed511f1450","url":"img/dhcpdports.png"},{"revision":"13425d7315f65ed2b307342e54751595","url":"img/dhcperrors.png"},{"revision":"ca3e386dcf45a1d45171ee36bc90410e","url":"img/dhcpfixedaddress.png"},{"revision":"5d30b864b91753ccb7c0329e252ed936","url":"img/dhcphostex1.png"},{"revision":"6a515d8dab12b11135de6b4bed2af0e2","url":"img/dhcplease.png"},{"revision":"8806b249a8fcaed5a02f6f303d51a3ce","url":"img/dhcprenew.png"},{"revision":"aa907d3f4e61b91bba27151db5226951","url":"img/dhcpstart.png"},{"revision":"c0a1a637e010fabb385ec1ca900b9080","url":"img/dhcpsubnet.png"},{"revision":"aba75460b59fbe11656f5faa667e7936","url":"img/Disk_usage.png"},{"revision":"7fa1a026116afe175cae818030d4ffc4","url":"img/docusaurus.png"},{"revision":"0caafa10167b650efea400b1aa46ddba","url":"img/Dora.png"},{"revision":"ef2266bfb84465c731756b58cde0afb8","url":"img/favicon.ico"},{"revision":"6dde2592011dafd00dea727a0e1d30d5","url":"img/Firewall.png"},{"revision":"4b5fe89d949b71e2480f5b09d15ab9eb","url":"img/Format_ExFAT.png"},{"revision":"41ee72e40a868b1f563a3dea8643527d","url":"img/Group-add.png"},{"revision":"500ff8235a8ae6b46097121c3145fd1d","url":"img/Grub1.png"},{"revision":"07fff2f39bc8d41d0ba8bebffd8c7ed3","url":"img/Grub2_1.png"},{"revision":"3404b63d4d85cad893529a2416a6557f","url":"img/Grub2_3.png"},{"revision":"aa49f60770292ce3a83f6dc1e3cf9321","url":"img/hans.jpg"},{"revision":"5ac8d5be7b0c4b5428f3df3eaf36d669","url":"img/hexchat.png"},{"revision":"0b3b64fa51e85730d44ed9676dc2a8ef","url":"img/hheim.jpg"},{"revision":"961eff939cdf710a7f95f20997ab1111","url":"img/ipaddr.png"},{"revision":"c82442c506ac918278f7ef03d21dff02","url":"img/ipaddr2.png"},{"revision":"fcea0f5e3d10bf1835b0ab717e7e585b","url":"img/iptables1.png"},{"revision":"363ba5b9df4300fea029f10b2dd010ec","url":"img/iptables2.png"},{"revision":"c770b68e1f21daf6c416f398d2845af2","url":"img/iptables3.png"},{"revision":"f2ffb71cb733ff01e98bb258959c8e09","url":"img/iptablesping.png"},{"revision":"f99993171ec32a52ded28e1a707b8e94","url":"img/JasonCarman.jpg"},{"revision":"6674102f2b6632cbc67cc100aaa67029","url":"img/Kvm-warning.jpg"},{"revision":"68579db0a1d1f325c8e3b37b1fc01a75","url":"img/labenv.png"},{"revision":"f5945c4de8270ea397b02d5f1777eb71","url":"img/Lbreakout2.png"},{"revision":"e5388c515a603469a87818309d456f33","url":"img/lbreakout2run.png"},{"revision":"52a7d5976b572c873d9460de88219ccd","url":"img/lbreakoutsrc.png"},{"revision":"6d4391ff200176b4d0179094a397ede1","url":"img/libvirtdstatus.png"},{"revision":"22c6eb8088b86099d5a78b5a13f7b24d","url":"img/logo-dark.svg"},{"revision":"8817e00103e8837d17c2758b0ce25c41","url":"img/logo.svg"},{"revision":"37ef1e8508d7fd1e219e7c7c6bee0554","url":"img/lvm.png"},{"revision":"c5f1b19626e4d99f65c7c406907dcdef","url":"img/macaddr.png"},{"revision":"2f7fec674a94e64ed6f99d7862dd6b87","url":"img/Manage-service.png"},{"revision":"467c6aab04d4864be20e5a98b230a360","url":"img/memcpu.png"},{"revision":"e8a1e3dc158b8bda4acef059b80f3b01","url":"img/Mount.png"},{"revision":"7ee830ad8b76f4ac7c8f010cb4cc85b2","url":"img/My-network.png"},{"revision":"3c11e3b84d60ad50d5bbdbc111fb013e","url":"img/New-network-config.png"},{"revision":"e3ec885f5211dfee51be8e5a50144653","url":"img/ops245net.png"},{"revision":"88713f2b177634edf59be6854098c87d","url":"img/Passwd-file.png"},{"revision":"0020d25f88161f6378144e7a0b53cfdc","url":"img/Petercallaghan.jpg"},{"revision":"79f3509650fab32dba5ef1afd3b01843","url":"img/pingtest.png"},{"revision":"2e1cb1ba37fc5ae886ea57248bdb60bd","url":"img/pwa/icon-192x192.png"},{"revision":"a0f8ed72d3d3489353a57a03aeac9b0d","url":"img/pwa/icon-256x256.png"},{"revision":"ab9ed19e2716b5c233d6132d66204d53","url":"img/pwa/icon-384x384.png"},{"revision":"b71acc5b894ccfac0c22eb39a590f2a0","url":"img/pwa/icon-512x512.png"},{"revision":"6106d5abc8e83a777cd3f1ad7948facb","url":"img/scale.png"},{"revision":"454cd9ec39d5a57ea4a8ac222b4b6912","url":"img/searchperms.png"},{"revision":"40ba61071a3292f3b91b4b244fdc1988","url":"img/single.png"},{"revision":"fb2b828e2f0d77b740901108e9cb0ce7","url":"img/softsel.png"},{"revision":"6afb740c9fe0bdf084b2f90002d9c009","url":"img/softsel2.png"},{"revision":"d181eb061fcf8ac87e9ae62d277a9b6e","url":"img/Software.png"},{"revision":"b1d193f44c2add93418aa94b1a31cc27","url":"img/Spoof.png"},{"revision":"6c3d1ee13ba8ce3c55771fa86cc6f1bc","url":"img/sshcopyid.png"},{"revision":"6a45f06435926da1d455cf6832c40c08","url":"img/sshdconfig.png"},{"revision":"7e4facee54f5ad6881828c975e2cd47a","url":"img/sshdconfig2.png"},{"revision":"053a10c3e0869e535893e94ac9e48471","url":"img/sshdconfig3.png"},{"revision":"5323f3652cbbc5c081ceedbee0a88a92","url":"img/sshfingerprint.png"},{"revision":"752cde3df3e8b856803128b07bdf2c7c","url":"img/sshfingerprint2.png"},{"revision":"02c75399a77b926fc4a99e32cd250224","url":"img/sshkeygen.png"},{"revision":"ebc2bf5f682613d8046decf89238fcce","url":"img/sshpki.png"},{"revision":"838a4b3859942eb37869447d86119b77","url":"img/sshx.png"},{"revision":"bc19732a7bfacba678a2a1d41fa57acc","url":"img/Ssm.png"},{"revision":"7d6952fe3f7f5b25926d1997c1d572e6","url":"img/Taskbar.png"},{"revision":"a60a866f006535c0266b57cbb59677a6","url":"img/tasksel.png"},{"revision":"b18cf70d21eabbd45664757a8aae804e","url":"img/Tunel-gedit.png"},{"revision":"b9d9189ed8f8dd58e70d9f8b3f693b3e","url":"img/tutorial/docsVersionDropdown.png"},{"revision":"c14bff79aafafca0957ccc34ee026e2c","url":"img/tutorial/localeDropdown.png"},{"revision":"8d04d316f4d1777793ee773fcbf16cea","url":"img/undraw_docusaurus_mountain.svg"},{"revision":"3d3d63efa464a74e2befd1569465ed21","url":"img/undraw_docusaurus_react.svg"},{"revision":"932b535fc71feb29877bc4b9d708b1d0","url":"img/undraw_docusaurus_tree.svg"},{"revision":"423a919aa294d2642ef9ca44c3884175","url":"img/User-management.png"},{"revision":"7ff7b3009a40dc7f3133b10dba05e301","url":"img/userhomea1.png"},{"revision":"a6e10e4a57ca3deea7c3a725898e2992","url":"img/vboxprefs.png"},{"revision":"cb518e611140f509f2aadb51f85d4360","url":"img/virsh1.png"},{"revision":"5e3b37d5ff458e097eaa0e45fe921c39","url":"img/virtview.png"},{"revision":"ae8d6367194c2dd1ce8d22c5aa0554ec","url":"img/vmbackup.png"},{"revision":"2f50783fa545673b6bf8b6b3f02c8083","url":"img/vmmdefnet.png"},{"revision":"7ffcf69c1d643a17419b960ef528071a","url":"img/vmmedit.png"},{"revision":"200f4058159fd3797481e1990060569b","url":"img/vmmnet1start.png"},{"revision":"8efac30d11afd0df28a5b9b0f8d0a5fe","url":"img/vmmnetwork1.png"},{"revision":"15e551008cab97b38d1e2fb07500a50a","url":"img/vmsource.png"},{"revision":"09a357b3e74f2ec00c686bc06a440ec3","url":"img/vmware1.png"},{"revision":"ddabbb8a678f31e0a6c1acee1b9361d4","url":"img/vmware2.png"},{"revision":"128635393c7175a81b24a933a60d2ebd","url":"img/vmware3.png"},{"revision":"394348157ebec32542aa1e32c4c44a1d","url":"img/vmware4.png"},{"revision":"08dafba3546de1cc4f7198d4baae5b30","url":"img/vmware5.png"},{"revision":"65d41dc3cbd43ec156f4da1db50b657f","url":"img/vmware6.png"},{"revision":"b5aee3b82bc6c93b7ad9a75d31a5607f","url":"img/winhostip.png"}],s=new v({fallbackToNetwork:!0});e.offlineMode&&(s.addToCacheList(t),e.debug&&console.log("[Docusaurus-PWA][SW]: addToCacheList",{precacheManifest:t})),await async function(e){}(),self.addEventListener("install",(t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: install event",{event:t}),t.waitUntil(s.install(t))})),self.addEventListener("activate",(t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: activate event",{event:t}),t.waitUntil(s.activate(t))})),self.addEventListener("fetch",(async t=>{if(e.offlineMode){const a=t.request.url,n=function(e){const t=new URL(e,self.location.href);return t.origin!==self.location.origin?[]:(t.search="",t.hash="",[t.href,`${t.href}${t.pathname.endsWith("/")?"":"/"}index.html`])}(a);for(const i of n){const r=s.getCacheKeyForURL(i);if(r){const s=caches.match(r);e.debug&&console.log("[Docusaurus-PWA][SW]: serving cached asset",{requestURL:a,possibleURL:i,possibleURLs:n,cacheKey:r,cachedResponse:s}),t.respondWith(s);break}}}})),self.addEventListener("message",(async t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: message event",{event:t});const s=t.data?.type;"SKIP_WAITING"===s&&self.skipWaiting()}))})()})()})(); \ No newline at end of file +(()=>{"use strict";var e={913:()=>{try{self["workbox:core:6.5.2"]&&_()}catch(e){}},977:()=>{try{self["workbox:precaching:6.5.2"]&&_()}catch(e){}},80:()=>{try{self["workbox:routing:6.5.2"]&&_()}catch(e){}},873:()=>{try{self["workbox:strategies:6.5.2"]&&_()}catch(e){}}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var i=t[a]={exports:{}};return e[a](i,i.exports,s),i.exports}(()=>{s(913);const e=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class t extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},n=e=>[a.prefix,e,a.suffix].filter((e=>e&&e.length>0)).join("-"),i=e=>e||n(a.precache),r=e=>e||n(a.runtime);function c(e,t){const s=t();return e.waitUntil(s),s}s(977);function o(e){if(!e)throw new t("add-to-cache-list-unexpected-type",{entry:e});if("string"==typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:s,url:a}=e;if(!a)throw new t("add-to-cache-list-unexpected-type",{entry:e});if(!s){const e=new URL(a,location.href);return{cacheKey:e.href,url:e.href}}const n=new URL(a,location.href),i=new URL(a,location.href);return n.searchParams.set("__WB_REVISION__",s),{cacheKey:n.href,url:i.href}}class h{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if("install"===e.type&&t&&t.originalRequest&&t.originalRequest instanceof Request){const e=t.originalRequest.url;s?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return s}}}class l{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const s=(null==t?void 0:t.cacheKey)||this._precacheController.getCacheKeyForURL(e.url);return s?new Request(s,{headers:e.headers}):e},this._precacheController=e}}let u;async function f(e,s){let a=null;if(e.url){a=new URL(e.url).origin}if(a!==self.location.origin)throw new t("cross-origin-copy-response",{origin:a});const n=e.clone(),i={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},r=s?s(i):i,c=function(){if(void 0===u){const e=new Response("");if("body"in e)try{new Response(e.body),u=!0}catch(e){u=!1}u=!1}return u}()?n.body:await n.blob();return new Response(c,r)}function d(e,t){const s=new URL(e);for(const e of t)s.searchParams.delete(e);return s.href}class p{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}const g=new Set;s(873);function y(e){return"string"==typeof e?new Request(e):e}class w{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new p,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:s}=this;let a=y(e);if("navigate"===a.mode&&s instanceof FetchEvent&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}const n=this.hasCallback("fetchDidFail")?a.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))a=await e({request:a.clone(),event:s})}catch(e){if(e instanceof Error)throw new t("plugin-error-request-will-fetch",{thrownErrorMessage:e.message})}const i=a.clone();try{let e;e=await fetch(a,"navigate"===a.mode?void 0:this._strategy.fetchOptions);for(const t of this.iterateCallbacks("fetchDidSucceed"))e=await t({event:s,request:i,response:e});return e}catch(e){throw n&&await this.runCallbacks("fetchDidFail",{error:e,event:s,originalRequest:n.clone(),request:i.clone()}),e}}async fetchAndCachePut(e){const t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){const t=y(e);let s;const{cacheName:a,matchOptions:n}=this._strategy,i=await this.getCacheKey(t,"read"),r=Object.assign(Object.assign({},n),{cacheName:a});s=await caches.match(i,r);for(const e of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await e({cacheName:a,matchOptions:n,cachedResponse:s,request:i,event:this.event})||void 0;return s}async cachePut(e,s){const a=y(e);var n;await(n=0,new Promise((e=>setTimeout(e,n))));const i=await this.getCacheKey(a,"write");if(!s)throw new t("cache-put-with-no-response",{url:(r=i.url,new URL(String(r),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var r;const c=await this._ensureResponseSafeToCache(s);if(!c)return!1;const{cacheName:o,matchOptions:h}=this._strategy,l=await self.caches.open(o),u=this.hasCallback("cacheDidUpdate"),f=u?await async function(e,t,s,a){const n=d(t.url,s);if(t.url===n)return e.match(t,a);const i=Object.assign(Object.assign({},a),{ignoreSearch:!0}),r=await e.keys(t,i);for(const t of r)if(n===d(t.url,s))return e.match(t,a)}(l,i.clone(),["__WB_REVISION__"],h):null;try{await l.put(i,u?c.clone():c)}catch(e){if(e instanceof Error)throw"QuotaExceededError"===e.name&&await async function(){for(const e of g)await e()}(),e}for(const e of this.iterateCallbacks("cacheDidUpdate"))await e({cacheName:o,oldResponse:f,newResponse:c.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){const s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let a=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))a=y(await e({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[s]=a}return this._cacheKeys[s]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"==typeof t[e]){const s=this._pluginStateMap.get(t),a=a=>{const n=Object.assign(Object.assign({},a),{state:s});return t[e](n)};yield a}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(const e of this.iterateCallbacks("cacheWillUpdate"))if(t=await e({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&200!==t.status&&(t=void 0),t}}class _ extends class{constructor(e={}){this.cacheName=r(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,s="string"==typeof e.request?new Request(e.request):e.request,a="params"in e?e.params:void 0,n=new w(this,{event:t,request:s,params:a}),i=this._getResponse(n,s,t);return[i,this._awaitComplete(i,n,s,t)]}async _getResponse(e,s,a){let n;await e.runCallbacks("handlerWillStart",{event:a,request:s});try{if(n=await this._handle(s,e),!n||"error"===n.type)throw new t("no-response",{url:s.url})}catch(t){if(t instanceof Error)for(const i of e.iterateCallbacks("handlerDidError"))if(n=await i({error:t,event:a,request:s}),n)break;if(!n)throw t}for(const t of e.iterateCallbacks("handlerWillRespond"))n=await t({event:a,request:s,response:n});return n}async _awaitComplete(e,t,s,a){let n,i;try{n=await e}catch(i){}try{await t.runCallbacks("handlerDidRespond",{event:a,request:s,response:n}),await t.doneWaiting()}catch(e){e instanceof Error&&(i=e)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:s,response:n,error:i}),t.destroy(),i)throw i}}{constructor(e={}){e.cacheName=i(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(_.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const s=await t.cacheMatch(e);return s||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,s){let a;const n=s.params||{};if(!this._fallbackToNetwork)throw new t("missing-precache-entry",{cacheName:this.cacheName,url:e.url});{0;const t=n.integrity,i=e.integrity,r=!i||i===t;if(a=await s.fetch(new Request(e,{integrity:i||t})),t&&r){this._useDefaultCacheabilityPluginIfNeeded();await s.cachePut(e,a.clone());0}}return a}async _handleInstall(e,s){this._useDefaultCacheabilityPluginIfNeeded();const a=await s.fetch(e);if(!await s.cachePut(e,a.clone()))throw new t("bad-precaching-response",{url:e.url,status:a.status});return a}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[s,a]of this.plugins.entries())a!==_.copyRedirectedCacheableResponsesPlugin&&(a===_.defaultPrecacheCacheabilityPlugin&&(e=s),a.cacheWillUpdate&&t++);0===t?this.plugins.push(_.defaultPrecacheCacheabilityPlugin):t>1&&null!==e&&this.plugins.splice(e,1)}}_.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:e})=>!e||e.status>=400?null:e},_.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:e})=>e.redirected?await f(e):e};class v{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new _({cacheName:i(e),plugins:[...t,new l({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const s=[];for(const a of e){"string"==typeof a?s.push(a):a&&void 0===a.revision&&s.push(a.url);const{cacheKey:e,url:n}=o(a),i="string"!=typeof a&&a.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==e)throw new t("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:e});if("string"!=typeof a&&a.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==a.integrity)throw new t("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(e,a.integrity)}if(this._urlsToCacheKeys.set(n,e),this._urlsToCacheModes.set(n,i),s.length>0){const e=`Workbox is precaching URLs without revision info: ${s.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return c(e,(async()=>{const t=new h;this.strategy.plugins.push(t);for(const[t,s]of this._urlsToCacheKeys){const a=this._cacheKeysToIntegrities.get(s),n=this._urlsToCacheModes.get(t),i=new Request(t,{integrity:a,cache:n,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:i,event:e}))}const{updatedURLs:s,notUpdatedURLs:a}=t;return{updatedURLs:s,notUpdatedURLs:a}}))}activate(e){return c(e,(async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),s=new Set(this._urlsToCacheKeys.values()),a=[];for(const n of t)s.has(n.url)||(await e.delete(n),a.push(n.url));return{deletedURLs:a}}))}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const t=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(t);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(e){const s=this.getCacheKeyForURL(e);if(!s)throw new t("non-precached-url",{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:s},t.params),this.strategy.handle(t))}}s(80);(async()=>{const e=function(){const e=JSON.parse(new URLSearchParams(self.location.search).get("params"));return e.debug&&console.log("[Docusaurus-PWA][SW]: Service Worker params:",e),e}(),t=[{"revision":"b774a2909a1d03da23251c95b6f7eb3c","url":"404.html"},{"revision":"0c8cdf44c38d2140c2c0f99974fbf412","url":"A-Labs/lab1.html"},{"revision":"aab488dbd3b580c317a4d66fe054edbc","url":"A-Labs/lab2.html"},{"revision":"21faa9f2f5e5f30c083d4154cd2c70e1","url":"A-Labs/lab3.html"},{"revision":"d7a364c5347adde8c11c313a2868a9cd","url":"A-Labs/lab4.html"},{"revision":"3a985613cfe2a30dfd8f169da23ffc31","url":"A-Labs/lab5.html"},{"revision":"b811b7becd766a8621ab7589543d86b2","url":"A-Labs/lab6.html"},{"revision":"457b66db1775a0ea1caed53eb841c0ba","url":"A-Labs/lab7.html"},{"revision":"191eeac094f7bbdd35530acfb2c29a6f","url":"A-Labs/lab8.html"},{"revision":"4a30e0992a6a9401f7f666bf4fc5df74","url":"assets/css/styles.099fe1a9.css"},{"revision":"c0641430c94e826ce21f7571949b9785","url":"assets/js/131.c4ccb2cd.js"},{"revision":"9052b08f588d2ffc6d3989e80fc7f728","url":"assets/js/17896441.a060fd85.js"},{"revision":"51c7667886a508e98803e50ad448ad1b","url":"assets/js/1be78505.e6a34e9d.js"},{"revision":"d28e1c3f848ddd4429d7231f1f7f335c","url":"assets/js/20d773fc.59e18fb2.js"},{"revision":"191989f06e3bb07ef39e1b3da9c9712f","url":"assets/js/283.70aa2b79.js"},{"revision":"8a62c2f3ab4ac6734337c0cb98c4ce3f","url":"assets/js/2e0c27b7.8ec8f7b9.js"},{"revision":"77b9983b8c591f0747c257a40bf1d5ec","url":"assets/js/30eb2287.e0a67066.js"},{"revision":"b466603781aefc81d9273ef6cc4ab250","url":"assets/js/539.9ddb32f0.js"},{"revision":"796891eecbf72b3c7b6e7f3711b561bb","url":"assets/js/59490aaf.c4d4b317.js"},{"revision":"6439fcc5638da26755406c46ba49bf9f","url":"assets/js/5f827bca.287b3b47.js"},{"revision":"46b50e7e0aa0bc8a4cfab7c9063975d1","url":"assets/js/61c5f690.03486121.js"},{"revision":"e6b44ba2e21a8d60d52fdd937f74042d","url":"assets/js/66689c68.f577c772.js"},{"revision":"551cf9bb2c983d4e2de0b6b468178ce2","url":"assets/js/701584c5.63835578.js"},{"revision":"934b46b5a5e45eaa2cb83d6d352632d3","url":"assets/js/7ca83706.03cd6287.js"},{"revision":"3538d9b2910ef2fd4e827c7813544286","url":"assets/js/8661af7e.27fbddfe.js"},{"revision":"08d1760e46889d7e5606f0508738b2ee","url":"assets/js/9310cf6f.7195b2cb.js"},{"revision":"323f57afbdcec3c5dc46396028347b30","url":"assets/js/935f2afb.c5d8109b.js"},{"revision":"1ee34918a5cccaf0693ac4d6e27aef52","url":"assets/js/972.c12578e7.js"},{"revision":"7ce7ac5a9ab53f1d1a6f7424c175de71","url":"assets/js/9af68f33.f25e8a4f.js"},{"revision":"2baf5e0a8fb7c7093b42fb93b8ece35e","url":"assets/js/ae58fe3c.5b4a7739.js"},{"revision":"da8969905e2b2c816b2f3a98a4af4fe0","url":"assets/js/b9232272.59db8861.js"},{"revision":"c1f17dbb120962a8d61b6f50dab80b0e","url":"assets/js/c0e20c00.63ef2779.js"},{"revision":"5c59fb065f8c350e23bf67fcb2b8952d","url":"assets/js/c396239e.c0185faf.js"},{"revision":"5166a1daf2f004e30bcaecfdca64186c","url":"assets/js/ea934244.a5393965.js"},{"revision":"b3cc46f13745f95008ad3f1d2b5fa1e5","url":"assets/js/eb6a5da1.2eab5f99.js"},{"revision":"722b9a79d128163c6333d9fc4d211b92","url":"assets/js/ebee8391.9f8fafb2.js"},{"revision":"1f7968a76ac62ae36771bc048880d156","url":"assets/js/main.70260956.js"},{"revision":"179c8769d4a400e1ea46142b0fde08ed","url":"assets/js/runtime~main.7167277b.js"},{"revision":"e7dc5439bf17b46abc5a5dec4c9453d5","url":"B-Assignments/assignment1.html"},{"revision":"5d36ed86a11d78b39a8e18edd1daf25d","url":"B-Assignments/assignment2.html"},{"revision":"e49897e940f2b56becc01e06a1810ccb","url":"C-ExtraResources/bash-shell-reference-guide.html"},{"revision":"343b6e3a1b61b64162835065a3c52c81","url":"C-ExtraResources/bash-shell-scripting-tips.html"},{"revision":"ad48502614513e6fd693134db433d2ef","url":"C-ExtraResources/bash-shell-tips.html"},{"revision":"b50de06f682494da8689600a584c602b","url":"C-ExtraResources/python-scripting-tips.html"},{"revision":"5a934c8b88663195a2bddf31cc21693a","url":"C-ExtraResources/scripting-exercise.html"},{"revision":"190095eb18d8a5c974f031439932c6db","url":"C-ExtraResources/tips.html"},{"revision":"bdec1987f850ab85b92a2a4c453b3053","url":"index.html"},{"revision":"2524df02c6e551be5aef857403777080","url":"manifest.json"},{"revision":"a26e9fd744db5caac44275da0eea792c","url":"weekly-schedule.html"},{"revision":"68aac15bf6cd0b961cfa46d2dacd1edd","url":"assets/images/basicsubnet-0eb522d5d32dffe632c4a41acc456d43.png"},{"revision":"cf5d8d13f8f7d0a37ef76d8ea74d4571","url":"assets/images/Chains-85c8540e54b680d4e983ce44177a7a27.png"},{"revision":"e63f4b9f1dbcbf243dfe822efefbc804","url":"assets/images/cron-eed842dff3680778b52aea1ec19ad84e.png"},{"revision":"14222b5684d521dd6df32790b519ef8a","url":"assets/images/deb1fixedip-7e9d6f48b6ee28e416365945e0b2ad15.png"},{"revision":"1c5a7b01d097ccc00e03bf145641849b","url":"assets/images/deb1groups1-b44262266b1615db77c7d56bc4e667f3.png"},{"revision":"d4105241616028c481a53dee64ca3c9b","url":"assets/images/deb1groups2-72a1904523edb5b83d31c5a994919aca.png"},{"revision":"7ee1c02a4926527bd891716ec5969977","url":"assets/images/deb1groups3-321eb083074a92c982fab22b3b9f7f0a.png"},{"revision":"3fd25ae10ea25ae2325a147bf77ff183","url":"assets/images/deb1groups5-80a9924b068c4c3001d13b976a288f62.png"},{"revision":"95bc38cfd41b75440b3f49907bb42ca3","url":"assets/images/deb1grub-a8bb0d401b9746bfc0c0b304a0d90cba.png"},{"revision":"d31d508519a9ad1ecc076787b17f879b","url":"assets/images/deb1grubinit-61108924e504c9e216e9463dc768cc1c.png"},{"revision":"bb22770aff2333a38a51f4705ba0c6e0","url":"assets/images/deb1grubsingle-7199c603be10dae571840dcdd9f5ad03.png"},{"revision":"4973f1f92bcde23e79d07f28dbea5b05","url":"assets/images/deb1home1-b73351a0b4af12340a0ae8551b100381.png"},{"revision":"b2c21cf10c758c8990561abeb2d3d8fb","url":"assets/images/deb1home2-a57dcec2e26c939e5c1fe12516d90dc7.png"},{"revision":"4adca846c7229368fd3b7078186d0070","url":"assets/images/deb1home3-b3e6aa5fc5b4f022c5b9d82b9cad0ff9.png"},{"revision":"d2698347da714bec15dca770e6f38a25","url":"assets/images/deb1init1-ef61fed69083f1d67ffb1744a9cf863a.png"},{"revision":"89cd98205da91aa127794767624643b2","url":"assets/images/deb1ipadd1-6efc0f533af12817aeb5df1667ad82a6.png"},{"revision":"7564312e40a1ffb7d463ce5c6cc24fce","url":"assets/images/deb1ipadd2-dbb5d80d8cf16a65ffb6b7393a46b5de.png"},{"revision":"04d59bcb5163d91c8e4400029b7673cc","url":"assets/images/deb1iproute-80e030d0941ca69cbd6dc2dd09f769d3.png"},{"revision":"6fc6f9beab41e4f4f596a1e2d36dc120","url":"assets/images/deb1journal-25f1748ebcb7cfa53046f8ce2e7c353f.png"},{"revision":"c2563bd47caf00900a38e16218488bc6","url":"assets/images/deb1login-237a2d1965d5c7c717d6b21888ab2ab2.png"},{"revision":"28fbd0d16b35a10bca7e2a4622ea6b1e","url":"assets/images/deb1netsettings-fcf74bd9415ce851e1ac67aa9a587a0f.png"},{"revision":"62f1eb1ca208730738d73cc5c849a62b","url":"assets/images/deb1netstatus-35e2bc044aa3ad51dcfd35eaea9e02b8.png"},{"revision":"6c7d14b79f00dffbebb6ef38950d433e","url":"assets/images/deb1part-7df8236ca6914350a46d97ecc8562249.png"},{"revision":"8b2c03463929c23aac7dd5181a3063a1","url":"assets/images/deb1ping-397ea4d8a4420d2b1bbaa900d1e5e5df.png"},{"revision":"98e710a89292e5f0ec3699c467ff64a1","url":"assets/images/deb1shadow1-d094d97fbb23cb44af60324965c90cef.png"},{"revision":"e99abaf2da343943a2be37539c4ad587","url":"assets/images/deb1skel1-a46d0c3ced9d2d881674c92578a05d80.png"},{"revision":"f8a3f04e33dadc119544422d0a855101","url":"assets/images/deb1staticip-73a5c688699ebe1f048cc454c7301fdd.png"},{"revision":"7f7867c9f7e9c6a64204249dbb93e571","url":"assets/images/deb1status-7ccd86345cf35c0fcf0a3bbd7aff3553.png"},{"revision":"59ec4d1934b1c4171e450ae1f4e334a5","url":"assets/images/deb1sudo1-7f3d7c53cdbcb3119bcc12a9f78eb0f8.png"},{"revision":"5fb52cffd15a86e157f3167968754ede","url":"assets/images/deb1systemd-be8fe31ca0538422153bba8b4e6d3eaa.png"},{"revision":"9222c62c98624617f142a00c8b25e072","url":"assets/images/deb1tty-4b1fc05496becd9c9f936778089b55ef.png"},{"revision":"0a8cce4d45d7fefeba55dbc724d6928c","url":"assets/images/deb1users1-05d265c6b3b8c7c02defad67bfaf6c80.png"},{"revision":"a423905c09e07c431fea2fe1e9089d75","url":"assets/images/deb1users2-ba79f3ba09a0ffdd414518482c7b0a90.png"},{"revision":"1eba3c1dcd5a6fba6f1c9c0bd4574fad","url":"assets/images/deb1vmnic-ec42fb1e37d2aeb50a490a0b968d8c6a.png"},{"revision":"9e55c5101e19aaf14e9973fcb176dba9","url":"assets/images/deb2dfh-0f2bb29ec16ec00d37e71de38d34a569.png"},{"revision":"c547028c4832cdcb6dea1738f8819d8c","url":"assets/images/deb2diskadd-889cd7f513b335699a0d01b38c11314f.png"},{"revision":"dc030cff2512ec8b8748ec9f19f588a9","url":"assets/images/deb2fdiskl-a1cd31fbab080b869762a7790804f8b2.png"},{"revision":"b5eaf60eb71610e5b6ec4315cd222a84","url":"assets/images/deb2fstab-000b1d49c79ce62772ad5b24ea743235.png"},{"revision":"edaedecf6ee26422c5fbe92d53653495","url":"assets/images/deb2lvfn-09072f16a1a8df00a81ed7b6d1489333.png"},{"revision":"a8d4aa5df222d24da04f92a7216621ff","url":"assets/images/deb2lvm-15af18cfe6ffc7ec3f63ac4a20529fcb.png"},{"revision":"e7ff0ddcc04d86dbd904ca9a26ab74e7","url":"assets/images/deb2lvreduce-69c88a3c7d47d726b3f53d8d4a029558.png"},{"revision":"cac2ff5f9a66b211d8d409d148e0296d","url":"assets/images/deb2mount-47535d1fc30be8a5130a84d08c5baffa.png"},{"revision":"252bc8189d4b24dbb82e959e667a0f3e","url":"assets/images/deb2part-afc7d7f45486a21f7f1b4105cf911426.png"},{"revision":"5bfe4497ab660b266f1ba9fb94f58318","url":"assets/images/deb2vda-df380a329348a998d653741c510b0f1f.png"},{"revision":"47f8a94c600439abc01cdecca84280a0","url":"assets/images/deb2vdb-8f3efe08930f9955f5a2027c21b171eb.png"},{"revision":"bdd628727c423c1ddbf0333e7bca0bb3","url":"assets/images/deb2vdbfdisk-ed7327e6ee27dc606530b44854355bbd.png"},{"revision":"91b82f194d3337c646f0e065701d6028","url":"assets/images/deb2vdbls-2551627e4265f86532a732860b1a25cc.png"},{"revision":"5113b136b2983a0d019b669bfc19c77d","url":"assets/images/deb2vgextend-38da286bfa1f643833d3e194fccc4b45.png"},{"revision":"adfc463d74f039b5d9ffdac43e6aa901","url":"assets/images/deb3authkeys-542d755b32840d4666e70cebffa94201.png"},{"revision":"91df8b8546e557e018ec70bb66bbaee2","url":"assets/images/deb3boot-7a1171795c1b10cf24f14802061f317e.png"},{"revision":"4701af967aa69cab31fd02574663dff8","url":"assets/images/deb3dhcpfiles-d28bd55a87311155ccc0b7ee37e09178.png"},{"revision":"ec183b1a9e8f5b41a5668c2f2085f5f4","url":"assets/images/deb3interfaces-60f34a7d500e7f7fdb0951e1d9d57b6e.png"},{"revision":"e650028723f90c9cdb88b2bd8a7c246a","url":"assets/images/deb3ipstatic-3718ca17f123687ed10bbbcd357e7ddf.png"},{"revision":"50a49b72562d13a647ead24fe5b52815","url":"assets/images/deb3pingtest1-9c7af002e67c6244f0f6c24a0e874e97.png"},{"revision":"7a37108ca2b4d241f6215d871bb065da","url":"assets/images/deb3sshports-2731d42b835f5895099585c53d51846e.png"},{"revision":"6747442a5a9b8a985d4cee8cc57b80a0","url":"assets/images/deb3tty-2e90dc360487f7d20db9d6dcae51e342.png"},{"revision":"5c92ca285aa1731240a0400f015a6474","url":"assets/images/debgpt-91af182cd6dab26997d3d48be59b28ee.png"},{"revision":"57b640470b4af4e45b050750e1f01b1e","url":"assets/images/debgptlvm-10-c67da4b6c204b6033826515ce2f6aad1.png"},{"revision":"3a9f972ba7ae7e38739c303a1c199167","url":"assets/images/debhostipadd-ef3c4c933e3fc19c6152749ab34f15fd.png"},{"revision":"c70c5f24e9415376e81a47b931816689","url":"assets/images/debhostiproute-8eb5bc3e4d74063b0b9db75083a858da.png"},{"revision":"f9d977e5f8009ee7594b940897a394cb","url":"assets/images/debhostiptables1-1e66efe47984827f51a3bcb020fb7be5.png"},{"revision":"7cb537a8f055d7481ee3fb31c7e1ec20","url":"assets/images/debhostss2-2ea404dbb1f700f00494b36391a8722d.png"},{"revision":"5991a5dfd86c896c7317970a621ee1b3","url":"assets/images/debinstfb-ddfba98b1a5cbeeea65166a534dece35.png"},{"revision":"592c3b27a55c3678150ef76288ce0b5c","url":"assets/images/deblvm1-89ca80dd6f0f298903aa86367bfedc4a.png"},{"revision":"d6f7a711530831fde73bea6a8fc91707","url":"assets/images/debsettings-4378fdda61de4ab1c43742b898a0c0f9.png"},{"revision":"70922632d765e1d46f94765a20d16ac8","url":"assets/images/debsettings2-51aaf7488da8a155153b00a96238c29c.png"},{"revision":"9f3cf4ee692f03d01a1a146bef9ebc53","url":"assets/images/Desk_flip-421c45a0c59b297140d88dd5a57d6aa5.png"},{"revision":"893fa21cf917cd058d39a629d5cf09af","url":"assets/images/df-acc9ad4640a93bae36da5a44cfb8ef0b.png"},{"revision":"fd1f70b0b4a601b75fd8685fedf77636","url":"assets/images/dfdh-694270de46d7c05e71d72d0090c9aeb8.png"},{"revision":"7a633d760cfcdc62707452292c456bee","url":"assets/images/dhclientleases-a35f022dc500545c4975c3ac336bf956.png"},{"revision":"ebc24e8de480873fbedeb7df626a6334","url":"assets/images/Dhcp-pic-a50a5e1b51324c506011084bccdf7fe2.png"},{"revision":"1a855705b8371cbfbd70a9d71e4255d6","url":"assets/images/dhcpd-65112591c22fa90409c57a50d1db4ee0.png"},{"revision":"395d70b353e1beb7ba1f0b1b4ee75642","url":"assets/images/dhcpdconf-8095df47da1ca653db2a7212a630ce1d.png"},{"revision":"55b417578d6b9b8b845a2b37f9373609","url":"assets/images/dhcpdleases-d131ad21e387ef3e46fa5c17aa005c94.png"},{"revision":"6e2f46b26c1aade5a40fe3ed511f1450","url":"assets/images/dhcpdports-fdb722977cdc250ad07bdafd5e3334d4.png"},{"revision":"13425d7315f65ed2b307342e54751595","url":"assets/images/dhcperrors-4fec26881dbdf767fb51a623ca6174ee.png"},{"revision":"5d30b864b91753ccb7c0329e252ed936","url":"assets/images/dhcphostex1-20b9c85bb9f9aa6bb70bd63971af9c74.png"},{"revision":"6a515d8dab12b11135de6b4bed2af0e2","url":"assets/images/dhcplease-726b15096282a39fa2191df083792f2a.png"},{"revision":"8806b249a8fcaed5a02f6f303d51a3ce","url":"assets/images/dhcprenew-38c93714b69544ef712c962229470948.png"},{"revision":"aa907d3f4e61b91bba27151db5226951","url":"assets/images/dhcpstart-4b75ff9a61562ec6a8db2a98992a5950.png"},{"revision":"c0a1a637e010fabb385ec1ca900b9080","url":"assets/images/dhcpsubnet-a87b29643ddde08f0c805db10ed54a7f.png"},{"revision":"0caafa10167b650efea400b1aa46ddba","url":"assets/images/Dora-67a1e54f9f13a472b7173ed2b1ac73b9.png"},{"revision":"6dde2592011dafd00dea727a0e1d30d5","url":"assets/images/Firewall-47ee633533b09162d89becea33f4d978.png"},{"revision":"4b5fe89d949b71e2480f5b09d15ab9eb","url":"assets/images/Format_ExFAT-30d42c25bc240178fb1826d93ec60f92.png"},{"revision":"5ac8d5be7b0c4b5428f3df3eaf36d669","url":"assets/images/hexchat-6d570501c8c1b09203bc41e2d6c7d5f6.png"},{"revision":"0b3b64fa51e85730d44ed9676dc2a8ef","url":"assets/images/hheim-9c82dcda10df94671c430bb5d6ff5925.jpg"},{"revision":"961eff939cdf710a7f95f20997ab1111","url":"assets/images/ipaddr-47a5cc3ce0ae05429175f7e220aed449.png"},{"revision":"c82442c506ac918278f7ef03d21dff02","url":"assets/images/ipaddr2-90ab0adf6ac42bdab8d637aa4f241ce7.png"},{"revision":"fcea0f5e3d10bf1835b0ab717e7e585b","url":"assets/images/iptables1-c85eba8bf6b7d8c106363a7955c86c47.png"},{"revision":"363ba5b9df4300fea029f10b2dd010ec","url":"assets/images/iptables2-df32a8daf66f54f862ce1faab696e855.png"},{"revision":"c770b68e1f21daf6c416f398d2845af2","url":"assets/images/iptables3-21f24fc039ebcaa482b44475fab06528.png"},{"revision":"f2ffb71cb733ff01e98bb258959c8e09","url":"assets/images/iptablesping-4f2802962d91c97a14031b12ea8ab771.png"},{"revision":"68579db0a1d1f325c8e3b37b1fc01a75","url":"assets/images/labenv-9cdc9ec6c2df7d751f585f8f64b73929.png"},{"revision":"f5945c4de8270ea397b02d5f1777eb71","url":"assets/images/Lbreakout2-781121048be19c8e23859aef95b630b8.png"},{"revision":"e5388c515a603469a87818309d456f33","url":"assets/images/lbreakout2run-a5feb22773d7727ee131c7004244f182.png"},{"revision":"52a7d5976b572c873d9460de88219ccd","url":"assets/images/lbreakoutsrc-5337c4fba60d6599e8cb77141c52527f.png"},{"revision":"6d4391ff200176b4d0179094a397ede1","url":"assets/images/libvirtdstatus-e31bc28a98e564cc0920ff28b4560a48.png"},{"revision":"37ef1e8508d7fd1e219e7c7c6bee0554","url":"assets/images/lvm-6fbd5702529da4b1a99ac075a5fe7281.png"},{"revision":"c5f1b19626e4d99f65c7c406907dcdef","url":"assets/images/macaddr-b96e6c5347749c6dfc47c15c03dd1bbb.png"},{"revision":"467c6aab04d4864be20e5a98b230a360","url":"assets/images/memcpu-82e2f90ad23c0b4d3b31a6bfce82dd58.png"},{"revision":"7ee830ad8b76f4ac7c8f010cb4cc85b2","url":"assets/images/My-network-6dda78825fb0ed51c882ba6656cea939.png"},{"revision":"e3ec885f5211dfee51be8e5a50144653","url":"assets/images/ops245net-b82b586dc0ca01b3184a432f1f53dd2c.png"},{"revision":"88713f2b177634edf59be6854098c87d","url":"assets/images/Passwd-file-1daf9dfed5c1484a9966af672d2a99cf.png"},{"revision":"79f3509650fab32dba5ef1afd3b01843","url":"assets/images/pingtest-148fe70b6f99f6af004fd4e5bbb154e0.png"},{"revision":"6106d5abc8e83a777cd3f1ad7948facb","url":"assets/images/scale-b0a1316b41c50f8715e7546801182f25.png"},{"revision":"454cd9ec39d5a57ea4a8ac222b4b6912","url":"assets/images/searchperms-9f89a5fa7839f7f5d7677fa74346cee2.png"},{"revision":"40ba61071a3292f3b91b4b244fdc1988","url":"assets/images/single-0e6933c8c35a91e4164395b882786d60.png"},{"revision":"fb2b828e2f0d77b740901108e9cb0ce7","url":"assets/images/softsel-4b046cb044747458f1516b57f78638c6.png"},{"revision":"6afb740c9fe0bdf084b2f90002d9c009","url":"assets/images/softsel2-237b4c394227f0547a770cab6b79d7c4.png"},{"revision":"d181eb061fcf8ac87e9ae62d277a9b6e","url":"assets/images/Software-ad583618dfc81275bab4da7518b86eb8.png"},{"revision":"b1d193f44c2add93418aa94b1a31cc27","url":"assets/images/Spoof-33a214307013854d9d325b6da862c8c2.png"},{"revision":"6c3d1ee13ba8ce3c55771fa86cc6f1bc","url":"assets/images/sshcopyid-8b6f8a77ec11361ed8f7e91b1b47d287.png"},{"revision":"5323f3652cbbc5c081ceedbee0a88a92","url":"assets/images/sshfingerprint-81531098c0c4404e31c5f3549a45f80e.png"},{"revision":"752cde3df3e8b856803128b07bdf2c7c","url":"assets/images/sshfingerprint2-7cc3123abc96e8dfc628890bfdc2e47c.png"},{"revision":"02c75399a77b926fc4a99e32cd250224","url":"assets/images/sshkeygen-15149528718779ff61c2d0f418e41d47.png"},{"revision":"ebc2bf5f682613d8046decf89238fcce","url":"assets/images/sshpki-9d68829d493cb909c7f3494f3ef2dd83.png"},{"revision":"838a4b3859942eb37869447d86119b77","url":"assets/images/sshx-0d4c723305dc0a14fd57ba1acc4a9164.png"},{"revision":"a60a866f006535c0266b57cbb59677a6","url":"assets/images/tasksel-8338116af69996ab5dda8eb90e8b36b8.png"},{"revision":"a6e10e4a57ca3deea7c3a725898e2992","url":"assets/images/vboxprefs-1f242d29d4497f54ecb4862cdf4116bf.png"},{"revision":"ae8d6367194c2dd1ce8d22c5aa0554ec","url":"assets/images/vmbackup-3bccd0c117ba1826e789bd908c880016.png"},{"revision":"2f50783fa545673b6bf8b6b3f02c8083","url":"assets/images/vmmdefnet-33643f926fa3730be5342ede26c3e9b0.png"},{"revision":"7ffcf69c1d643a17419b960ef528071a","url":"assets/images/vmmedit-1c14d417bc0a2a74f5270e134c019ffb.png"},{"revision":"200f4058159fd3797481e1990060569b","url":"assets/images/vmmnet1start-9d89e96c79d64d8040b05992036c2af6.png"},{"revision":"8efac30d11afd0df28a5b9b0f8d0a5fe","url":"assets/images/vmmnetwork1-02171385f065f6f0d78d022a398fad43.png"},{"revision":"15e551008cab97b38d1e2fb07500a50a","url":"assets/images/vmsource-63351551fd812f36ad9774343f09e5c1.png"},{"revision":"b5aee3b82bc6c93b7ad9a75d31a5607f","url":"assets/images/winhostip-2316e0274f4f00784aa240647278452a.png"},{"revision":"d710471700766a0a27fe0577e10a7df8","url":"img/Andrew.jpg"},{"revision":"f7cbd8988d6b1a8303bb0fffb57499c7","url":"img/ansible-sample-report.png"},{"revision":"c74c206538eae814ebdc9bd4485caf1f","url":"img/Ataur-RTN.jpg"},{"revision":"68aac15bf6cd0b961cfa46d2dacd1edd","url":"img/basicsubnet.png"},{"revision":"7843e5ea6990222327f842c71f52ebeb","url":"img/bgray.png"},{"revision":"b1f473bb93daae30550f6f3ae3f44768","url":"img/caution.png"},{"revision":"cf5d8d13f8f7d0a37ef76d8ea74d4571","url":"img/Chains.png"},{"revision":"67177051b6d4752ef257f8857b0000fb","url":"img/Chris.jpg"},{"revision":"e63f4b9f1dbcbf243dfe822efefbc804","url":"img/cron.png"},{"revision":"6f1937ab17c7ee5341c3db8f58e24c7f","url":"img/crontab.png"},{"revision":"0edffba99e0cbb1ca89e7f465b4af9fd","url":"img/deb1dhcp.png"},{"revision":"14222b5684d521dd6df32790b519ef8a","url":"img/deb1fixedip.png"},{"revision":"1c5a7b01d097ccc00e03bf145641849b","url":"img/deb1groups1.png"},{"revision":"d4105241616028c481a53dee64ca3c9b","url":"img/deb1groups2.png"},{"revision":"7ee1c02a4926527bd891716ec5969977","url":"img/deb1groups3.png"},{"revision":"41497f3345ed6631622446cefffdb53c","url":"img/deb1groups4.png"},{"revision":"3fd25ae10ea25ae2325a147bf77ff183","url":"img/deb1groups5.png"},{"revision":"95bc38cfd41b75440b3f49907bb42ca3","url":"img/deb1grub.png"},{"revision":"0b20bec90ef3277616c1ac3ca0c5595d","url":"img/deb1grub2.png"},{"revision":"288cff0f05faf7c57cbc06b093aed4c1","url":"img/deb1grub3.png"},{"revision":"d31d508519a9ad1ecc076787b17f879b","url":"img/deb1grubinit.png"},{"revision":"bb22770aff2333a38a51f4705ba0c6e0","url":"img/deb1grubsingle.png"},{"revision":"4973f1f92bcde23e79d07f28dbea5b05","url":"img/deb1home1.png"},{"revision":"b2c21cf10c758c8990561abeb2d3d8fb","url":"img/deb1home2.png"},{"revision":"4adca846c7229368fd3b7078186d0070","url":"img/deb1home3.png"},{"revision":"d2698347da714bec15dca770e6f38a25","url":"img/deb1init1.png"},{"revision":"89cd98205da91aa127794767624643b2","url":"img/deb1ipadd1.png"},{"revision":"7564312e40a1ffb7d463ce5c6cc24fce","url":"img/deb1ipadd2.png"},{"revision":"04d59bcb5163d91c8e4400029b7673cc","url":"img/deb1iproute.png"},{"revision":"6fc6f9beab41e4f4f596a1e2d36dc120","url":"img/deb1journal.png"},{"revision":"c2563bd47caf00900a38e16218488bc6","url":"img/deb1login.png"},{"revision":"28fbd0d16b35a10bca7e2a4622ea6b1e","url":"img/deb1netsettings.png"},{"revision":"62f1eb1ca208730738d73cc5c849a62b","url":"img/deb1netstatus.png"},{"revision":"6c7d14b79f00dffbebb6ef38950d433e","url":"img/deb1part.png"},{"revision":"8b2c03463929c23aac7dd5181a3063a1","url":"img/deb1ping.png"},{"revision":"98e710a89292e5f0ec3699c467ff64a1","url":"img/deb1shadow1.png"},{"revision":"e99abaf2da343943a2be37539c4ad587","url":"img/deb1skel1.png"},{"revision":"f8a3f04e33dadc119544422d0a855101","url":"img/deb1staticip.png"},{"revision":"7f7867c9f7e9c6a64204249dbb93e571","url":"img/deb1status.png"},{"revision":"59ec4d1934b1c4171e450ae1f4e334a5","url":"img/deb1sudo1.png"},{"revision":"5fb52cffd15a86e157f3167968754ede","url":"img/deb1systemd.png"},{"revision":"9222c62c98624617f142a00c8b25e072","url":"img/deb1tty.png"},{"revision":"0a8cce4d45d7fefeba55dbc724d6928c","url":"img/deb1users1.png"},{"revision":"a423905c09e07c431fea2fe1e9089d75","url":"img/deb1users2.png"},{"revision":"1eba3c1dcd5a6fba6f1c9c0bd4574fad","url":"img/deb1vmnic.png"},{"revision":"9e55c5101e19aaf14e9973fcb176dba9","url":"img/deb2dfh.png"},{"revision":"c547028c4832cdcb6dea1738f8819d8c","url":"img/deb2diskadd.png"},{"revision":"dc030cff2512ec8b8748ec9f19f588a9","url":"img/deb2fdiskl.png"},{"revision":"b5eaf60eb71610e5b6ec4315cd222a84","url":"img/deb2fstab.png"},{"revision":"edaedecf6ee26422c5fbe92d53653495","url":"img/deb2lvfn.png"},{"revision":"a8d4aa5df222d24da04f92a7216621ff","url":"img/deb2lvm.png"},{"revision":"e7ff0ddcc04d86dbd904ca9a26ab74e7","url":"img/deb2lvreduce.png"},{"revision":"cac2ff5f9a66b211d8d409d148e0296d","url":"img/deb2mount.png"},{"revision":"252bc8189d4b24dbb82e959e667a0f3e","url":"img/deb2part.png"},{"revision":"5bfe4497ab660b266f1ba9fb94f58318","url":"img/deb2vda.png"},{"revision":"47f8a94c600439abc01cdecca84280a0","url":"img/deb2vdb.png"},{"revision":"bdd628727c423c1ddbf0333e7bca0bb3","url":"img/deb2vdbfdisk.png"},{"revision":"91b82f194d3337c646f0e065701d6028","url":"img/deb2vdbls.png"},{"revision":"5113b136b2983a0d019b669bfc19c77d","url":"img/deb2vgextend.png"},{"revision":"adfc463d74f039b5d9ffdac43e6aa901","url":"img/deb3authkeys.png"},{"revision":"91df8b8546e557e018ec70bb66bbaee2","url":"img/deb3boot.png"},{"revision":"4701af967aa69cab31fd02574663dff8","url":"img/deb3dhcpfiles.png"},{"revision":"ec183b1a9e8f5b41a5668c2f2085f5f4","url":"img/deb3interfaces.png"},{"revision":"e650028723f90c9cdb88b2bd8a7c246a","url":"img/deb3ipstatic.png"},{"revision":"50a49b72562d13a647ead24fe5b52815","url":"img/deb3pingtest1.png"},{"revision":"6356a0624e86614b2f795087ca08dd09","url":"img/deb3pingtest2.png"},{"revision":"7a37108ca2b4d241f6215d871bb065da","url":"img/deb3sshports.png"},{"revision":"6747442a5a9b8a985d4cee8cc57b80a0","url":"img/deb3tty.png"},{"revision":"5c92ca285aa1731240a0400f015a6474","url":"img/debgpt.png"},{"revision":"57b640470b4af4e45b050750e1f01b1e","url":"img/debgptlvm-10.png"},{"revision":"3a9f972ba7ae7e38739c303a1c199167","url":"img/debhostipadd.png"},{"revision":"c70c5f24e9415376e81a47b931816689","url":"img/debhostiproute.png"},{"revision":"f9d977e5f8009ee7594b940897a394cb","url":"img/debhostiptables1.png"},{"revision":"e0eea3c05ea1df51e3bb2e83d74d948d","url":"img/debhostss1.png"},{"revision":"7cb537a8f055d7481ee3fb31c7e1ec20","url":"img/debhostss2.png"},{"revision":"ec7ff67256e650afe8497d9f71031aa0","url":"img/debinst.png"},{"revision":"5991a5dfd86c896c7317970a621ee1b3","url":"img/debinstfb.png"},{"revision":"592c3b27a55c3678150ef76288ce0b5c","url":"img/deblvm1.png"},{"revision":"1268fb010585ffc4e04110c999f3a9ff","url":"img/debpower.png"},{"revision":"d6f7a711530831fde73bea6a8fc91707","url":"img/debsettings.png"},{"revision":"70922632d765e1d46f94765a20d16ac8","url":"img/debsettings2.png"},{"revision":"0f8fbf94cd991b46ba5a7928be9bc925","url":"img/debswitch.png"},{"revision":"9f3cf4ee692f03d01a1a146bef9ebc53","url":"img/Desk_flip.png"},{"revision":"893fa21cf917cd058d39a629d5cf09af","url":"img/df.png"},{"revision":"fd1f70b0b4a601b75fd8685fedf77636","url":"img/dfdh.png"},{"revision":"7a633d760cfcdc62707452292c456bee","url":"img/dhclientleases.png"},{"revision":"b76426be5dc9a9d42ea459e686454489","url":"img/Dhcp-config.png"},{"revision":"ebc24e8de480873fbedeb7df626a6334","url":"img/Dhcp-pic.png"},{"revision":"1a855705b8371cbfbd70a9d71e4255d6","url":"img/dhcpd.png"},{"revision":"395d70b353e1beb7ba1f0b1b4ee75642","url":"img/dhcpdconf.png"},{"revision":"55b417578d6b9b8b845a2b37f9373609","url":"img/dhcpdleases.png"},{"revision":"6e2f46b26c1aade5a40fe3ed511f1450","url":"img/dhcpdports.png"},{"revision":"13425d7315f65ed2b307342e54751595","url":"img/dhcperrors.png"},{"revision":"ca3e386dcf45a1d45171ee36bc90410e","url":"img/dhcpfixedaddress.png"},{"revision":"5d30b864b91753ccb7c0329e252ed936","url":"img/dhcphostex1.png"},{"revision":"6a515d8dab12b11135de6b4bed2af0e2","url":"img/dhcplease.png"},{"revision":"8806b249a8fcaed5a02f6f303d51a3ce","url":"img/dhcprenew.png"},{"revision":"aa907d3f4e61b91bba27151db5226951","url":"img/dhcpstart.png"},{"revision":"c0a1a637e010fabb385ec1ca900b9080","url":"img/dhcpsubnet.png"},{"revision":"aba75460b59fbe11656f5faa667e7936","url":"img/Disk_usage.png"},{"revision":"7fa1a026116afe175cae818030d4ffc4","url":"img/docusaurus.png"},{"revision":"0caafa10167b650efea400b1aa46ddba","url":"img/Dora.png"},{"revision":"ef2266bfb84465c731756b58cde0afb8","url":"img/favicon.ico"},{"revision":"6dde2592011dafd00dea727a0e1d30d5","url":"img/Firewall.png"},{"revision":"4b5fe89d949b71e2480f5b09d15ab9eb","url":"img/Format_ExFAT.png"},{"revision":"41ee72e40a868b1f563a3dea8643527d","url":"img/Group-add.png"},{"revision":"500ff8235a8ae6b46097121c3145fd1d","url":"img/Grub1.png"},{"revision":"07fff2f39bc8d41d0ba8bebffd8c7ed3","url":"img/Grub2_1.png"},{"revision":"3404b63d4d85cad893529a2416a6557f","url":"img/Grub2_3.png"},{"revision":"aa49f60770292ce3a83f6dc1e3cf9321","url":"img/hans.jpg"},{"revision":"5ac8d5be7b0c4b5428f3df3eaf36d669","url":"img/hexchat.png"},{"revision":"0b3b64fa51e85730d44ed9676dc2a8ef","url":"img/hheim.jpg"},{"revision":"961eff939cdf710a7f95f20997ab1111","url":"img/ipaddr.png"},{"revision":"c82442c506ac918278f7ef03d21dff02","url":"img/ipaddr2.png"},{"revision":"fcea0f5e3d10bf1835b0ab717e7e585b","url":"img/iptables1.png"},{"revision":"363ba5b9df4300fea029f10b2dd010ec","url":"img/iptables2.png"},{"revision":"c770b68e1f21daf6c416f398d2845af2","url":"img/iptables3.png"},{"revision":"f2ffb71cb733ff01e98bb258959c8e09","url":"img/iptablesping.png"},{"revision":"f99993171ec32a52ded28e1a707b8e94","url":"img/JasonCarman.jpg"},{"revision":"6674102f2b6632cbc67cc100aaa67029","url":"img/Kvm-warning.jpg"},{"revision":"68579db0a1d1f325c8e3b37b1fc01a75","url":"img/labenv.png"},{"revision":"f5945c4de8270ea397b02d5f1777eb71","url":"img/Lbreakout2.png"},{"revision":"e5388c515a603469a87818309d456f33","url":"img/lbreakout2run.png"},{"revision":"52a7d5976b572c873d9460de88219ccd","url":"img/lbreakoutsrc.png"},{"revision":"6d4391ff200176b4d0179094a397ede1","url":"img/libvirtdstatus.png"},{"revision":"22c6eb8088b86099d5a78b5a13f7b24d","url":"img/logo-dark.svg"},{"revision":"8817e00103e8837d17c2758b0ce25c41","url":"img/logo.svg"},{"revision":"37ef1e8508d7fd1e219e7c7c6bee0554","url":"img/lvm.png"},{"revision":"c5f1b19626e4d99f65c7c406907dcdef","url":"img/macaddr.png"},{"revision":"2f7fec674a94e64ed6f99d7862dd6b87","url":"img/Manage-service.png"},{"revision":"467c6aab04d4864be20e5a98b230a360","url":"img/memcpu.png"},{"revision":"e8a1e3dc158b8bda4acef059b80f3b01","url":"img/Mount.png"},{"revision":"7ee830ad8b76f4ac7c8f010cb4cc85b2","url":"img/My-network.png"},{"revision":"3c11e3b84d60ad50d5bbdbc111fb013e","url":"img/New-network-config.png"},{"revision":"e3ec885f5211dfee51be8e5a50144653","url":"img/ops245net.png"},{"revision":"88713f2b177634edf59be6854098c87d","url":"img/Passwd-file.png"},{"revision":"0020d25f88161f6378144e7a0b53cfdc","url":"img/Petercallaghan.jpg"},{"revision":"79f3509650fab32dba5ef1afd3b01843","url":"img/pingtest.png"},{"revision":"2e1cb1ba37fc5ae886ea57248bdb60bd","url":"img/pwa/icon-192x192.png"},{"revision":"a0f8ed72d3d3489353a57a03aeac9b0d","url":"img/pwa/icon-256x256.png"},{"revision":"ab9ed19e2716b5c233d6132d66204d53","url":"img/pwa/icon-384x384.png"},{"revision":"b71acc5b894ccfac0c22eb39a590f2a0","url":"img/pwa/icon-512x512.png"},{"revision":"6106d5abc8e83a777cd3f1ad7948facb","url":"img/scale.png"},{"revision":"454cd9ec39d5a57ea4a8ac222b4b6912","url":"img/searchperms.png"},{"revision":"40ba61071a3292f3b91b4b244fdc1988","url":"img/single.png"},{"revision":"fb2b828e2f0d77b740901108e9cb0ce7","url":"img/softsel.png"},{"revision":"6afb740c9fe0bdf084b2f90002d9c009","url":"img/softsel2.png"},{"revision":"d181eb061fcf8ac87e9ae62d277a9b6e","url":"img/Software.png"},{"revision":"b1d193f44c2add93418aa94b1a31cc27","url":"img/Spoof.png"},{"revision":"6c3d1ee13ba8ce3c55771fa86cc6f1bc","url":"img/sshcopyid.png"},{"revision":"6a45f06435926da1d455cf6832c40c08","url":"img/sshdconfig.png"},{"revision":"7e4facee54f5ad6881828c975e2cd47a","url":"img/sshdconfig2.png"},{"revision":"053a10c3e0869e535893e94ac9e48471","url":"img/sshdconfig3.png"},{"revision":"5323f3652cbbc5c081ceedbee0a88a92","url":"img/sshfingerprint.png"},{"revision":"752cde3df3e8b856803128b07bdf2c7c","url":"img/sshfingerprint2.png"},{"revision":"02c75399a77b926fc4a99e32cd250224","url":"img/sshkeygen.png"},{"revision":"ebc2bf5f682613d8046decf89238fcce","url":"img/sshpki.png"},{"revision":"838a4b3859942eb37869447d86119b77","url":"img/sshx.png"},{"revision":"bc19732a7bfacba678a2a1d41fa57acc","url":"img/Ssm.png"},{"revision":"7d6952fe3f7f5b25926d1997c1d572e6","url":"img/Taskbar.png"},{"revision":"a60a866f006535c0266b57cbb59677a6","url":"img/tasksel.png"},{"revision":"b18cf70d21eabbd45664757a8aae804e","url":"img/Tunel-gedit.png"},{"revision":"b9d9189ed8f8dd58e70d9f8b3f693b3e","url":"img/tutorial/docsVersionDropdown.png"},{"revision":"c14bff79aafafca0957ccc34ee026e2c","url":"img/tutorial/localeDropdown.png"},{"revision":"8d04d316f4d1777793ee773fcbf16cea","url":"img/undraw_docusaurus_mountain.svg"},{"revision":"3d3d63efa464a74e2befd1569465ed21","url":"img/undraw_docusaurus_react.svg"},{"revision":"932b535fc71feb29877bc4b9d708b1d0","url":"img/undraw_docusaurus_tree.svg"},{"revision":"423a919aa294d2642ef9ca44c3884175","url":"img/User-management.png"},{"revision":"7ff7b3009a40dc7f3133b10dba05e301","url":"img/userhomea1.png"},{"revision":"a6e10e4a57ca3deea7c3a725898e2992","url":"img/vboxprefs.png"},{"revision":"cb518e611140f509f2aadb51f85d4360","url":"img/virsh1.png"},{"revision":"5e3b37d5ff458e097eaa0e45fe921c39","url":"img/virtview.png"},{"revision":"ae8d6367194c2dd1ce8d22c5aa0554ec","url":"img/vmbackup.png"},{"revision":"2f50783fa545673b6bf8b6b3f02c8083","url":"img/vmmdefnet.png"},{"revision":"7ffcf69c1d643a17419b960ef528071a","url":"img/vmmedit.png"},{"revision":"200f4058159fd3797481e1990060569b","url":"img/vmmnet1start.png"},{"revision":"8efac30d11afd0df28a5b9b0f8d0a5fe","url":"img/vmmnetwork1.png"},{"revision":"15e551008cab97b38d1e2fb07500a50a","url":"img/vmsource.png"},{"revision":"09a357b3e74f2ec00c686bc06a440ec3","url":"img/vmware1.png"},{"revision":"ddabbb8a678f31e0a6c1acee1b9361d4","url":"img/vmware2.png"},{"revision":"128635393c7175a81b24a933a60d2ebd","url":"img/vmware3.png"},{"revision":"394348157ebec32542aa1e32c4c44a1d","url":"img/vmware4.png"},{"revision":"08dafba3546de1cc4f7198d4baae5b30","url":"img/vmware5.png"},{"revision":"65d41dc3cbd43ec156f4da1db50b657f","url":"img/vmware6.png"},{"revision":"b5aee3b82bc6c93b7ad9a75d31a5607f","url":"img/winhostip.png"}],s=new v({fallbackToNetwork:!0});e.offlineMode&&(s.addToCacheList(t),e.debug&&console.log("[Docusaurus-PWA][SW]: addToCacheList",{precacheManifest:t})),await async function(e){}(),self.addEventListener("install",(t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: install event",{event:t}),t.waitUntil(s.install(t))})),self.addEventListener("activate",(t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: activate event",{event:t}),t.waitUntil(s.activate(t))})),self.addEventListener("fetch",(async t=>{if(e.offlineMode){const a=t.request.url,n=function(e){const t=new URL(e,self.location.href);return t.origin!==self.location.origin?[]:(t.search="",t.hash="",[t.href,`${t.href}${t.pathname.endsWith("/")?"":"/"}index.html`])}(a);for(const i of n){const r=s.getCacheKeyForURL(i);if(r){const s=caches.match(r);e.debug&&console.log("[Docusaurus-PWA][SW]: serving cached asset",{requestURL:a,possibleURL:i,possibleURLs:n,cacheKey:r,cachedResponse:s}),t.respondWith(s);break}}}})),self.addEventListener("message",(async t=>{e.debug&&console.log("[Docusaurus-PWA][SW]: message event",{event:t});const s=t.data?.type;"SKIP_WAITING"===s&&self.skipWaiting()}))})()})()})(); \ No newline at end of file diff --git a/weekly-schedule.html b/weekly-schedule.html index 28bd271..aec416c 100644 --- a/weekly-schedule.html +++ b/weekly-schedule.html @@ -14,13 +14,13 @@ Weekly Schedule | OPS245 - Open System Server - +

    Weekly Schedule

    Week 1

    Learning Objectives and TasksLecture NotesEvaluation
    Installing Debian Linux:- Welcome to OPS245Lab 1: Installing Debian Linux
    - Install Debian (Full Install)- Installing Linux
    - Obtain System Information

    Week 2

    Learning Objectives and TasksLecture Notes:Evaluation
    Post-Installation Tasks:Scripting Practice: OPS245 Scripting Exercises
    - Post-Install Commands

    Week 3

    Learning Objectives and TasksLecture Notes:Evaluation
    Creating & Using Virtual Machines- Installing Virtual MachinesLab 2: Creating and Using Virtual Machines
    - Installing and Using Virtualization Software
    - Installing Guest VMs

    Week 4

    Learning Objectives and TasksLecture Notes:Evaluation
    Creating & Using Virtual Machines / Continued:- Managing Virtual Machines
    - Manipulating Virtual Machines
    - Backing-up Virtual Machines
    - Manipulating Virtual Machines

    Week 5

    Learning Objectives and TasksLecture Notes:Evaluation
    Troubleshooting, Archiving, Package Management:- Troubleshooting, Archiving, Package ManagementLab 3: Troubleshooting, Archiving, and Packages
    - Common Troubleshooting Examples
    - Archiving Files
    - Package Management

    Week 6

    Learning Objectives and TasksLecture Notes:Evaluation
    Managing Users, Groups & Services:- Managing Users, Groups & ServicesLab 4: Users, Groups and Services
    - User Management- Managing SudoAssignment 1
    - Group Management
    - Service Status
    - Starting / Stopping Services

    Week 7

    Learning Objectives and TasksLecture Notes:Evaluation
    MIDTERM

    Study Week

    Learning Objectives and TasksLecture Notes:Evaluation

    Week 8

    Learning Objectives and TasksLecture Notes:Evaluation
    Monitoring Disk Space, Intro to LVM- Monitoring Disk Space, crontabLab 5: Monitoring Disk Space - Investigation 1
    - Monitoring Hard Disk Space
    - LVM - Definition
    - Using LVM
    - Creating Shell Scripts to Flag Low Disk Space

    Week 9

    Learning Objectives and TasksLecture Notes:Evaluation
    Using Logical Volume Manager (LVM):Lab 5: Using LVM - Investigation 2
    - Creating Shell Scripts to Flag Low Disk Space- Introduction to LVM
    - Advanced uses of the awk command
    - Demonstration of Growing /home partition using LVM: YouTube

    Week 10

    Learning Objectives and TasksLecture Notes:Evaluation
    Configuring a Network Using Virtual MachinesLab 6: Virtual Networks
    - Static Network Configuration- Creating a Virtual Network
    - Network Configuration with a DHCP client
    - Basic TCP/IP network commands: ping, ip, ss

    Week 11

    Learning Objectives and TasksLecture Notes:Evaluation
    Setup and Configure Secure Shell Services- Securing Network via SSHLab 7: Setup and Configure SSH
    - Network Services- Configuring Firewalls (iptables)
    - SSH

    Week 12

    Learning Objectives and TasksLecture Notes:Evaluation
    Setting Up, Using and Maintaining a DHCP Server- Setting up a DHCP ServerLab 8: Setup and Configure a DHCP Server
    - DHCP Server

    Week 13

    Learning Objectives and TasksLecture Notes:Evaluation
    Assignment 2

    Week 14

    Learning Objectives and TasksLecture Notes:Evaluation
    Final EvaluationFinal Assessment
    - + \ No newline at end of file