{"id":1557,"date":"2019-04-22T12:54:17","date_gmt":"2019-04-22T10:54:17","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=1557"},"modified":"2019-04-22T13:29:24","modified_gmt":"2019-04-22T11:29:24","slug":"jak-stworzyc-chroot-raspbiana-arm-na-debianie-x86_64","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2019\/04\/22\/jak-stworzyc-chroot-raspbiana-arm-na-debianie-x86_64\/","title":{"rendered":"Jak stworzy\u0107 chroot Raspbian (ARM) na Debianie (x86_64)?"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>Raspberry Pi jest wspania\u0142ym mikrokomputerem. Niez\u0142e parametry sprz\u0119towe, niska cena, a przede wszystkim &#8211; wspania\u0142a spo\u0142eczno\u015b\u0107 kt\u00f3ra zawsze pomo\u017ce rozwi\u0105za\u0107 problemy. Tworzenie oprogramowania na ten mikrokomputer tak\u017ce jest przyjemne, gdy\u017c jest tam zwyk\u0142y Linux (Raspbian &#8211; modyfikacja Debiana). Wi\u0119c ka\u017cdy program dzia\u0142aj\u0105cy i kompiluj\u0105cy si\u0119 na pecetowym Debianie skompiluje si\u0119 i b\u0119dzie dzia\u0142a\u0142 &#8211; lepiej lub gorzej &#8211; na Raspberry Pi. <\/p>\n\n\n\n<p>Praca na oryginalnym sprz\u0119cie przy opracowywaniu oprogramowania jest najwygodniejsza, ale nie zawsze mo\u017cliwa. Czasami trzeba u\u017cy\u0107 pewnej formy emulacji. W dzisiejszym wpisie poruszymy temat stworzenia \u015brodowiska chroot (architektura ARM, Raspbian) na PC (architektura x86\/AMD64, Debian). Jaki mo\u017ce by\u0107 cel takiego rozwi\u0105zania? \u0141atwa i szybka cross-kompilacja oprogramowania na Raspberry PI. (Nie oszukujmy si\u0119 &#8211; RPI nie nale\u017cy do demon\u00f3w szybko\u015bci). Innym zadaniem takiego \u015brodowiska mo\u017ce by\u0107 testowanie oprogramowania (o ile nie wymaga ono np.: dost\u0119pu do pin\u00f3w GPIO).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalacja niezb\u0119dnego oprogramowania i pobranie systemu<\/h2>\n\n\n\n<p>Pierwszym krokiem, kt\u00f3ry musimy wykona\u0107, jest instalacja niezb\u0119dnego oprogramowania. Potrzebne nam b\u0119d\u0105 dwa pakiety:<\/p>\n\n\n\n<ul><li><strong>debootstrap &#8211;<\/strong> pozwala na pobranie obrazu systemu i zainicjowanie obrazu<\/li><li><strong>qemu-user-static<\/strong> &#8211; ma\u0142y pliczek, dzi\u0119ki kt\u00f3remu mo\u017cemy wykona\u0107 chroot do \u015brodowiska stworzonego dla innej architektury<\/li><\/ul>\n\n\n\n<p>Wydajemy polecenia:<\/p>\n\n\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"kw2\">sudo<\/span> <span class=\"kw2\">apt-get install<\/span> debootstrap qemu-user-static<br \/>\n<span class=\"re2\">CHROOT<\/span>=<span class=\"sy0\">\/<\/span>path<span class=\"sy0\">\/<\/span>to<span class=\"sy0\">\/<\/span><span class=\"kw2\">chroot<\/span><br \/>\ndebootstrap <span class=\"re5\">--no-check-gpg<\/span> <span class=\"re5\">--foreign<\/span> <span class=\"re5\">--arch<\/span>=armhf stretch <span class=\"re1\">$CHROOT<\/span> http:<span class=\"sy0\">\/\/<\/span>archive.raspbian.org<span class=\"sy0\">\/<\/span>raspbian<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Kilka linijek mo\u017ce wprowadza\u0107 w pewne zak\u0142opotanie. Om\u00f3wmy je po kolei.<\/p>\n\n\n\n<p class=\"example_code\">Pierwsza linijka powy\u017cszego skryptu to po prostu instalacja odpowiednich pakiet\u00f3w. M\u00f3wili\u015bmy o tym nieco wy\u017cej, zanim pokaza\u0142em listing. Druga linijka to stworzenie zmiennej \u015brodowiskowej CHROOT. Zamiast <em>\/path\/to\/chroot<\/em> podstawiasz \u015bcie\u017ck\u0119 w kt\u00f3rej chcesz zainstalowa\u0107 &#8222;chrootowany&#8221; system operacyjny. Np.: <em>\/home\/karol\/rpi_chroot<\/em>.<\/p>\n\n\n\n<p>Najwi\u0119cej roboty odwala za nas linijka trzecia. Uruchamiamy debootstrap z ca\u0142\u0105 chmar\u0105 parametr\u00f3w. Co one oznaczaj\u0105? <\/p>\n\n\n\n<ul class=\"example_code\"><li><strong>&#8211;no-check-gpg &#8211; <\/strong>wy\u0142\u0105cza sprawdzanie sygnatur gpg otrzymanych plik\u00f3w. Mo\u017cesz pomin\u0105\u0107 ten parametr aczkolwiek istnieje mo\u017cliwo\u015b\u0107 pojawienia si\u0119 kilku ostrze\u017ce\u0144<\/li><li><strong>&#8211;foreign<\/strong> &#8211; parametr wymagany wtedy, kiedy wykonujemy debootstrapa innej architektury ni\u017c ta na kt\u00f3rej pracujemy. Foreign zapobiega wykonaniu tych cz\u0119\u015bci skryptu debootstrap, kt\u00f3re wymagaj\u0105 wykonania chroota do wn\u0119trza instalowanego systemu. (P\u00f3ki nie przekopiujemy <em>qemu-arm-static<\/em> do wn\u0119trza tworzonego \u015brodowiska, nie b\u0119dzie to mo\u017cliwe)<\/li><li><strong>&#8211;arch=armhf &#8211; <\/strong>architektura, kt\u00f3rej pliki chcemy \u015bci\u0105gn\u0105\u0107 i rozpakowa\u0107<\/li><li><strong>stretch<\/strong> &#8211; wersja systemu operacyjnego, kt\u00f3r\u0105 chcemy \u015bci\u0105gn\u0105\u0107. W przypadku Raspbiana mo\u017cemy wybiera\u0107 spo\u015br\u00f3d tych samych wersji w kt\u00f3rych wydawany jest system Debian. (aktualnie: jessie, stretch, buster, sid)<\/li><li><strong>$CHROOT <\/strong>&#8211; wykorzystujemy wcze\u015bniej stworzon\u0105 zmienn\u0105 \u015brodowiskow\u0105 aby wskaza\u0107 programowi debootstrap gdzie oczekujemy instalacji naszego \u015brodowiska<\/li><li><strong>http:\/\/archive.raspbian.org\/raspbian<\/strong> &#8211; adres internetowy spod kt\u00f3rego zostan\u0105 \u015bci\u0105gni\u0119te pakiety buduj\u0105ce nasz OS<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Kopiowanie plik\u00f3w qemu<\/h2>\n\n\n\n<p>Nie mo\u017cemy w tej chwili wykona\u0107 chroota do wn\u0119trza \u015bwie\u017cutkiego systemu. Powita nas nast\u0119puj\u0105cy b\u0142\u0105d:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"212\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/04\/image-2.png\" alt=\"\" class=\"wp-image-1563\"\/><\/figure><\/div>\n\n\n\n<p class=\"example_code\">Aby rozwi\u0105za\u0107 ten problem, musimy skopiowa\u0107 plik <em>qemu_arm_static<\/em> na odpowiednie miejsce.<\/p>\n\n\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><div class=\"bash codecolorer\"><span class=\"kw2\">sudo<\/span> <span class=\"kw2\">cp<\/span> <span class=\"sy0\">\/<\/span>usr<span class=\"sy0\">\/<\/span>bin<span class=\"sy0\">\/<\/span>qemu-arm-static <span class=\"re1\">$CHROOT<\/span><span class=\"sy0\">\/<\/span>usr<span class=\"sy0\">\/<\/span>bin<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Uko\u0144czenie instalacji debootstrap<\/h2>\n\n\n\n<p>Instalacja i konfiguracja pakiet\u00f3w debootstrap mo\u017ce zosta\u0107 w tym momencie uko\u0144czona. Nie b\u00f3jmy si\u0119 i wydajmy odpowiednie polecenie: <\/p>\n\n\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><div class=\"bash codecolorer\"><span class=\"kw2\">sudo<\/span> <span class=\"kw2\">chroot<\/span> <span class=\"re1\">$CHROOT<\/span> <span class=\"sy0\">\/<\/span>debootstrap<span class=\"sy0\">\/<\/span>debootstrap <span class=\"re5\">--second-stage<\/span><\/div><\/div>\n\n\n\n<p>Powy\u017csza komenda ko\u0144czy konfiguracj\u0119 systemu znajduj\u0105cego si\u0119 w chroocie, dzi\u0119ki czemu b\u0119dzie zachowywa\u0142 si\u0119 prawie jak prawdziwy. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konfiguracja prawid\u0142owych repozytori\u00f3w<\/h2>\n\n\n\n<p class=\"example_code\">Ostatni\u0105 rzecz\u0105 kt\u00f3r\u0105 musimy zrobi\u0107 jest aktualizacja pliku <em>\/etc\/apt\/sources.list <\/em>w chrootowanym \u015brodowisku. Gdyby\u015bmy tego nie zrobili, nie otrzymaliby\u015bmy prawdziwego raspbiana. Debootstrap domy\u015blnie konfiguruje repozytoria tak, aby pakiety by\u0142y zaci\u0105gane z serwer\u00f3w oryginalnego Debiana. Nie jest to prawid\u0142owe zachowanie w naszym przypadku i musimy je naprawi\u0107. <\/p>\n\n\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/><\/div><\/td><td><div class=\"bash codecolorer\">&nbsp;<span class=\"kw2\">cat<\/span> <span class=\"sy0\">&gt;<\/span> <span class=\"re1\">$CHROOT<\/span><span class=\"sy0\">\/<\/span>etc<span class=\"sy0\">\/<\/span>apt<span class=\"sy0\">\/<\/span>sources.list <span class=\"co2\">&lt;&lt; EOF<br \/>\ndeb http:\/\/mirrordirector.raspbian.org\/raspbian\/ stretch main contrib non-free rpi<br \/>\ndeb http:\/\/archive.raspberrypi.org\/debian\/ stretch main<br \/>\nEOF<\/span><br \/>\n<span class=\"kw2\">chroot<\/span> <span class=\"re1\">$CHROOT<\/span> <span class=\"kw2\">apt-get install<\/span> dirmngr<br \/>\n<span class=\"kw2\">chroot<\/span> <span class=\"re1\">$CHROOT<\/span> \\<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">apt-key adv<\/span> <span class=\"re5\">--keyserver<\/span> keyserver.ubuntu.com <span class=\"re5\">--recv<\/span> 82B129927FA3303E<br \/>\n<span class=\"kw2\">chroot<\/span> <span class=\"re1\">$CHROOT<\/span> <span class=\"kw2\">apt-get update<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n<p>Powy\u017cszy skrypt<\/p>\n\n\n\n<ul><li>Wyczy\u015bci plik <strong><em>sources.list<\/em><\/strong> i wgra do niego prawid\u0142owe repozytoria [1-4]<\/li><li>Instaluje paczk\u0119 dirmngr, kt\u00f3ra jest niezb\u0119dna do zarz\u0105dzania prawid\u0142owego wykonania kolejnej komendy<\/li><li>Zaloguje si\u0119 do wn\u0119trza chrootowanego systemu i doda odpowiednie klucze do apt<\/li><li>Wejdzie do chrootowanego systemu i zaktualizuje list\u0119 pakiet\u00f3w<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Jak wej\u015b\u0107 do \u015brodowiska za pomoc\u0105 chroot?<\/h2>\n\n\n\n<p>Uko\u0144czyli\u015bmy ju\u017c konfiguracj\u0119. Wej\u015bcie do takiego \u015brodowiska jest banalne \ud83d\ude42 <\/p>\n\n\n<div class=\"codecolorer-container bash default\" style=\"overflow:auto;white-space:nowrap;width:90%;\"><div class=\"bash codecolorer\"><span class=\"kw2\">sudo<\/span> <span class=\"kw2\">chroot<\/span> <span class=\"re1\">$CHROOT<\/span><\/div><\/div>\n\n\n\n<p class=\"example_code\">Gdzie <em>$CHROOT<\/em> to wcze\u015bniej utworzona zmienna \u015brodowiskowa. Mo\u017cesz robi\u0107 w tym zamkni\u0119tym za pomoc\u0105 chroota &#8222;kontenerze&#8221; absolutnie wszystko, co ci przyjdzie do g\u0142owy \ud83d\ude42 Nie b\u00f3j si\u0119, na pewno nie zaszkodzisz tym samym swojemu PC-towi, gdy\u017c nie ma takiej mo\u017cliwo\u015bci.  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Voila! W\u0142a\u015bnie skonfigurowali\u015bmy system, kt\u00f3ry jest prawie identyczny z tym kt\u00f3ry instalujemy na Raspberry PI. Zachowuje si\u0119 on prawie tak samo. Oczywi\u015bcie, nie poddamy emulacji &#8222;typowo sprz\u0119towych&#8221; cech, takich jak piny GPIO. Jednak\u017ce z powodzeniem mo\u017cemy u\u017cy\u0107 takiego obrazu np.: do skompilowania oprogramowania kt\u00f3re jest dost\u0119pne tylko w formie \u017ar\u00f3de\u0142. Binarka przeniesiona ze \u015brodowiska chroot kt\u00f3re w\u0142a\u015bnie stworzyli\u015bmy uruchomi si\u0119 bez problemu na Raspberry PI. <\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">2<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> Raspberry Pi jest wspania\u0142ym mikrokomputerem. Niez\u0142e parametry sprz\u0119towe, niska cena, a przede wszystkim &#8211; wspania\u0142a spo\u0142eczno\u015b\u0107 kt\u00f3ra zawsze pomo\u017ce rozwi\u0105za\u0107 problemy. Tworzenie oprogramowania na ten mikrokomputer tak\u017ce jest przyjemne, gdy\u017c &#8230;<\/p>\n","protected":false},"author":1,"featured_media":1577,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[29],"tags":[],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1557"}],"collection":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1557"}],"version-history":[{"count":21,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1557\/revisions"}],"predecessor-version":[{"id":1582,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1557\/revisions\/1582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media\/1577"}],"wp:attachment":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}