code:
---
title: Information about sending patches for review
x-toc-enable: true
...

Useful information, related to Libreboot development, including links to the
Git repositories where development is done. Libreboot development is discussed
on the [IRC channel](https://webchat.freenode.net/?channels=libreboot).

Download Libreboot from the Git repository here:

**git clone https://notabug.org/libreboot/libreboot.git**

General guidelines for submitting patches
-----------------------------------------

We require all patches to be submitted under a free license:
<https://www.gnu.org/licenses/license-list.html>.

You *must* declare copyright on your work, and declare a free license. Not
declaring copyright, especially if you also don't declare a license, means that
the default restrictive copyright laws apply under the Berne convention.

If you wish to submit work without copyright, or with permissive terms, then
the *Creative Commons Zero* license is highly recommended. Otherwise, the **GNU
General Public License, version 3 or (at your option) any later version**, is
preferred; we will also accept any other free license.

Libreboot development is facilitated by *[git](https://git-scm.com/)*, a
*distributed* version control system. You will need to install Git (most
GNU+Linux distributions package it in their repositories).

GNU+Linux is generally recommended as the OS of choice, for Libreboot
development.

General code review guidelines
------------------------------

Non-core members will push to their own repository, and issue a Pull Request.
Core maintainers of Libreboot can push to the repository, but not to the master
branch; they must push it to a non-master branch, and again issue a Pull
Request.

An individual or group of people will then review the patch sent by the
contributor. With approval from a core maintainer, or otherwise someone with
merge rights on the repository, the patch will be merged into the official
*master* branch.

Those with push/merge access on the official Libreboot repository must never
directly push their own patches to the master branch, and they must never
merge their own Pull Request. Regardless of the individual's standing and
frequency of contributions within the project, those who decide whether to
merge a patch will *always* differ from the original contributor.

These guidelines are *enforced*, to avoid the appearance of a BDFL (Benevolent
Dictator for Life) in the Libreboot project, as one previously existed in the
project. Libreboot is a collectively and democratically governed project.
Maintainers who violate these guidelines may, at the discretion of other
maintainers, have their push/merge rights revoked.

How to download Libreboot from the Git repository
-------------------------------------------------

In your terminal:

**git clone https://notabug.org/libreboot/libreboot.git**

A new directory named ***libreboot*** will have been created, containing
libreboot.

How to submit your patches
--------------------------

Make an account on <https://notabug.org/> and navigate (while logged in) to
<https://notabug.org/libreboot/libreboot>. Click *Fork* and in your account,
you will have your own repository of Libreboot. Clone your repository, make
whatever changes you like to it and then push to your repository, in your
account on NotABug.

Now, navigate to <https://notabug.org/libreboot/libreboot/pulls> and click
*New Pull Request*.

You can submit your patches there. Alternative, you can log onto the Libreboot
IRC channel and notify the channel of which patches you want reviewed, if you
have your own Git repository with the patches.

Once you have issued a Pull Request, the Libreboot maintainers will be notified
via email. If you do not receive a fast enough response from the project, then
you could also notify the project via the #libreboot channel on Freenode.


code:
html {
    background-color: #eee;
}

body {
    background-color: #fff;
    margin: 0 auto;
    max-width: 60em;
    padding: 0.2em 1em;
    box-shadow: 0 0 6px;
}

body {
    line-height: 1.6;
    font-family: Cantarell, sans-serif;
    font-size: 1.1em;
    color: #222;
}

#logo {
    width: 20%;
    float: right;
}

a {
    text-decoration: none;
    color: #22D;
}

a:hover {
    color: #008;
}

.date {
    display: block;
}

h1, h2, h3, .h:hover a {
    display: inline;
}

.h a {
    display: none;
}

repo_name: zyliwax/libreboot

license: mit


code:
header {
    text-align: center;
}


code:
---
title: Libreboot
...

[![Libreboot logo](logo/logo.svg "Canteloupe, the libreboot
mascot"){#logo}](faq.md#who-did-the-logo)

[FAQ](faq.md)                                                               --
[Download](download.md)                                                     --
[Install](docs/install/)                                                    --
[Docs](docs/)                                                               --
[News](news/)                                                               --
[Chat](https://webchat.freenode.net/?channels=libreboot)                    --
[Bugs](https://notabug.org/libreboot/libreboot/issues)                      --
[Contribute](git.md)                                                        --
[Buy](suppliers.md)

Libreboot is a [free](https://www.gnu.org/philosophy/free-sw.html) (as in
freedom) BIOS or UEFI replacement, initialising the hardware and booting your
operating system. It is also available preinstalled from
[these suppliers](suppliers.md).

Why use Libreboot?
------------------

Many people use non-free proprietary boot firmware, even if they use GNU+Linux.
Non-free BIOS/UEFI firmware often
[contains](faq.md#intel) [backdoors](faq.md#amd), can be slow and have severe
bugs, and you are left helpless at the mercy of the developers. By contrast,
libreboot is fully free software, where anyone can contribute or inspect its
code.

Libreboot is faster, more secure and more reliable than most non-free
firmware, and can provide many advanced feature, like encrypted
/boot/, GPG signature checking before booting your kernel, ability to
load an OS *from the flash chip*, and more.

Libreboot's main upstream provider is [coreboot](https://www.coreboot.org/),
which we deblob. We upstream our custom patches to projects like coreboot,
depthcharge, GRUB, and flashrom where possible. Together, we provide an
automated build and installation system with nontechnical documentation,
allowing Libreboot to be widely used.


code:
#!/bin/bash
#
# Copyright (C) 2017 Alyssa Rosenzweig <alyssa@rosenzweig.io>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

BLOGTITLE="Libreboot News"
BLOGBASE="https://libreboot.org/"
BLOGDESCRIPTION="News on Libreboot development"

title() {
    sed -n 1p $f | sed -e s-^..--
}

meta() {
    URL=$(echo ${f%.md}.html | sed -e s-news/--)

    echo "[$(title)]($URL){.title}"
    echo "[$(sed -n 3p $f | sed -e s-^..--)]{.date}"
    echo ""
    tail -n +5 $f | perl -p0e 's/(\.|\?|\!)( |\n)(.|\n)*/.../g'

    echo ""
    echo ""
}

# generate the index file

FILES=$(ls -1 -t news/*.md | sed -e s-.*index.md-- -e s-.*presentation.md--)

cat news-list.md > news/index.md

for f in $FILES
do
    touch -d "$(sed -n 3p $f | sed -e 's/^..//g')" $f
    meta >> news/index.md
done

# generate an RSS index

rss() {
    echo '<rss version="2.0">'
    echo '<channel>'

    echo "<title>$BLOGTITLE</title>"
    echo "<link>"$BLOGBASE"news/</link>"
    echo "<description>$BLOGDESCRIPTION</description>"

    for f in $FILES
    do
        # render content and escape
        desc=$(sed ${f%.md}.bare.html -e 's/</\</g' | sed -e 's/>/\>/g')
        url="${f%.md}.html"

        echo '<item>'
        echo "<title>$(title)</title>"
        echo "<link>$BLOGBASE$url</link>"
        echo "<description>$desc</description>"
        echo '</item>'
    done

    echo '</channel>'
    echo '</rss>'
}

rss > news/feed.xml
cp news/feed.xml feed.xml


code:
---
title: General management guidelines and leadership information
x-toc-enable: true
...

This document sets out general guidelines for how the Libreboot project is
governed, managed and who constitutes the core leadership of the project.

All project members must act according to the
[Guidelines for Good Conduct in the Libreboot community](conduct.md).

Democratic governance of the Libreboot project
----------------------------------------------

Previously, the Libreboot leadership was a BDFL (Benevolent Dictator For Life)
arrangement, with the project's founder (Leah Rowe) having exclusive control
over the project, delegating tasks (by her own exclusive discretion) to others.
This style was very similar to the leadership structure of the Linux kernel
project via Linus Torvalds and, while initially effective, was found to be
ineffective and counter-productive in the long term.

The old leadership structure has been **abandoned**, and Leah is no longer leader
of the Libreboot project. This decision was made democratically and
collectively, by the same overall standards set out in this document, with
Leah's direct approval and participation, in the best long-term interests of
the Libreboot project, where she agreed to stand down as project leader.

In principle and in practise, Libreboot is now a collectively and democratically
governed project. Any individual member of the community, regardless of their
current standing or reputation, can propose changes to the project (this
includes code/documentation contributions, project management decisions and
so on). The proposal can be absolutely anything, within reason where it is
relevant to Libreboot and could be beneficial.

All proposals are subject to review and approval by the community. In the case
of code patches, any member of the public can also voice their opinions on a
contribution; the patch will also be reviewed by one of the core maintainers
of the project. In the case of general project decisions, such as general
policies of the project and management roles (such as, removing a core member
who starts acting out of line with and/or in violation of project policies),
the decision will also be polled by the community, to assess public support for
such a decision. With public approval, and agreement among the core maintainers,
the decision would then be enacted, and it falls on them to implement the
mandate that was set, whatever that mandate might be.

Actual places to poll members of the public, shall be decided on by the core
maintainers. Examples could include the IRC channel, the subreddit r/libreboot,
the mailing list (if one exists), and any other place deemed appropriate.

Those who are part of the core maintainers and core management team, can be
appointed and removed at the behest of popular public demand, with approval
from the current
core maintainers and/or management team within the Libreboot project.

Generally, the project should not have a single leader, but if such a role is
required in the future, it will be a rotating leadership, to be changed
after a certain period, subject to approval by the core maintainers and by
popular public demand. Exact infrastructure for how to cast such votes and
make such appointments will be decided at that time, when it becomes necessary
for the Libreboot project.

Information about Libreboot's code review and code management guidelines
can be found
[on the Git section of the website](git.md#general-code-review-guidelines).

Information about core team members, responsible for the Libreboot project
--------------------------------------------------------------------------

- Alyssa Rosenzweig handles Communications and Public Relations\*, acting
  additionally as the official System Administrator for the Libreboot project
  infrastructure.
  IRC nick **alyssa** on Freenode.
- Paul Kocialkowski is one of the core developers. IRC nick **paulk-X** on
  Freenode (**X** is variable, for this individual, and changes over time)
- Leah Rowe is one of the core developers. IRC nick **\_4of7** on Freenode
- Swift Geek is one of the core developers. IRC nick **swiftgeek** on Freenode

All of the people above are moderators in the Libreboot IRC channel, and
form the basis of the project's collective inner leadership, responsible as
trustees for the project in ensuring the projects long-term success and for
general management of the project.

All core members have push access to the Git repository for Libreboot.
Additionally, Alyssa and Leah have SSH access (including root) to the main
server for libreboot.org (this list will expand, if Alyssa and Leah both agree
and if it is appropriate, e.g. if more System Administrators join the
project).

Any member of the public can join this list, if they make substantial
contributions and the core team members agree to it. Libreboot's leadership is
open to the public.

Other team members (IRC operators) who also have influence:

- IRC nick **specing** on the Libreboot IRC channel.
- IRC nick **pizzaiolo** on the Libreboot IRC channel.
- IRC nick **jxself** on the Libreboot IRC channel.

Additionally, Libreboot has a separate set of operators on the subreddit
r/libreboot. Check Reddit for more information. Actions taken by moderators
there are also subject to these management guidelines.

GNU project oversight (pending Libreboot's potential GNU membership)
--------------------------------------------------------------------

Libreboot has applied to become a member of the GNU project, per agreement by
the core maintainers, plus widespread public support. This is being
handled by Alyssa. It is not yet known whether GNU will accept Libreboot, and
we (the core maintainers) are awaiting their response.

If Libreboot is accepted as a GNU member, then the GNU project will also form
as part of Libreboot's core leadership, overseeing the project. This will
include Richard Stallman. GNU's own leadership is separate from that of the
Libreboot project (and vice versa), at present, but they would merge on
Libreboot's side if a union does occur.


code:
% News announcements from the Libreboot project

Updates to libreboot, both technical and organisational, will be written about
here over time. Subscribe to [RSS](/feed.xml) for notifications.

-------------------------------------------------------------------------------


code:
% Formalising Democracy
% Alyssa Rosenzweig
% 25 Apr 2017

One month ago, the [Open Letter to the Free Software Community](/news/unity.md)
was published, alluding to the new Libreboot leadership. Today, the ideals
expressed there have been formalised into an official project policy. In the
new [General Management Guidelines](/management.md), the ins-and-outs of our
democratic system is codified, including the formal team list. Hint, hint: the
structure isn't "I, Alyssa Rosenzweig, decide everything and Thou shall bow
down to me"! There are four core team members, and we welcome community
feedback for major decisions.

There was an underlying tension in the letter: should Libreboot rejoin GNU? On
purely political and technical levels, the answer is a resounding "yes". We
share the mission of spreading free software. Our communities overlap. Most of
the Libreboot community uses GNU software, and much of GNU uses libreboot.
Technically, the tighter integration is useful. Politically, closer ties will
strengthen both of our projects. But this is neither completely a political or
technical question -- it is a human one.

There is no easy answer to this. But the best course of action is to reach out
beyond the team to the community at large. A number of people ranging from
Libreboot users to GNU developers to casual bystanders chimed in, and the
answer was an overwhelming "yes, you should have done this a month ago!"

With that in mind, we have reapplied for GNU. Leah conducted the initial
discussions, such as the Reddit thread, as she felt that she needed to correct
her own error. I have since been handling the application itself, which was
submitted recently. GNU has not yet made a decision on the matter. Ultimately,
it will be up to Richard Stallman himself whether the mutual benefits of
joining will outweigh any potential awkwardness.

No matter the response, Libreboot remains committed to free software. Whether
or not we need a g'new name, this will never change.


code:
% Community feedback needed on whether Libreboot should re-join the GNU project
%
% 22 Apr 2017

Community feedback is needed on whether Libreboot should re-join the GNU
project, having previously been a member. The discussion place for this topic
is on [this thread in the Libreboot subreddit at reddit.com/r/libreboot/](https://www.reddit.com/r/libreboot/comments/66tdds/proposal_for_libreboot_rejoin_gnu_community/). With sufficient community support, Libreboot will
apply to re-join to become a member of the GNU project. Full reasoning and
history behind this proposal is detailed in the thread.


code:
% Open Letter to the Free Software Community
%
% 2 Apr 2017

To the free software community:

Over the past six months, the Libreboot project has been in a state of discord.
After an issue with a transgender employee at the FSF escalated, Libreboot
publicly left GNU with little consultation from the community. Relations with
so many people were strained. Friendships broken, lines of code never written:
the chaos needs to come to an end.

A series of organisational issues with Libreboot enabled this fallout to occur.
We have since corrected them:

Previously, the libreboot repository and the website could only be modified by
the project leader, Leah Rowe. This setup created a single point of failure,
with little leeway for dissenting contributors. Since then, I have joined the
project as the sysadmin. Along with another contributor, Sebastian "Swift Geek"
Grzywna, direct access to the code and servers is shared. Though the project
cannot yet be completely decentralised, this change is a win for transparency.

Previously, most of libreboot.org, including public statements such as those
regarding GNU, were issued by Leah herself. The rest of the team and the
community were not consulted. As Damien Zammit, a former contributor noted, the
word "we" on old Libreboot notices meant "Leah". But alas, there is no room for
the "royal we" in democracy.

Finally, on a personal note, Leah was at the time struggling with gender
dysphoria and substance abuse. Since then, she has been managing these issues.
She agrees that her behaviour was rash and is determined to find a unifying
solution.

With all of this in mind, were the allegations against the Free Software
Foundation true? Perhaps. Perhaps not. At this point, it doesn't matter.
Indeed, it is unlikely that Libreboot will ever rejoin GNU, but feuding in an
already fragmented community helps nobody. The world of free software is
shrinking and under attack. Though the FSF may make mistakes from time to time,
so do we. We do not need another divide.

Similarly, we would like to work closely with librecore, another project
working to deblob coreboot, whose team includes Damien Zammit. Once librecore
matures, libreboot plans to switch to librecore in lieu of our current
deblobbed fork. That is, there will be less duplication of effort; instead of
competing with librecore, libreboot will complement it.

As a technical update, we are currently working on a Libreboot port to
the X220. Leah and Swift are investigating ways to disable the ME on
Sandybridge hardware, which potentially means more modern Intel hardware may be
supported. Additionally, Paul Kocialkowski has been working on supporting
several new Chromebooks with ARM chips; these ports will also be available in
an upcoming release.

No more "royal we". No more notorious surprises. No more late night
"typofixes".

Transparency and collaboration are the way forward.

~Alyssa Rosenzweig

### A message from Leah, to further complement Alyssa's submission:

I acknowledge that what I did was wrong. Although I felt justified at the time,
I ended up hurting a lot of people, most of whom were uninvolved with any of
the relevant events. At the time of taking Libreboot out of GNU, I was going
through intense personal difficulty in my life, and I was highly unstable.
Presented with a similiar situation, I likely won't respond the way I did
before. I've changed a lot, and I promise this type of thing won't happen
again.

What I'd like the most, is to simply focus on Libreboot as I've always done,
and to forget about what happened in the past and move on.

I sincerely hope that the FSF, GNU project and others who I have hurt, can do
the same. My only goal at present is to continue improving Libreboot, and to do
everything in my power to make libre hardware a reality for everyone, as is the
goal of the Libreboot project.

I will remain in my place as a developer in this project, but everything that I
do from now on will be the result of open collaboration with others in the
project. I very nearly single handedly destroyed this project, and caused a lot
of damage to the entire community, damage which I now wish to repair. I love
Libreboot, Free Software and the community, and my only wish is to see it
thrive.

I wish well any and all outreach organisations that do work with the FSF; e.g.
Outreachy, who are working to do what they can to improve conditions for women,
LGBT people and other minorities in the sphere of computing and engineering
fields, related to Free Software.

I hope that any damage I caused to the community is not permanent.

I'm deeply sorry for the damage and upset that I caused. I will not repeat the
same mistakes twice. To a very specific person, who cannot be named in the
interest of their privacy, but for whom context will allow that person
to know this is for them: I'm especially sorry for the damage that I did to
you during those months, and I sincerely hope that you get what you are
currently seeking. I fully support you in your endeavour, and if I could help
you, I would. You still mean a great deal to me.

I'm especially sorry to John Sullivan and Ruben Rodriguez of the FSF, both of
whom I publicly slandered on the Libreboot website. They did not deserve any of
that. I was being highly abusive towards you both.

I would also like to express my sincerest apology to those GNU maintainers
whose emails I published on the Libreboot website, when all of that chaos was
underway.

I'm sorry to all the other Libreboot maintainers at the time, some of whom felt
like they had no choice but to quit the project because of my actions. Doubly
so for Damien Zammit and Timothy Pearson, both of whom I let down in various
ways afterwards aswell.

I would like to sincerely apologize to Timothy Pearson of Raptor Engineering
in particular, for the damage that I caused with Libreboot's exit from GNU,
while you were running your TALOS workstation campaign. Although I do not know
whether the campaign would have succeeded without all that chaos, my own
actions certainly did not help.

Finally, I would like to once again apologize to the community as a whole, for
the damage that I caused. I hope that I can prove to you all that I do wish to
make amends for the damage, and to improve, and to re-build bridges with the
community, and to once again work with the community in bringing Libreboot and
Free Software forward, into the future.

~Leah Rowe


code:
#!/bin/bash
#
# Copyright (C) 2017 Alyssa Rosenzweig <alyssa@rosenzweig.io>
# Copyright (C) 2017 Leah Rowe <info@minifree.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -e

echo $1
FILE=${1%.md}

cat $1 > temp.md

OPTS=

if [ "${FILE}" != "./index" ]; then
        if [[ $FILE == *index ]]
        then
            DEST="../"
        else
            DEST="./"
        fi

        RETURN="Back to previous index"
        OPTS="-T Libreboot"
else
        OPTS="--css /headercenter.css"
fi

if [ "${FILE}" != "./docs/fdl-1.3" ] && [ "${FILE}" != "./conduct" ]; then
    cat footer.md >> temp.md
fi

# change out .md -> .html
sed temp.md -i -e 's/\.md\(#[a-z\-]*\)*)/.html\1)/g'
sed temp.md -i -e 's/\.md\(#[a-z\-]*\)*]/.html\1]/g'

# work around issue #2872
TOC=$(grep -q "^x-toc-enable: true$" temp.md && echo "--toc --toc-depth=2") || TOC=""

# work around heterogenous pandoc versions
SMART=$(pandoc -v | grep -q '2\.0' || echo "--smart") || SMART=""

# chuck through pandoc
pandoc $TOC $SMART temp.md -s --css /global.css $OPTS \
        --template template.html --metadata return="$RETURN"> $FILE.html

# additionally, produce bare file for RSS
pandoc $1 > $FILE.bare.html

# generate section title anchors as [link]
sed $FILE.html -i -e 's_^<h\([123]\) id="\(.*\)">\(.*\)</h\1>_
<h\1 id="\2">\3</h\1>[link]
_'


code:
User-agent: *
Disallow:


code:
---
title: Rsync repositories for the release archives
...

Create a directory in your web directory (e.g. libreboot/) and put one
of these in your crontab:

Libreboot project, UK (main rsync mirror)
-----------------------------------------

**rsync -avxP --delete --stats rsync.libreboot.org::mirrormirror
/path/to/docroot/libreboot/**

University of Kent, UK (backup mirror)
--------------------------------------

**rsync -avxP --delete --stats
rsync://rsync.mirrorservice.org/libreboot.org/release/
/path/to/docroot/libreboot/**

Princeton university, USA (backup mirror)
-----------------------------------------

**rsync -avxP --delete --stats
rsync://mirror.math.princeton.edu/pub/libreboot/
/path/to/docroot/libreboot/**

linux.ro, Romania (backup mirror)
---------------------------------

**rsync -avxP --delete --stats rsync://ftp.linux.ro/libreboot/
/path/to/docroot/libreboot/**

partyvan.eu, Sweden (backup mirror)
-----------------------------------

**rsync -avxP --delete --stats
rsync://mirror.se.partyvan.eu/pub/libreboot/
/path/to/docroot/libreboot/**

mirror.si, Slovenia (backup mirror)
-----------------------------------

**rsync -avxP --delete --stats rsync://libreboot.mirror.si/libreboot
/path/to/docroot/libreboot/**

Are you running a mirror? Contact the libreboot project, and the link will be
added to the [download](download.md) page.

Libreboot includes statically linked executables. If you need the
sources for those statically linked dependencies inside the executables,
then you can contact the libreboot project using the details on the home
page; source code will be provided. You can download this source code
from [here](ccsource.md).


code:
---
title: Suppliers selling or providing Libreboot pre-installed
...

For some, installing Libreboot can be an intimidating task, so several
companies and individuals have taken it upon themselves to provide systems with
Libreboot preinstalled. This is a list of those companies (sorted into
alphabetical order, to remove bias) along with lists of what Libreboot hardware
they provide (some of these companies also invest money/skills into Libreboot
development):

These lists also include Libreboot-related merchendise, such as stickers.
Some of these hardware sellers also have endorsement from the Free Software
Foundation, via their *Respects Your Freedom* certification program.

Libiquity
=========

Patrick McDermott, the founder of Libiquity, is also a former Libreboot
contributor, having contributed several useful patches to the project.

List of what they sell:
----------------------

-   [Taurinus X200 laptop](https://shop.libiquity.com/product/taurinus-x200) (FSF RYF certified)
-   [Libreboot laptop palmrest stickers](https://shop.libiquity.com/product/libreboot-inside-case-badges-3-pack)
-   [Libreboot laptop lid / desktop chassis stickers](https://shop.libiquity.com/product/libreboot-stickers-shaped-matte-vinyl-2x2.25-3-pack)

Ministry of Freedom (Minifree)
==============================

Leah Rowe, the founder of Minifree, is also the founder of the Libreboot
project, and a current contributor to the project (but Leah is no longer leader
of the Libreboot project, although she still invests money into Libreboot
development, especially ports to newer hardware). Minifree is also the first
company to ever achieve FSF RYF status.

Profits from Minifree sales are invested directly into Libreboot development.

List of what they sell:
-----------------------

-   [Libreboot T400 laptop](https://minifree.org/product/libreboot-t400/) (FSF RYF certified)
-   [Libreboot D16 desktop/workstation](https://minifree.org/product/libreboot-d16/)
-   [Libreboot D16 server](https://minifree.org/product/libreboot-d16-server/)
-   [Libreboot installation service](https://minifree.org/product/libreboot-installation-service/)
-   [Libreboot X200/X220 docking station](https://minifree.org/product/docking-station-for-libreboot-x200/)
-   [Libreboot stickers](https://minifree.org/product/libreboot-stickers/)

Technoethical
=============

Technoethical (formerly Tehnoetic) is a team of free software activists and
developers that are selling hardware pre-installed with libreboot as a way to
fund the activity within their nonprofit foundation.

List of what they sell:
----------------------

-   [Libreboot installation service](https://tehnoetic.com/tet-lis)
-   [Technoethical T500 laptop](https://tehnoetic.com/tet-t500)
-   [Technoethical T400 laptop](https://tehnoetic.com/tet-t400)
-   [Technoethical X200 Tablet laptop](https://tehnoetic.com/tet-x200t)
-   [Technoethical X200 laptop](https://tehnoetic.com/tet-x200)

Vikings
=======

Vikings is the first company to offer hosting on hardware pre-installed with
libreboot and they are also selling the hardware itself to fund the building
of their libreboot-powered datacenter.

List of what they sell:
----------------------

-   [Vikings D16 1U server](https://store.vikings.net/libre-friendly-hardware/the-server-1u)
-   [Vikings D16 mainboard](https://store.vikings.net/libre-friendly-hardware/d16-ryf-certfied) (FSF RYF certified)
-   [Vikings D16 workstation](https://store.vikings.net/libre-friendly-hardware/vikings-d16-workstation)
-   [Vikings X200 laptop](https://store.vikings.net/libre-friendly-hardware/x200-ryf-certfied) (FSF RYF certified)

Other suppliers
===============

Sellers on eBay
---------------

On the eBay website, in various countries, you can search for libreboot and
you may find some individual sellers providing Libreboot-preinstalled hardware.

We cannot verify the quality of these suppliers, but they do exist.

Some of them also provide choice of GNU+Linux distribution, or they may provide
services where you can ship your Libreboot-compatible device to them and they
would install Libreboot for you.

This can be useful for some people, but due to the nature of eBay, we cannot
link to them since eBay listings are regularly deleted due to expiration (some
sellers may choose to have longer listings, or renew expired listings).

There may also be other websites similar to eBay (e.g. mercado livre, available
for several South American countries) that might have Libreboot hardware on
them.

**If you are considering purchasing from a supplier on eBay, make sure to read
their feedback comments for other products that they sell, and check their
seller rating. Don't get duped by a bad seller!**

Workshops/hackerspaces
----------------------

You may have a GNU+Linux User Group, free software workshop or hackerspace near
you that can help you with installing Libreboot, for instance.


code:
<!DOCTYPE html>

  <meta charset="utf-8">
  <meta name="generator" content="pandoc">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
$for(author-meta)$
  <meta name="author" content="$author-meta$">
$endfor$
$if(date-meta)$
  <meta name="dcterms.date" content="$date-meta$">
$endif$
$if(keywords)$
  <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$">
$endif$
  <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>

$if(quotes)$

$endif$
$if(highlighting-css)$

$endif$
$for(css)$
  <link rel="stylesheet" href="$css$">
$endfor$
$if(math)$
  $math$
$endif$
$for(header-includes)$
  $header-includes$
$endfor$
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="/feed.xml"/>

$for(include-before)$
$include-before$
$endfor$
$if(title)$

$title$

$if(subtitle)$

$subtitle$

$endif$
$for(author)$

$author$

$endfor$
$if(date)$

$date$

$endif$

$endif$
$if(return)$
$return$
$endif$
$if(toc)$

$toc$

$endif$
$body$
$for(include-after)$
$include-after$
$endfor$


code:
# ---> C Sharp
# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
[Bb]in/
[Oo]bj/

# mstest test results
TestResults

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.sln.docstates

# Build results
[Dd]ebug/
[Rr]elease/
x64/
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.log
*.vspscc
*.vssscc
.builds

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf

# Visual Studio profiler
*.psess
*.vsp
*.vspx

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*

# NCrunch
*.ncrunch*
.*crunch*.local.xml

# Installshield output folder
[Ee]xpress

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish

# Publish Web Output
*.Publish.xml

# NuGet Packages Directory
packages

# Windows Azure Build Output
csx
*.build.csdef

# Windows Store app package directory
AppPackages/

# Others
[Bb]in
[Oo]bj
sql
TestResults
[Tt]est[Rr]esult*
*.Cache
ClientBin
[Ss]tyle[Cc]op.*
~$*
*.dbmdl
Generated_Code #added for RIA/Silverlight projects

# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML

# ---> MonoDevelop
#User Specific
*.userprefs
*.usertasks

#Mono Project Files
*.pidb
*.resources
test-results/

repo_name: College/DevelopProgramModules

path: .gitignore


code:
# DevelopProgramModules (разработка программных модулей)

Исходники прог на языке C# (используется mono)

-----

Скрины:
1. Программа вычисляющая площадь и длину окружностей (ПР работа №8 / ПР занятие №21)
![окружность](img/screen-shot1.png)

2. Программа эмулятор телевизора
![эмулятор телевизора](img/screen-shot2.png)

3. Программа вычисляющая площадь полной поверхности и объем цилиндра
![цилиндр] (img/&T-17-09-2021-screenshot_000.png)

4. Программа нахождения номера позиции в очереди, в которой находится максимальный элемент (ПР занятие 23)
![очередь] (img/prog-max-index.png)

5. Программа реализующая типы делегатов требуемой сигнатуры и выполняющая с их использованием вызов методов (ПР занятие 24 - 1 задание)

![делегат1] (img/delegate1.png)

6. Программа реализующая вызов методов с помощью делегата, которые получают радиус ‘R’ и вычисляют несколько выражений (ПР занятие 24 - 2 задание)

![делегат2] (img/delegate2.png)

7. Программа составляющая регулярное выражение для проверки значения переменной. Оно должно быть не числом. (ПР занятие 25)

![регулярка] (img/regular.png)

-----


code:
using System;

namespace MyApp
{

	class Program
	{
		static void Main(string[] args)
		{

			Console.WriteLine("\n\t\t-/- Программа вычисления цилиндра -/-");
			Console.WriteLine("=============================================================================\n");
				Console.ForegroundColor = ConsoleColor.Yellow;
			Console.WriteLine("Formulas:");
		    		Console.ForegroundColor = ConsoleColor.White;
			Console.Write("| Площадь полной поверхности >> ");
				Console.ForegroundColor = ConsoleColor.Yellow;
			Console.WriteLine("Площадь = 2 * PI * радиус * (радиус * высота)");
				Console.ForegroundColor = ConsoleColor.White;
			Console.Write("| Объем цилиндра >> ");
				Console.ForegroundColor = ConsoleColor.Yellow;
			Console.WriteLine("Объем = PI * 2^2 * высота");
				Console.ForegroundColor = ConsoleColor.White;
			Console.WriteLine("\n=============================================================================\n");

			Console.Write("Введите кол-во цилиндров, с которыми будут производиться вычисления: ");
			int index = Convert.ToInt32(Console.ReadLine());

			//внесение в массив значения площади поверхности цилиндра
			Roller[] rollerArray = new Roller[index];
			for(int i = 0; i < rollerArray.Length; i++)
			{
				Console.WriteLine("\n=-=-=-=-=-=-=-=-=-=-=-=");
				Console.ForegroundColor = ConsoleColor.Red;
				Console.WriteLine( (i + 1) + "`ый цилиндр" );
				Console.ForegroundColor = ConsoleColor.White;

				rollerArray[i].InputRH();
				rollerArray[i].CalcPlosPol();
				rollerArray[i].CalcVolume();
			}
			Console.WriteLine();

		} //конец основного метода

	} //конец класса

			struct Roller
			{

				public double radius, height;
				public double ploshad, volume; //результаты

				//конструктор инициализации цилиндра
				public Roller(double height, double radius)
				{

					this.height = height;
					this.radius = radius;
					ploshad = 0;
					volume = 0;
				}

				//метод ввода данных
				public void InputRH()
				{
					Console.Write("Введите радиус 'r': ");
					radius = Convert.ToInt32(Console.ReadLine());
					Console.Write("Введите высоту 'h': ");
					height = Convert.ToInt32(Console.ReadLine());

				}

				//метод вычисления полной площади
				public double CalcPlosPol()
				{
					Console.WriteLine("\n\tПолная площадь цилиндра:");
						Console.ForegroundColor = ConsoleColor.Green;
					Console.Write("\tResult >> ");
						Console.ForegroundColor = ConsoleColor.White;

					ploshad = 2 * Math.PI * radius * (radius * height);

					Console.WriteLine($"S = {ploshad:.##}");

					return ploshad;
				}

				//метод вычисления объема
				public double CalcVolume()
				{
				Console.WriteLine("\n\tОбъем цилиндра:");
					Console.ForegroundColor = ConsoleColor.Yellow;
				Console.Write("\tResult >> ");
					Console.ForegroundColor = ConsoleColor.White;

				volume = Math.PI * Math.Pow(radius, 2) * height;

				Console.WriteLine($"V = {volume:.##}");

				return volume;
				}

			} //конец структуры

} //конец пространства имен


code:
using System;

namespace MyProgram
{

	class Program
	{
		static void Main(string[] args)
		{

		 	double radius; //вводимый радиус
			double all_ploshads = 0.0; //(1.1) сумма всех площадей
			int index = 0; //значение и индекса массива

			Console.WriteLine(" \n- Программа нахождения некоторых значений окружности -");
			Console.WriteLine("============================================================");
			Console.Write("Для нахождения площади окружности используется такая формула: ");
			Console.ForegroundColor = ConsoleColor.Red;
			Console.WriteLine("S = PI * r^2");
			Console.ForegroundColor = ConsoleColor.White;

			Console.ForegroundColor = ConsoleColor.Blue;
			Console.Write("\nQuestion: ");
			Console.ForegroundColor = ConsoleColor.White;
			Console.Write("Сколько провести вычислений? >> ");
			index = Convert.ToInt32(Console.ReadLine());
			Console.WriteLine();

				//объявление объекта
				Round obj_round;
				obj_round.ploshad = 0.0;
				obj_round.dlina = 0.0;

			 double[] array_round = new double[index]; //определение массива

				for(int i = 0; i < array_round.Length; i++)
				{

				  Console.WriteLine("\n-----------------------------");
				  Console.ForegroundColor = ConsoleColor.Blue;
				  Console.Write($"\n{i}.");
				  Console.Write(" Input: ");
				  Console.ForegroundColor = ConsoleColor.White;
				  Console.Write("Введите радиус 'r' >> ");
				  radius = Convert.ToDouble(Console.ReadLine());

				  	obj_round.CalcPloshad(radius); //вызываем метод

				  Console.ForegroundColor = ConsoleColor.Green;
				  Console.WriteLine("\nРезультат:");
				  Console.WriteLine($"S = PI * {radius}^2 = {obj_round.ploshad:.##}");
				  Console.ForegroundColor = ConsoleColor.White;

					array_round[i] = obj_round.ploshad; //ввод значений в массив

					all_ploshads += array_round[i]; //сложение значений в массиве

				}

		 	 double average_ploshad = all_ploshads / index; //среднее значение окружности

			 Console.ForegroundColor = ConsoleColor.Green;
			 Console.WriteLine($"\nCредняя площадь: сумма_площадей / кол-во результатов = {average_ploshad:.##}");
			 Console.ForegroundColor = ConsoleColor.White;

			 Console.WriteLine("\n=========================================================");
			 Console.Write("Для нахождения длины окружности используется такая формула: ");
			 Console.ForegroundColor = ConsoleColor.Red;
			 Console.WriteLine("l = 2 * PI * r\n");
			 Console.ForegroundColor = ConsoleColor.White;

			 		obj_round.dlina = 0.0;

			 Console.ForegroundColor = ConsoleColor.Blue;
			 Console.Write("Input: ");
		   	 Console.ForegroundColor = ConsoleColor.White;
			 Console.Write("Введите радиус 'r' >> ");
			 radius = Convert.ToDouble(Console.ReadLine());

			 		obj_round.CalcDlRound(radius);

			 Console.ForegroundColor = ConsoleColor.Green;
			 Console.WriteLine("Результат:");
			 Console.WriteLine($"l = 2 * PI * {radius} = {obj_round.dlina:.##}");
			 Console.WriteLine();

			 Console.ForegroundColor = ConsoleColor.White;

		}

	}

	struct Round
	{

		public double ploshad, dlina;

		//1_метод
		public double CalcPloshad(double rad)
		{
		 ploshad = Math.PI * Math.Pow(rad, 2);
		 return ploshad;
		}

		//2_метод
		public double CalcDlRound(double rad)
		{
		 dlina = 2 * Math.PI * rad;
		 return dlina;
		}

	}

}


code:
using System;
namespace Delegate
{
    class Program
    {
        private static void Proiz(ref int n)
        {
            n *= 3;
        }

        private static void Summa(ref int n)
        {
            n += 7;
        }

        delegate void oper(ref int n); //объявление делегата

        static void Main(string[] args)
        {
            Console.WriteLine("-- Программа вычисления значения функции F(n)=3n+7 --");
            oper result = Proiz; //присвоение метода к переменной делегата
            result += Summa;
            Console.Write("Введите любое число: ");
            int n = Convert.ToInt32(Console.ReadLine());
            result(ref n);
            Console.WriteLine($"Ответ: {n}");
        }
    }
}


code:
using System;
using System.Text.RegularExpressions;
namespace MyProgram
{

    class Program
    {
        delegate double Calc(double R); //объявили делегат

        static void Main(string[] args)
        {
            Calc calculate; //присвоили к делегату переменную
            double radius = 0, result; //инициализируем переменную для ввода радиуса и переменную для вывода значения

            Console.WriteLine("\t-- Программа для расчета выражений --\n");

            calculate = LineRound; //присваиваем к переменной делегата метод
            Console.Write("Введите радиус для расчета длины окружности: ");
            radius = Convert.ToDouble(Console.ReadLine());
            result = calculate(radius);

            calculate = PloshadRound;
            Console.Write("Введите радиус для расчета площади окружности: ");
            radius = Convert.ToDouble(Console.ReadLine());
            result = calculate(radius);

            calculate = SharVolume;
            Console.Write("Введите радиус для расчета объема шара: ");
            radius = Convert.ToDouble(Console.ReadLine());
            result = calculate(radius);
        }

        private static double LineRound(double R)
        {
            double D = 2 * Math.PI * R;
            Console.WriteLine($"D = 2 * 3.14 * {R} = {D:.###}\n-=-=-=-=-=-=-\n");
            return Math.Round(D, 2);
        }

        private static double PloshadRound(double R)
        {
            double S = Math.PI * Math.Pow(R, 2);
            Console.WriteLine($"S = 3.14 * {R}^2 = {S:.###}\n-=-=-=-=-=-=-=-\n");
            return Math.Round(S, 2);
        }

        private static double SharVolume(double R)
        {
            double V = 4.0 / 3.0 * Math.PI * Math.Pow(R, 2);
            Console.WriteLine($"V = 4.0 / 3.0 * 3.14 * {R}^2 = {V:.###}\n-=-=-=-=-=-=-=-\n");
            return Math.Round(V, 2);
        }
    }

}


code:
using System.Collections.Generic;
using System;

//Задача: Найти номер позиции в очереди, на которой стоит
		//максимальный элемент

namespace MyProgram
{
		class Program
		{
			static void Main(string[] args)
			{

			int max_element = 0;
			int digit;
			int index = 0;

			Queue<int> numbers = new Queue<int>();
				numbers.Enqueue(3);
				numbers.Enqueue(5);
				numbers.Enqueue(2);
				numbers.Enqueue(12);
				numbers.Enqueue(8);

			for(int akku = 0; akku < 5; akku++)
			{
				digit = numbers.Dequeue(); //извлекаем первый элемент
				if (digit > max_element)
				{
					max_element = digit;

				}
				Console.WriteLine("{0}. Значение - {1}", akku, digit);
				index = akku;
				Console.WriteLine();
			}

			Console.WriteLine(@"Вывод позиции, в которой
находится максимальный элемент: {0}", index-1);
			Console.WriteLine("\nВывод самого элемента: {0}", max_element);

			}

		}
}


code:
using System;
using System.Text.RegularExpressions;
namespace MyProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            string text1 = "Регулярка";
            string text2 =  "35";
            string text3 =  "Это текст";
            string text4 = "832";

            Regex proverka = new Regex(@"\D");

            //первое условие
            if (proverka.IsMatch(text1) == true)
            {
                Console.WriteLine($"Строка: {text1} - не число");
            }
            else
            {
                Console.WriteLine($"Строка: {text1} - число");
            }

            //второе условие
            if (proverka.IsMatch(text2) == true)
            {
                Console.WriteLine($"Строка: {text2} - не число");
            }
            else
            {
                Console.WriteLine($"Строка: {text2} - число");
            }

            //третье условие
            if (proverka.IsMatch(text3) == true)
            {
                Console.WriteLine($"Строка: {text3} - не число");
            }
            else
            {
                Console.WriteLine($"Строка: {text3} - число");
            }

            //четвертое условие
            if (proverka.IsMatch(text4) == true)
            {
                Console.WriteLine($"Строка: {text4} - не число");
            }
            else
            {
                Console.WriteLine($"Строка: {text4} - число");
            }
        }
    }

}


code:
using System;

namespace Televisor
{

  class Program
  {
   static void Main(string[] args)
   {
    Console.WriteLine("\tВиртуальный телевизор!");
    Console.WriteLine("=========================================\n");

    bool vozvrat = false;
    switcher obj_sw = new switcher();

   while (vozvrat == false)
   {

    Console.WriteLine("Все каналы:");
    Console.WriteLine(@" 0) Россия 1
 1) Discovery
 2) National Geographic
 3) СТС
 4) МАТЧ");
	Console.WriteLine();
    Console.WriteLine(@"Вызовите опцию введя команду:
	|описание|      |команда|
 1. Выключить Телевизор : off
 2. Ввести номер канала : w
 3. Следующий канал     : n
 4. Предыдущий канал    : p ");
    Console.WriteLine();

    Console.ForegroundColor = ConsoleColor.Blue;
    Console.Write("Ввод: ");
    Console.ForegroundColor = ConsoleColor.White;
    string input = Console.ReadLine();
    Console.WriteLine();

     switch (input)
     {
      case "off":
      	        obj_sw.Off();
                vozvrat = true;
                break;

      case "w":
 	        obj_sw.Write();
                break;

      case "n":
		obj_sw.Next();
                break;

      case "p":
		obj_sw.Prev();
                break;

      default:
            Console.ForegroundColor = ConsoleColor.Red;
	    Console.WriteLine("Вы ввели не ту команду!");
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Повторите еще раз\n");
            Console.ForegroundColor = ConsoleColor.White;
            break;
	 }
   }
  }
  }

  class switcher
  {
   public int channel = 0;
   public string[] mas_chan = new string[5] {"Россия 1", "Discovery", "National Geographic", "СТС", "МАТЧ"};

   public void Off()
   {
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Выключен телевизор!");
   }

   public void Write()
   {

     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine($"Сейчас вы на канале {mas_chan[channel]}");
     Console.ForegroundColor = ConsoleColor.White;
     Console.Write("Введите номер, чтобы перейти на другой канал: ");
     channel = Convert.ToInt32(Console.ReadLine());

     if ( channel < 0 || channel > 4 )
     {
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine($"Канала с номером {channel} не существует");
      Console.WriteLine("ОШИБКА!");
      Console.ForegroundColor = ConsoleColor.White;
      channel = 0;
     }

     else
     {
      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine($"Вы перешли на канал: {mas_chan[channel]} ");
      Console.ForegroundColor = ConsoleColor.White;
     }

     Console.WriteLine("------------------------------------------------\n");

    }

   public void Next()
   {
    channel++;
    if (channel > 4)
    {
     channel = 0;
     Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine($"Вы перешли на канал: {mas_chan[channel]}");
     Console.ForegroundColor = ConsoleColor.White;
    }

    else
    {
     Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine($"Вы перешли на канал: {mas_chan[channel]}");
     Console.ForegroundColor = ConsoleColor.White;
    }

    Console.WriteLine("------------------------------------------------\n");
   }

   public void Prev()
   {
    if(channel > 0)
    {
     channel--;
     Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine($"Вы перешли на канал: {mas_chan[channel]}");
     Console.ForegroundColor = ConsoleColor.White;
    }

    else
    {
     channel = 0;
      Console.ForegroundColor = ConsoleColor.Green;
     Console.WriteLine($"Вы перешли на канал: {mas_chan[channel]}");
      Console.ForegroundColor = ConsoleColor.White;
    }
     Console.WriteLine("------------------------------------------------\n");
   }

   }

}


code: Material do Curso: [The Bootstrap 4 Bootcamp](https://www.udemy.com/bootstrap-4-bootcamp)

repo_name: avena/bootstrap

license: unknown


code:
body {
    background: #f5d9d5;
    font-family: "Nunito", sans-serif;
}

.blurb h2 {
   color: #EA1C2C;
   font-weight: 100;
   font-size: 2.5rem;
}

.blurb p {
    color: #f498b8;
    font-weight: 100;
    font-size: 1.125rem;
    line-height: 2;
}

.content {
    margin-top: 100px;
    margin-bottom: 100px;
}

#mainNavbar {
    font-size: 1.5rem;
    font-weight: 100;
}

#mainNavbar .nav-link {
    color: white;
}

#mainNavbar .nav-link:hover {
    color: #EA1C2C;
}

#mainNavbar .navbar-brand {
    color: #EA1C2C;
    font-size: 1.5rem;
}

#headingGroup span {
    color: #EA1C2C;
}

#headingGroup h1 {
    font-weight: 100;
    font-size: 4rem;
}

.navbar.scrolled {
    background: rgb(222,192,222);
    transition: background 500ms;
}

@media (max-width: 1200px) {
    #headingGroup h1 {
        font-weight: 100;
        font-size: 3rem;
    }
    .blurb h2 {
        font-size: 2rem;
    }
}


code:
<!doctype html>

  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link href="https://fonts.googleapis.com/css?family=Nunito:200,300,400,700" rel="stylesheet">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
    crossorigin="anonymous">
  <link rel="stylesheet" href="app.css">
  <title>Museum of Candy</title>

  <!doctype html>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link href="https://fonts.googleapis.com/css?family=Nunito:200,300,400,700" rel="stylesheet">

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
      crossorigin="anonymous">
    <link rel="stylesheet" href="app.css">
    <title>Museum of Candy</title>

      CANDY
      <button class="navbar-toggler" data-toggle="collapse" data-target="#navLinks" aria-label="Toggle navigation">

      </button>

            HOME

            ABOUT

            TICKETS

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM/OF/CANDY

MUSEUM OF CANDY

Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque, iste molestiae
                beatae, maiores deserunt
                in voluptatibus
                aspernatur architecto excepturi delectus soluta? Ipsa, deleniti dolorem hic consequatur
                repellat eveniet quidem
                voluptate necessitatibus dolorum delectus minus vitae, ut, veritatis sint ipsum magnam
                autem nam ex deserunt debitis
                eaque ratione! Nobis, quidem assumenda.

MUSEUM OF CANDY

Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque, iste molestiae
                beatae, maiores deserunt
                in voluptatibus
                aspernatur architecto excepturi delectus soluta? Ipsa, deleniti dolorem hic consequatur
                repellat eveniet quidem
                voluptate necessitatibus dolorum delectus minus vitae, ut, veritatis sint ipsum magnam
                autem nam ex deserunt debitis
                eaque ratione! Nobis, quidem assumenda.

MUSEUM OF CANDY

Lorem ipsum dolor sit amet consectetur adipisicing elit. Neque, iste molestiae
                beatae, maiores
                deserunt
                in voluptatibus
                aspernatur architecto excepturi delectus soluta? Ipsa, deleniti dolorem hic consequatur
                repellat eveniet
                quidem
                voluptate necessitatibus dolorum delectus minus vitae, ut, veritatis sint ipsum magnam
                autem nam ex deserunt
                debitis
                eaque ratione! Nobis, quidem assumenda.


code:
/build/
/install/
/release/
/sources/
/libreboot.conf
.version
.revision
.tarfiles
.epoch
push
*.vim
/TODO/
/docs/version
/bucts/
/coreboot/
/crossgcc/
/flashrom/
/grub/
/memtest86plus/
/seabios/
/bin/
/resources/utilities/ich9deblob/*.rom
/resources/utilities/ich9deblob/*.bin
/resources/utilities/ich9deblob/ich9deblob
/resources/utilities/ich9deblob/ich9gen
/resources/utilities/ich9deblob/demefactory
/resources/utilities/ich9deblob/obj/*.o
/resources/utilities/ich9deblob/obj/*/*.o
/resources/utilities/ich9deblob/mkdescriptor*.[ch]
/resources/utilities/ich9deblob/mkgbe*.[ch]
/resources/utilities/grub-assemble/grub_*.elf
/mkgbe.[ch]
/*.bin
/resources/utilities/i945-pwm/i945-pwm
/push
/ChangeLog
/NEWS
/version
/versiondate
/gm45macaddress
tocheck*
*.html
!www/template.html
/www/temp.md
/www/news/index.md

repo_name: termsofservitude/libreboot


code:
Paper Build System
==================

Entry Point
-----------

The entry point for using the paper build system is the main script in the root
directory, named after the build system (paper, libreboot, etc).
Running the main script with no argument will show its general usage.

Configuration
-------------

The paper build system can be configured with a script named after the build
system (paper, libreboot, etc) with a ".conf" suffix. It is automatically loaded
by the build system when running the main script.

It contains environment variables assigned to the desired values. The list of
environment variables is shown in the main script's general usage.

Project and Tool Targets
------------------------

The build system works around the concepts of projects and tools, that define
specific components that can be used to produce either:
* sources
* systems
* images
* tools

Various actions are available for each project and tool targets, many of which
are shown in the main script's general usage. Each project and tool may provide
a usage action that allows to see the specific usage for it. Actions are
executed recursively when no targets are specified.

Each project and tool target has its own directory (either in projects or tools)
that contain a script named after the target and possible a helper script, named
after the script with a "-helper" suffix. The helper script is automatically
included by the build system. Functions in helper scripts are usually prefixed
with the name of the target, where "-" symbols are replaced with "_" symbols.

Each project and tool target's actions are functions defined in the target's
specific script, with names matching the target's actions.

Meta-Targets
------------

Meta targets are project and tool targets that apply the requested action to
individual targets, allowing to execute an action to many targets at once.
For instance, a meta-target named after the build system with a "-all" suffix
would call other meta-targets, prefixed with "-images", "-tools", etc that would
then perform the requested action to all underlying targets.

Projects Actions
----------------

Various generic actions allow preparing projects through a series of steps:
* downloading, extracting or updating the project's sources
* building the project to a build directory
* installing the project to an install directory
* releasing the project to a release directory
* cleaning the build, install and release directories

Actions can be checked by a matching project-specific function, named after the
function to check with a "_check" suffix, to determine whether it is necessary
to run them again to follow the steps. An environment variable can force actions
to be executed, by specifying a space-separated list of projects:
PROJECTS_FORCE.

Projects Configuration and Patches
----------------------------------

Configuration for each project is stored in each project's own directory.
Targets for each project are defined with a "targets" file in each directory
of the "configs" directory. Targets are read recursively, following
sub-directory names for project targets.

Each project's configuration directory can be used to hold target-specific
information and configuration.

An "install" file in each sub-directory indicated which files to grab from the
build files and where to install them in the install directory.

Projects Sources
----------------

Each project can either download specific sources or use another project's
sources, possibly providing its own revision and patches.

Sources are downloaded with the "download" action or can be extracted from
released sources (after placing the sources in the sources directory) with the
"extract" action.

Projects may also keep their sources in a "sources" directory in their
project-specific directory.

Projects Build
--------------

Each project is built to a build directory, named after the project, with the
list of targets separated by a "-" symbol.

An environment variable allows controlling the number of tasks to run at the
same time: TASKS.

Projects Install
----------------

Projects are installed from "install" files in the project directory, that
copies the selected built files to the install directory, named after the
project, with the list of targets separated by a "-" symbol. These install files
are read recursively, following sub-directory names for project targets.

Additional files to install can be specified in the "install" directory and
described in an "install" file. These install files are read recursively,
following sub-directory names for project targets.

Projects Release
----------------

Projects are released to a release directory, named after the project, with the
list of targets separated by a "-" symbol. Each project's install files are
packed into a tarball to the corresponding release directory. A checksum and a
GPG detached signature (if the RELEASE_KEY environment variable is set) are also
generated.

Tarballs are generated reproducibly, from a list of files stored in the
".tarfiles" file. They may also contain the ".epoch", git ".revision" and
".version" files.

Tools Actions
-------------

Tools are used for maintaining the build system, for performing routine tasks
that can be automated. They may have specific actions and not implement any of
the generic actions.

Actions can be checked by a matching tool-specific function, named after the
function to check with a "_check" suffix, to determine whether it is necessary
to run them again to follow the steps. An environment variable can force actions
to be executed, by specifying a space-separated list of tasks: TASKS_FORCE.

Tools Sources
-------------

Tools may keep their sources in a "sources" directory in their tool-specific
directory. These sources may be updated with the "update" action.


code:
Libreboot project

Libreboot documentation is under docs/
The website is https://libreboot.org/
License can be found in COPYING and through parts of the source tree.

Libreboot is a free BIOS or UEFI replacement (free as in freedom); libre boot
firmware that initializes the hardware and starts a bootloader for your
operating system. It's also an open source BIOS, but open source fails to
promote freedom; please call libreboot free software.

Why use libreboot?

Many people use non-free boot firmware, even if they use GNU+Linux. Non-free
BIOS/UEFI firmware often contains backdoors, can be slow and have severe bugs,
where you are left helpless at the mercy of the developers; you have no freedom
over your computing. By contrast, libreboot is building a world where
everyone can use, study, adapt and share software, with true control and
ownership over their technology. In other words, you should use Libreboot for
your freedom's sake!

Libreboot is faster, more secure and more reliable than most non-free firmware,
and can provide many advanced features (such as encrypted /boot/, GPG signature
checking before booting your kernel, ability to load an OS from the flash chip,
and more).

Libreboot's main upstream providers are coreboot (which we deblob, for hardware
initialization), depthcharge (bootloader, and default libreboot payload on ARM),
and GRUB (bootloader, and default libreboot payload on x86). We also
integrate flashrom (for installing libreboot), and several of our own utilities,
scripts and configuration files. All of this is integrated into a single,
coherent package that is easy to use. We add our own patches to the various
upstreams used, and where feasible try to merge upstream as much as possible.

Libreboot provides a fully automated build system and installation process, with
documentation written for non-technical users, in an attempt to make the
software as easy to use as possible. ROM images are provided, along with
utilities, all built from the publicly distributed source code.

This README is licensed under Creative Commons Zero 1.0:
https://creativecommons.org/publicdomain/zero/1.0/

path: README


code:
Libreboot 20160907

For existing boards, there are no new board specific changes.

This release adds one new mainboard to libreboot:
* Intel D945GCLF desktop motherboard (thanks to Arthur Heymans)

Other bugfixes:
* Various improvements to the documentation
* re-added "unset superusers" to the grub.cfg, which was needed for some users
  depending on the distros that they used

Libreboot 20160902

This is a bugfix release, based on 20160818. It contains no new board changes.
The previous 20160818 release had build errors in the _src archive, and the
_util archive was only source code.

Changes compared to 20160818:
* Fixed bug where ./build module coreboot always returned non-zero status
* Fixed missing symlink of crossgcc when building from _src (thanks Arthur
Heymans)
* Fixed building with the depthcharge payload (ASUS C201)
* Proper ChangeLog now, instead of pasted git log
* Util archive is now binaries again (source code is in the _src archive)
* Documentation is now in HTML format

Libreboot 20160818

NEW BOARDS ADDED:
* ASUS Chromebook C201 (ARM laptop) (thanks to Paul Kocialkowski)
* Gigabyte GA-G41M-ES2L motherboard (desktop) (thanks to Damien Zammit)
* Intel D510MO motherboard (desktop) (thanks to Damien Zammit)
* ASUS KCMA-D8 motherboard (desktop) (thanks to Timothy Pearson)
* ASUS KFSN4-DRE motherboard (server) (thanks to Timothy Pearson)
* ASUS KGPE-D16 motherboard (server) (thanks to Timothy Pearson)

For boards previously supported, many fixes from upstream have been merged.

Other changes (compared to libreboot 20150518):
(this is a summary. For more detailed change list, refer to the git log)

256MiB VRAM allocated on GM45 (X200, T400, T500, R400) instead of 32MiB.
This is an improvement over both Lenovo BIOS and Libreboot 20150518, allowing
video decoding at 1080p to be smoother. (thanks Arthur Heymans)
To clarify, GM45 video performance in libreboot 20160818 is better than on
the original BIOS and the previous libreboot release.

64MiB VRAM on i945 (X60, T60, MacBook2,1) now supported in coreboot-libre, and
used by default (in the previous release, it was 8MiB allocated). Thanks to
Arthur Heymans.

Higher battery life on GM45 (X200, T400, T500, R400) due to higher cstates now
being supported (thanks Arthur Heymans). C4 power states also supported.

Text mode on GM45 (X200, T400, T500, R400) now works, making it possible to
use MemTest86+ comfortably. (thanks to Nick High from coreboot)

Dual channel LVDS displays on GM45 (T400, T500) are now automatically
detected in coreboot-libre. (thanks Vladimir Serbinenko from coreboot)

Partial fix in coreboot-libre for GRUB display on GM45, for dual channel
LVDS higher resolution LCD panels (T400, T500). (thanks Arthur Heymans)

Massively improved GRUB configuration, making it easier to boot more
encrypted systems automatically, and generally a more useful menu for booting
the system (thanks go to Klemens Nanni of the autoboot project).
Libreboot now uses the grub.cfg provided by the installed GNU+Linux distribution
automatically, if present, switching to that configuration. This is done across
many partitions, where libreboot actively searches for a configuration file
(also on LVM volumes and encrypted volumes). This should make libreboot more
easy to use for non-technical users, without having to modify the GRUB
configuration used in libreboot.

Utilities archives is now source only. You will need to compile the packages
in there (build scripts included, and a script for installing build
dependencies. (binary utility archives are planned again in the next
release, when the new build system is merged)

SeaGRUB is now the default payload on all x86 boards. (SeaBIOS configured to
load a compressed GRUB payload from CBFS immediately, without providing an
interface in SeaBIOS. This way, GRUB is still used but now BIOS services are
available, so you get the best of both worlds). Thanks go to Timothy Pearson
of coreboot for this idea.

crossgcc is now downloaded and built as a separate module to coreboot-libre,
with a universal revision used to build all boards.

Individual boards now have their own coreboot revision and patches, independently
of each other board. This makes maintenance easier.

Updated all utilities, and modules (coreboot, GRUB, etc) to newer versions,
with various bugfixes and improvements upstream.

RTC century byte issue now fixed on GM45 in coreboot-libre, so the date
should now be correctly displayed when running the latest linux kernel, instead
of seeing 1970-01-01 when you boot (thanks to Alexander Couzens from coreboot)

Build system now uses multiple CPU cores when building, speeding up building
for some people. Manually specifying how many cores are needed is also possible,
for those using the build system in a chroot environment. (thanks go to
Timothy Pearson from coreboot)

In the build system (git repository), https:// is now used when cloning coreboot.
http:// is used as a fallback for GRUB, if git:// fails.

New payload, the depthcharge bootloader (free bootloader maintained by Google)
for use on the ASUS Chromebook C201. (thanks go to Paul Kocialkowski)

Various fixes to the ich9gen utility (e.g. flash component density is now
set correctly in the descriptor, gbe-less descriptors now supported)

path: RELEASE


code:
---
title: How to install FreeBSD on a libreboot system
...

This section relates to preparing, booting and installing FreeBSD on
your libreboot system, using nothing more than a USB flash drive (and
*dd*). They've only been tested on a Lenovo ThinkPad x200.

It is expected that you use text mode in libreboot (txtmode images), for
the early boot process in FreeBSD. **Booting the installer results in a
red flickering text display, and doesn't boot.**

Thanks go to ioxcide in [this Reddit
post](https://www.reddit.com/r/BSD/comments/53jt70/libreboot_and_bsds/)
for the initial instructions.

TODO: test FreeBSD more extensively, and make sure it works (and fix it
if it does not). Instructions are provided here, to boot and install
FreeBSD but we're not sure whether it is currently fully compatible
with libreboot.

-   [Prepare the USB drive (in FreeBSD)](#prepare)
-   [Installing FreeBSD without full disk encryption](#noencryption)
-   [Installing FreeBSD with full disk encryption](#encryption)
-   [Booting](#booting)
-   [Configuring Grub](#configuring_grub)
-   [Troubleshooting](#troubleshooting)

**This section is only for the GRUB payload. For depthcharge (used on
CrOS devices in libreboot), instructions have yet to be written in the
libreboot documentation.**

freebsd.img is the installation image for FreeBSD. Adapt the filename
accordingly, for whatever FreeBSD version you use.

Prepare the USB drive (in FreeBSD)
----------------------------------

[This page](https://www.freebsd.org/doc/handbook/bsdinstall-pre.html) on
the FreeBSD website shows how to create a bootable USB drive for
installing FreeBSD. Use the *dd* on that page.

Prepare the USB drive (in NetBSD)
---------------------------------

[This
page](https://wiki.netbsd.org/tutorials/how_to_install_netbsd_from_an_usb_memory_stick/)
on the NetBSD website shows how to create a NetBSD bootable USB drive
from within NetBSD itself. You should use the *dd* method documented
there; you can use this with any ISO, including FreeBSD.

Prepare the USB drive (in LibertyBSD or OpenBSD)
------------------------------------------------

If you downloaded your ISO on a LibertyBSD or OpenBSD system, here is
how to create the bootable FreeBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg | tail

Check to confirm which drive it is, for example, if you think its sd3:

    $ disklabel sd3

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ doas umount /dev/sd3i

dmesg told you what device it is. Overwrite the drive, writing the
FreeBSD installer to it with dd. For example:

    $ doas dd if=freebsd.img of=/dev/rsdXc bs=1M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Prepare the USB drive (in GNU+Linux)
------------------------------------

If you downloaded your ISO on a GNU+Linux system, here is how to create
the bootable FreeBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg
Check lsblk to confirm which drive it is:

    $ lsblk

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ sudo umount /dev/sdX\*
    # umount /dev/sdX\*

dmesg told you what device it is. Overwrite the drive, writing your
distro ISO to it with dd. For example:

    $ sudo dd if=freebsd.img of=/dev/sdX bs=8M; sync
    # dd if=freebsd.img of=/dev/sdX bs=8M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Installing FreeBSD without full disk encryption
-----------------------------------------------

Press C in GRUB to access the command line:

    grub> kfreebsd (usb0,gpt3)/boot/kernel/kernel
    grub> set FreeBSD.vfs.mountfrom=ufs:/dev/da1p3\
    grub> boot

It will start booting into the FreeBSD installer. Follow the normal
process for installing FreeBSD.

Installing FreeBSD with full disk encryption
--------------------------------------------

TODO

Booting
-------

TODO

Configuring Grub
----------------

TODO

Troubleshooting
===============

Most of these issues occur when using libreboot with coreboot's 'text
mode' instead of the coreboot framebuffer. This mode is useful for
booting payloads like memtest86+ which expect text-mode, but for FreeBSD
it can be problematic when they are trying to switch to a framebuffer
because it doesn't exist.

In most cases, you should use the vesafb ROM images. Example filename:
libreboot\_ukdvorak\_vesafb.rom.

won't boot\...something about file not found
---------------------------------------------

Your device names (i.e. usb0, usb1, sd0, sd1, wd0, ahci0, hd0, etc) and
numbers may differ. Use TAB completion.

Copyright © 2016 Leah Rowe <info@minifree.org>\
Copyright © 2016 Scott Bonds <scott@ggr.com>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: BSD projects
...

This section relates to dealing with BSD projects: preparing bootable
USB drives, changing the default GRUB menu and so on.

**This section is only for the \*GRUB\* payload. For depthcharge,
instructions have yet to be written.**

-   [How to install NetBSD on a libreboot system](netbsd.md)
-   [How to install LibertyBSD or OpenBSD on a libreboot
    system](openbsd.md)

-   [How to install FreeBSD on a libreboot system](freebsd.md)

Copyright © 2016 Scott Bonds <scott@ggr.com>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: How to install NetBSD on a libreboot system
...

This section relates to preparing, booting and installing NetBSD on your
libreboot system, using nothing more than a USB flash drive (and *dd*).
They've only been tested on a librebooted ThinkPad X60.

It is expected that you use text mode in libreboot (txtmode images), for
the early boot process in NetBSD. **Suspend/hibernate is broken,
according to at least 1 user.**

Thanks go to ioxcide in [this Reddit
post](https://www.reddit.com/r/BSD/comments/53jt70/libreboot_and_bsds/)
for the initial instructions.

-   [Prepare the USB drive (in NetBSD)](#prepare)
-   [Installing NetBSD without full disk encryption](#noencryption)
-   [Installing NetBSD with full disk encryption](#encryption)
-   [Booting](#booting)
-   [Configuring Grub](#configuring_grub)
-   [Troubleshooting](#troubleshooting)

**This section is only for the GRUB payload. For depthcharge (used on
CrOS devices in libreboot), instructions have yet to be written in the
libreboot documentation.**

netbsd.iso is the installation image for NetBSD. Adapt the filename
accordingly, for your version of NetBSD.

Prepare the USB drive (in NetBSD)
---------------------------------

[This
page](https://wiki.netbsd.org/tutorials/how_to_install_netbsd_from_an_usb_memory_stick/)
on the NetBSD website shows how to create a NetBSD bootable USB drive
from within NetBSD itself. You should use the *dd* method documented
there.

Prepare the USB drive (in FreeBSD)
----------------------------------

[This page](https://www.freebsd.org/doc/handbook/bsdinstall-pre.html) on
the FreeBSD website shows how to create a bootable USB drive for
installing FreeBSD. Use the *dd* on that page. You can also use the same
instructions with a NetBSD ISO image.

Prepare the USB drive (in LibertyBSD or NetBSD)
-----------------------------------------------

If you downloaded your ISO on a LibertyBSD or NetBSD system, here is how
to create the bootable NetBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg | tail

Check to confirm which drive it is, for example, if you think its sd3:

    $ disklabel sd3

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ doas umount /dev/sd3i

dmesg told you what device it is. Overwrite the drive, writing the
NetBSD installer to it with dd. For example:

    $ doas netbsd.iso of=/dev/rsdXc bs=1M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Prepare the USB drive (in GNU+Linux)
------------------------------------

If you downloaded your ISO on a GNU+Linux system, here is how to create
the bootable NetBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg
Check lsblk to confirm which drive it is:

    $ lsblk

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ sudo umount /dev/sdX\*
    # umount /dev/sdX\*

dmesg told you what device it is. Overwrite the drive, writing your
distro ISO to it with dd. For example:

    $ sudo dd if=install60.fs of=/dev/sdX bs=8M; sync
    # dd if=netbsd.iso of=/dev/sdX bs=8M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Installing NetBSD without full disk encryption
----------------------------------------------

You might have to use an external USB keyboard during the installation.
Press C to access the GRUB terminal.

    grub> knetbsd -r sd0a (usb0,netbsd1)/netbsd
    grub> boot

It will start booting into the NetBSD installer. Follow the normal
process for installing NetBSD.

Installing NetBSD with full disk encryption
-------------------------------------------

TODO

Booting
-------

Press C in GRUB to access the command line:

    grub> knetbsd -r wd0a (ahci0,netbsd1)/netbsd
    grub> boot

NetBSD will start booting. Yay!

Configuring Grub
----------------

If you don't want to drop to the GRUB command line and type in a
command to boot NetBSD every time, you can create a GRUB configuration
that's aware of your NetBSD installation and that will automatically be
used by libreboot.

On your NetBSD root partition, create the **/grub** directory and add
the file **libreboot\_grub.cfg** to it. Inside the
**libreboot\_grub.cfg** add these lines:

**default=0 timeout=3 menuentry "NetBSD" {\
    knetbsd -r wd0a (ahci0,netbsd1)/netbsd\
}\
**

The next time you boot, you'll see the old Grub menu for a few seconds,
then you'll see the a new menu with only NetBSD on the list. After 3
seconds NetBSD will boot, or you can hit enter to boot.

Troubleshooting
===============

Most of these issues occur when using libreboot with coreboot's 'text
mode' instead of the coreboot framebuffer. This mode is useful for
booting payloads like memtest86+ which expect text-mode, but for NetBSD
it can be problematic when they are trying to switch to a framebuffer
because it doesn't exist.

In most cases, you should use the vesafb ROM images. Example filename:
libreboot\_ukdvorak\_vesafb.rom.

won't boot\...something about file not found
---------------------------------------------

Your device names (i.e. usb0, usb1, sd0, sd1, wd0, ahci0, hd0, etc) and
numbers may differ. Use TAB completion.

Copyright © 2016 Leah Rowe <info@minifree.org>\
Copyright © 2016 Scott Bonds <scott@ggr.com>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)


code:
---
title: How to install LibertyBSD or OpenBSD on a libreboot system
...

NOTE: This guide was written for OpenBSD by the person who contributed
it, but the libreboot project recommends LibertyBSD. LibertyBSD is a
version of OpenBSD without proprietary software in the repositories
(OpenBSD distributes firmware blobs for devices inside its kernel). Go
to the [LibertyBSD website](http://libertybsd.net/) -- TODO: test on
LibertyBSD and prioritise that in this guide.

This section relates to preparing, booting and installing OpenBSD on
your libreboot system, using nothing more than a USB flash drive (and
*dd*). They've only been tested on a Lenovo ThinkPad x200.

-   [Prepare the USB drive (in OpenBSD)](#prepare)
-   [Installing OpenBSD without full disk encryption](#noencryption)
-   [Installing OpenBSD with full disk encryption](#encryption)
-   [Booting](#booting)
-   [Configuring Grub](#configuring_grub)
-   [Troubleshooting](#troubleshooting)

**This section is only for the GRUB payload. For depthcharge (used on
CrOS devices in libreboot), instructions have yet to be written in the
libreboot documentation.**

install60.fs is the installation image for OpenBSD 6.0. Adapt the
filename accordingly, for a different OpenBSD version or LibertyBSD.

Prepare the USB drive (in LibertyBSD or OpenBSD)
------------------------------------------------

If you downloaded your ISO on a LibertyBSD or OpenBSD system, here is
how to create the bootable LibertyBSD/OpenBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg | tail

Check to confirm which drive it is, for example, if you think its sd3:

    $ disklabel sd3

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ doas umount /dev/sd3i

dmesg told you what device it is. Overwrite the drive, writing the
OpenBSD installer to it with dd. For example:

    $ doas dd if=install60.fs of=/dev/rsdXc bs=1M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Prepare the USB drive (in NetBSD)
---------------------------------

[This
page](https://wiki.netbsd.org/tutorials/how_to_install_netbsd_from_an_usb_memory_stick/)
on the NetBSD website shows how to create a NetBSD bootable USB drive
from within NetBSD itself. You should use the *dd* method documented
there. This will also work with the OpenBSD image.

Prepare the USB drive (in FreeBSD)
----------------------------------

[This page](https://www.freebsd.org/doc/handbook/bsdinstall-pre.md) on
the FreeBSD website shows how to create a bootable USB drive for
installing FreeBSD. Use the *dd* on that page. You can also use the same
instructions with a OpenBSD ISO image.

Prepare the USB drive (in GNU+Linux)
------------------------------------

If you downloaded your ISO on a GNU+Linux system, here is how to create
the bootable OpenBSD USB drive:

Connect the USB drive. Check dmesg:

    $ dmesg
Check lsblk to confirm which drive it is:

    $ lsblk

Check that it wasn't automatically mounted. If it was, unmount it. For
example:

    $ sudo umount /dev/sdX\*
    # umount /dev/sdX\*

dmesg told you what device it is. Overwrite the drive, writing your
distro ISO to it with dd. For example:

    $ sudo dd if=install60.fs of=/dev/sdX bs=8M; sync
    # dd if=install60.fs of=/dev/sdX bs=8M; sync

You should now be able to boot the installer from your USB drive.
Continue reading, for information about how to do that.

Installing OpenBSD without full disk encryption
-----------------------------------------------

Press C in GRUB to access the command line:

    grub> kopenbsd (usb0,openbsd1)/6.0/amd64/bsd.rd
    grub> boot

It will start booting into the OpenBSD installer. Follow the normal
process for installing OpenBSD.

Installing OpenBSD with full disk encryption
--------------------------------------------

Not working. You can modify the above procedure (installation w/o
encryption) to install OpenBSD using full disk encryption, and it
appears to work, except that its not yet clear how to actually *boot* an
OpenBSD+FDE installation using libreboot+Grub2. If you get it working,
please let us know.

If booting in text mode (framebuffer mode might also work), it might be
possible to chainload the OpenBSD or LibertyBSD bootloader from the MBR
section on the internal storage device. This way, it would be possible
to boot with an encrypted OpenBSD or LibertyBSD installation. Please let
us know (contact details are on the libreboot homepage) if you get it
working this way.

Alternatively, it would be good to port OpenBSD either natively as a
coreboot payload, or port it to libpayload (payload library in coreboot;
it has a basic C library and a few functions for certain operations e.g.
text/bitmap). **This would be ideal, because then it would be possible
to boot a truly fully encrypted OpenBSD or LibertyBSD installation, by
putting everything in the flash chip.**

Alternatively, modifying GRUB to support booting fully encrypted OpenBSD
installations would be possible, but probably not feasible; it's an
alien codebase to the OpenBSD project, not tightly integrated and the
OpenBSD bootloader already works.

Booting
-------

Press C in GRUB to access the command line:

    grub> kopenbsd -r sd0a (ahci0,openbsd1)/bsd
    grub> boot

OpenBSD will start booting. Yay!

Configuring Grub
----------------

If you don't want to drop to the GRUB command line and type in a
command to boot OpenBSD every time, you can create a GRUB configuration
that's aware of your OpenBSD installation and that will automatically
be used by libreboot.

On your OpenBSD root partition, create the **/grub** directory and add
the file **libreboot\_grub.cfg** to it. Inside the
**libreboot\_grub.cfg** add these lines:

**default=0 timeout=3 menuentry "OpenBSD" {\
    kopenbsd -r sd0a (ahci0,openbsd1)/bsd\
}\
**

The next time you boot, you'll see the old Grub menu for a few seconds,
then you'll see the a new menu with only OpenBSD on the list. After 3
seconds OpenBSD will boot, or you can hit enter to boot.

Troubleshooting
===============

Most of these issues occur when using libreboot with coreboot's 'text
mode' instead of the coreboot framebuffer. This mode is useful for
booting payloads like memtest86+ which expect text-mode, but for OpenBSD
it can be problematic when they are trying to switch to a framebuffer
because it doesn't exist.

In most cases, you should use the vesafb ROM images. Example filename:
libreboot\_ukdvorak\_vesafb.rom.

won't boot\...something about file not found
---------------------------------------------

Your device names (i.e. usb0, usb1, sd0, sd1, wd0, ahci0, hd0, etc) and
numbers may differ. Use TAB completion.

Copyright © 2016 Scott Bonds <scott@ggr.com>\
Copyright © 2016 Leah Rowe <info@minifree.org>\
This page is available under the [CC BY SA 4.0](../cc-by-sa-4.0.txt)