1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
|
---
title: Capítulo 3. Fundamentos do FreeBSD
part: Parte I. Primeiros Passos
prev: books/handbook/bsdinstall
next: books/handbook/ports
showBookMenu: true
weight: 5
params:
path: "/books/handbook/basics/"
---
[[basics]]
= Fundamentos do FreeBSD
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 3
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/basics/
ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]
ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
[[basics-synopsis]]
== Sinopse
Este capítulo cobre os comandos básicos e as funcionalidades do sistema operacional FreeBSD. Grande parte deste material é relevante para qualquer sistema operacional do tipo UNIX(TM). Novos usuários do FreeBSD são encorajados a ler este capítulo cuidadosamente.
Depois de ler este capítulo, você saberá:
* Como usar e configurar consoles virtuais.
* Como criar e gerenciar usuários e grupos no FreeBSD.
* Como funcionam as permissões de arquivo UNIX(TM) e as flags de arquivos do FreeBSD.
* O layout padrão do sistema de arquivos do FreeBSD.
* A organização do disco no FreeBSD.
* Como montar e desmontar sistemas de arquivos.
* O que são processos, daemons e sinais.
* O que é um shell e como alterar o ambiente de login padrão.
* Como usar editores de texto básicos.
* O que são devices e device nodes.
* Como ler páginas de manual para obter maiores informações.
[[consoles]]
== Consoles e Terminais Virtuais
A menos que o FreeBSD tenha sido configurado para iniciar automaticamente um ambiente gráfico durante a inicialização, o sistema inicializará em um prompt de login da linha de comando, como visto neste exemplo:
[source,shell]
....
FreeBSD/amd64 (pc3.example.org) (ttyv0)
login:
....
A primeira linha contém algumas informações sobre o sistema. O `amd64` indica que o sistema neste exemplo está executando uma versão de 64 bits do FreeBSD. O nome do host é `pc3.example.org`, e [.filename]#ttyv0# indica que este é o "console do sistema". A segunda linha é o prompt de login.
Como o FreeBSD é um sistema multiusuário, ele precisa de alguma maneira distinguir entre usuários diferentes. Isso é feito exigindo que todos os usuários façam login no sistema antes de obter acesso aos programas no sistema. Cada usuário tem um "nome de usuário" único e uma "senha" pessoal.
Para efetuar login no console do sistema, digite o nome de usuário que foi configurado durante a instalação do sistema, conforme descrito em crossref:bsdinstall[bsdinstall-addusers,Adicione usuários] e pressione kbd:[Enter]. Em seguida, insira a senha associada ao nome de usuário e pressione kbd:[Enter]. A senha não é _ecoada_ por razões de segurança.
Uma vez que a senha correta é inserida, a mensagem do dia (MOTD) será exibida, seguida de um prompt de comando. Dependendo do shell que foi selecionado quando o usuário foi criado, este prompt será um caractere `#`, `$` ou `%`. O prompt indica que o usuário está logado no console do sistema FreeBSD e pronto para testar os comandos disponíveis.
[[consoles-virtual]]
=== Consoles Virtuais
Enquanto o console do sistema pode ser usado para interagir com o sistema, um usuário trabalhando a partir da linha de comando no teclado de um sistema FreeBSD normalmente irá efetuar login em um console virtual. Isso ocorre porque as mensagens do sistema são configuradas por padrão para serem exibidas no console do sistema. Essas mensagens serão exibidas por cima do comando ou arquivo em que o usuário estiver trabalhando, dificultando a concentração no trabalho em questão.
Por padrão, o FreeBSD é configurado para fornecer vários consoles virtuais para a entrada de comandos. Cada console virtual tem seu próprio prompt de login e shell e é fácil alternar entre os consoles virtuais. Isso essencialmente fornece a linha de comando equivalente a ter várias janelas abertas ao mesmo tempo em um ambiente gráfico.
As combinações de teclas kbd:[Alt+F1] até a kbd:[Alt+F8] foram reservadas pelo FreeBSD para alternar entre os consoles virtuais. Use kbd:[Alt+F1] para alternar para o console do sistema ([.filename]#ttyv0#), kbd:[Alt+F2] para acessar o primeiro console virtual ([.filename]#ttyv1#), kbd:[Alt+F3] para acessar o segundo console virtual ([.filename]#ttyv2#) e assim por diante. Ao usar o Xorg como um console gráfico, a combinação kbd:[Ctrl+Alt+F1] é utilizada para retornar para um console virtual baseado em texto.
Ao mudar de um console para o próximo, o FreeBSD gerencia a saída da tela. O resultado é uma ilusão de ter várias telas virtuais e teclados que podem ser usados para digitar comandos para o FreeBSD rodar. Os programas executados em um console virtual não param de ser executados quando o usuário alterna para um console virtual diferente.
Consulte man:kbdcontrol[1], man:vidcontrol[1], man:atkbd:[4], man:syscons[4], e man:vt[4] para uma descrição mais técnica do console do FreeBSD e seus drivers de teclado.
No FreeBSD, o número de consoles virtuais disponíveis é configurado nesta seção do [.filename]#/etc/ttys#:
[.programlisting]
....
# name getty type status comments
#
ttyv0 "/usr/libexec/getty Pc" xterm on secure
# Virtual terminals
ttyv1 "/usr/libexec/getty Pc" xterm on secure
ttyv2 "/usr/libexec/getty Pc" xterm on secure
ttyv3 "/usr/libexec/getty Pc" xterm on secure
ttyv4 "/usr/libexec/getty Pc" xterm on secure
ttyv5 "/usr/libexec/getty Pc" xterm on secure
ttyv6 "/usr/libexec/getty Pc" xterm on secure
ttyv7 "/usr/libexec/getty Pc" xterm on secure
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
....
Para desativar um console virtual, coloque um símbolo de comentário (`#`) no início da linha que representa esse console virtual. Por exemplo, para reduzir o número de consoles virtuais disponíveis de oito para quatro, coloque um `#` na frente das últimas quatro linhas que representam os consoles virtuais de [.filename]#ttyv5# até [.filename]#ttyv8#. _Não_ comente a linha do console do sistema [.filename]#ttyv0#. Note que o último console virtual ([.filename]#ttyv8#) é usado para acessar o ambiente gráfico se o Xorg tiver sido instalado e configurado conforme descrito em crossref:x11[x11, O sistema X Window].
Para uma descrição detalhada de cada coluna neste arquivo e as opções disponíveis para os consoles virtuais, consulte man:ttys[5].
[[consoles-singleuser]]
=== Modo "Single User"
O menu de inicialização do FreeBSD fornece uma opção chamada "Boot Single User". Se esta opção for selecionada, o sistema inicializará em um modo especial conhecido como "single user mode". Esse modo é normalmente usado para reparar um sistema que não inicializa ou para redefinir a senha de `root` quando ela é desconhecida. Quando em modo single user, a rede e outros consoles virtuais não estão disponíveis. No entanto, haverá acesso completo de `root` ao sistema e, por padrão, a senha de `root` não é necessária. Por estas razões, o acesso físico ao teclado é necessário para iniciar neste modo e determinar quem tem acesso físico ao teclado é algo a considerar ao proteger um sistema FreeBSD.
As configurações que controlam o modo de single user são encontradas nesta seção do [.filename]#/etc/ttys#:
[.programlisting]
....
# name getty type status comments
#
# If console is marked "insecure", then init will ask for the root password
# when going to single-user mode.
console none unknown off secure
....
Por padrão, o status é definido como `secure`. Isso pressupõe que quem tem acesso físico ao teclado não é importante ou é controlado por uma política de segurança física. Se essa configuração for alterada para `insecure`, a suposição é que o ambiente em si é inseguro porque qualquer pessoa pode acessar o teclado. Quando esta linha é alterada para `insecure`, o FreeBSD irá solicitar a senha do `root` quando um usuário selecionar inicializar no modo single user.
[NOTE]
====
__Tenha cuidado ao alterar esta configuração para ``inseguro``__! Se a senha do `root` for esquecida, a inicialização no modo single user ainda é possível, mas pode ser difícil para alguém que não esteja familiarizado com o processo de inicialização do FreeBSD.
====
[[consoles-vidcontrol]]
=== Alterar os modos de vídeo do console
O modo de vídeo padrão do console do FreeBSD pode ser ajustado para 1024x768, 1280x1024 ou qualquer outro tamanho suportado pelo chip gráfico e monitor. Para usar um modo de vídeo diferente, carregue o módulo `VESA`:
[source,shell]
....
# kldload vesa
....
Para determinar quais modos de vídeo são suportados pelo hardware, use man:vidcontrol[1]. Para obter uma lista de modos de vídeo suportados, execute o seguinte:
[source,shell]
....
# vidcontrol -i mode
....
A saída deste comando lista os modos de vídeo suportados pelo hardware. Para selecionar um novo modo de vídeo, especifique o modo usando man:vidcontrol[1] como o usuário `root` :
[source,shell]
....
# vidcontrol MODE_279
....
Se o novo modo de vídeo for aceitável, ele pode ser definido permanentemente na inicialização, adicionando-o ao [.filename]#/etc/rc.conf#:
[.programlisting]
....
allscreens_flags="MODE_279"
....
[[users-synopsis]]
== Usuários e Gerenciamento Básico de Contas
O FreeBSD permite que múltiplos usuários usem o computador ao mesmo tempo. Enquanto apenas um usuário pode se sentar em frente à tela e usar o teclado a qualquer momento, qualquer número de usuários pode efetuar o login no sistema através da rede. Para usar o sistema, cada usuário deve ter sua própria conta de usuário.
Este capítulo descreve:
* Os diferentes tipos de contas de usuários em um sistema FreeBSD.
* Como adicionar, remover e modificar contas de usuários.
* Como definir limites para controlar os recursos que usuários e grupos podem acessar.
* Como criar grupos e adicionar usuários como membros de um grupo.
[[users-introduction]]
=== Tipos de conta
Como todo acesso ao sistema FreeBSD é obtido usando contas e todos os processos são executados por usuários, o gerenciamento de usuários e contas é importante.
Existem três tipos principais de contas: contas do sistema, contas de usuário e a conta de superusuário.
[[users-system]]
==== Contas do sistema
As contas do sistema são usadas para executar serviços como DNS, correio e servidores web. A razão para isso é a segurança; se todos os serviços fossem executados como superusuário, eles poderiam agir sem restrições.
Exemplos de contas do sistema são `daemon`, `operador`, `bind`, `news`, e `www`.
[WARNING]
====
É necessário ter cuidado ao usar o grupo operator, pois privilégios de acesso como o de superusuário podem ser concedidos, incluindo e não limitado a, desligamento, reinicialização e acesso a todos os itens em [.filename]#/dev# para o grupo.
====
A `nobody` é uma conta genérica sem privilégios do sistema. No entanto, quanto mais serviços usarem `nobody`, a mais arquivos e processos esse usuário será associado e, portanto, mais privilegiado esse usuário se tornará.
[[users-user]]
==== Contas de usuário
As contas de usuários são atribuídas a pessoas reais e são usadas para efetuar login e usar o sistema. Todas as pessoas que acessam o sistema devem ter uma conta de usuário exclusiva. Isso permite que o administrador descubra quem está fazendo o que e impede que usuários alterem as configurações de outros usuários.
Cada usuário pode configurar seu próprio ambiente para adequar o sistema ao seu uso, utilizando suas opções padrão para o shell, editor, atalhos de teclado e idioma.
Cada conta de usuário em um sistema FreeBSD tem certas informações associadas:
Nome de usuário::
O nome do usuário é digitado no prompt `login:`. Cada usuário deve ter um nome de usuário exclusivo. Existem diversas regras para criar nomes de usuário válidos que estão documentadas em man:passwd[5]. Recomenda-se usar nomes de usuário que tenham oito ou menos caracteres, todos os caracteres devem ser minúsculos para manter a compatibilidade com aplicativos legados.
Senha::
Cada conta tem uma senha associada.
ID do usuário (UID)::
O ID do Usuário (UID) é um número usado para identificar unicamente o usuário no sistema FreeBSD. Comandos que permitem que um nome de usuário seja especificado o converterão para o UID. Recomenda-se usar um UID menor que 65535, já que valores mais altos podem causar problemas de compatibilidade com alguns softwares.
ID do grupo (GID)::
O ID do grupo (GID) é um número usado para identificar unicamente o grupo principal ao qual o usuário pertence. Os grupos são um mecanismo para controlar o acesso a recursos com base no GID de um usuário, em vez de no seu UID. Isso pode reduzir significativamente o tamanho de alguns arquivos de configuração e permite que os usuários sejam membros de mais de um grupo. Recomenda-se usar um GID de 65535 ou inferior, pois GIDs mais altos podem não funcionar com alguns softwares.
Classe de login::
As classes de login são uma extensão do mecanismo de grupo que fornece flexibilidade adicional ao configurar o sistema para diferentes usuários. As classes de login são discutidas em crossref:security[users-limiting,Configurando Classes de Login].
Tempo para mudança de senha::
Por padrão as senhas não expiram. No entanto, a expiração de senha pode ser ativada por usuário, forçando alguns ou todos os usuários a alterar suas senhas após um determinado período de tempo.
Tempo de expiração da conta::
Por padrão o FreeBSD não expira contas. Ao criar contas que precisam de uma vida útil limitada, como contas de alunos em uma escola, especifique a data de expiração da conta usando o man:pw[8]. Após o tempo de expiração, a conta não poderá ser usada para efetuar login no sistema, embora os diretórios e arquivos da conta permaneçam no servidor.
Nome completo do usuário::
O nome de usuário identifica a conta de forma única para o FreeBSD, mas não reflete necessariamente o nome real do usuário. Semelhante a um comentário, essas informações podem conter espaços, caracteres maiúsculos e ter mais de oito caracteres.
Diretório Inicial (home)::
O diretório "home" é um caminho completo para um diretório no sistema. Este é o diretório inicial do usuário quando o usuário faz o login. Uma convenção comum é colocar todos os diretórios home dos usuários em [.filename]#/home/username# ou [.filename]#/usr/home/username#. Cada usuário armazena seus arquivos e subdiretórios pessoais em seu próprio diretório home.
Shell do usuário::
O shell fornece o ambiente padrão do usuário para interagir com o sistema. Existem muitos tipos diferentes de shells e usuários experientes terão suas próprias preferências, que podem ser refletidas nas suas configurações da conta.
[[users-superuser]]
==== A conta de superusuário
A conta de superusuário, geralmente chamada de `root`, é usada para gerenciar o sistema sem limitações de privilégios. Por este motivo, não deve ser usado para tarefas do dia-a-dia, como enviar e receber e-mail, exploração geral do sistema ou programação.
O superusuário, ao contrário de outras contas de usuário, pode operar sem limites, e o uso indevido da conta de superusuário pode resultar em desastres espetaculares. As contas de usuário não podem destruir o sistema operacional por engano, por isso é recomendável fazer o login como uma conta de usuário e se tornar o superusuário somente quando um comando exigir privilégios extras.
Sempre cheque duas ou três vezes todos os comandos emitidos como superusuário, pois um espaço extra ou um caractere ausente pode causar uma perda de dados irreparável.
Existem várias maneiras de obter privilégios de superusuário. Embora seja possível efetuar login como `root`, isso é altamente desencorajado.
Em vez disso, use man:su[1] para se tornar o superusuário. Se `-` for especificado ao executar este comando, o usuário também herdará o ambiente do usuário root. O usuário que executa este comando deve estar no grupo `wheel` ou o comando falhará. O usuário também deve saber a senha da conta de usuário `root`.
Neste exemplo, o usuário só se torna superusuário para executar `make install`, pois isso requer privilégios de superusuário. Quando o comando é concluído, o usuário digita `exit` para deixar a conta de superusuário e retornar à sua conta de usuário.
.Instalar um programa como superusuário
[example]
====
[source,shell]
....
% configure
% make
% su -
Password:
# make install
# exit
%
....
====
O framework integrado man:su[1] funciona bem para sistemas isolados ou redes pequenas com apenas um administrador. Uma alternativa é instalar o pacote ou port package:security/sudo[]. Este software fornece registro de atividades e permite ao administrador configurar quais usuários podem executar quais comandos como superusuário.
[[users-modifying]]
=== Gerenciando Contas
O FreeBSD fornece uma variedade de diferentes comandos para gerenciar contas de usuários. Os comandos mais comuns são descritos em <<users-modifying-utilities>>, seguidos por alguns exemplos de seu uso. Veja a página de manual para cada utilitário para maiores detalhes e exemplos de uso.
[[users-modifying-utilities]]
.Utilitários para gerenciar contas de usuários
[cols="1,1", frame="none", options="header"]
|===
| Comando
| Resumo
|man:adduser[8]
|Aplicativo de linha de comando recomendado para adicionar novos usuários.
|man:rmuser[8]
|Aplicativo de linha de comando recomendado para remover usuários.
|man:chpass[1]
|Uma ferramenta flexível para alterar as informações do usuário.
|man:passwd[1]
|Ferramenta de linha de comando para alterar senhas de usuários.
|man:pw[8]
|Uma ferramenta poderosa e flexível para modificar todos os aspectos das contas de usuário.
|===
[[users-adduser]]
==== `adduser`
O programa recomendado para adicionar novos usuários é o man:adduser[8]. Quando um novo usuário é adicionado, este programa atualiza automaticamente o [.filename]#/etc/passwd# e o [.filename]#/etc/group#. Ele também cria um diretório inicial para o novo usuário, copia os arquivos de configuração padrão de [.filename]#/usr/shared/skel# e pode, opcionalmente, enviar uma nova mensagem de boas-vindas ao novo usuário. Este utilitário deve ser executado como o superusuário.
O utilitário man:adduser[8] é interativo e percorre as etapas para criar uma nova conta de usuário. Como visto em <<users-modifying-adduser>>, insira as informações necessárias ou pressione kbd:[Enter] para aceitar o valor padrão mostrado entre colchetes. Neste exemplo, o usuário foi convidado para o grupo `wheel`, permitindo que ele se tornasse o superusuário com o uso do man:su[1]. Quando terminar, o utilitário perguntará se deseja criar outro usuário ou finalizar o comando.
[[users-modifying-adduser]]
.Adicionando um usuário no FreeBSD
[example]
====
[source,shell]
....
# adduser
Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : jru
Password : ****
Full Name : J. Random User
Uid : 1001
Class :
Groups : jru wheel
Home : /home/jru
Shell : /usr/local/bin/zsh
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!
#
....
====
[NOTE]
====
Como a senha não é mostrada quando digitada, tenha cuidado para não digitar a senha incorretamente ao criar a conta do usuário.
====
[[users-rmuser]]
==== `rmuser`
Para remover completamente um usuário do sistema, execute o man:rmuser[8] como o superusuário. Este comando executa as seguintes etapas:
[.procedure]
====
. Remove a entrada man:crontab[1] do usuário, se existir.
. Remove todas as tarefas man:at[1] pertencentes ao usuário.
. Elimina todos os processos pertencentes ao usuário.
. Remove o usuário do arquivo de senhas do sistema.
. Opcionalmente, remove o diretório pessoal do usuário, se ele for de propriedade do usuário.
. Remove os arquivos de mensagens recebidas pertencentes ao usuário de [.filename]#/var/mail#.
. Remove todos os arquivos pertencentes ao usuário das áreas de armazenamento de arquivos temporários, como [.filename]#/tmp#.
. Finalmente, remove o nome de usuário de todos os grupos aos quais ele pertence em [.filename]#/etc/group#. Se um grupo ficar vazio e o nome do grupo for o mesmo que o nome de usuário, o grupo será removido. Isso complementa os grupos exclusivos por usuário criados por man:adduser[8].
====
O man:rmuser[8] não pode ser usado para remover contas de superusuário, pois isso quase sempre ocasiona uma de destruição em massa.
Por padrão, um modo interativo é usado, conforme mostrado no exemplo a seguir.
.Remoção de contas interativas com o `rmuser`
[example]
====
[source,shell]
....
# rmuser jru
Matching password entry:
jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/jru)? y
Removing user (jru): mailspool home passwd.
#
....
====
[[users-chpass]]
==== `chpass`
Qualquer usuário pode usar o man:chpass[1] para alterar seu shell padrão e informações pessoais associadas à sua conta de usuário. O superusuário pode usar esse utilitário para alterar informações adicionais da conta de qualquer usuário.
Quando não há opções, além de um nome de usuário opcional, o man:chpass[1] exibe um editor contendo informações do usuário. Quando o usuário sai do editor, o banco de dados do usuário é atualizado com as novas informações.
[NOTE]
====
Este utilitário solicitará a senha do usuário ao sair do editor, a menos que o utilitário seja executado como superusuário.
====
Em <<users-modifying-chpass-su>>, o superusuário digitou `chpass jru` e agora está visualizando os campos que podem ser alterados para este usuário. Se `jru` executar este comando, apenas os últimos seis campos serão exibidos e estarão disponíveis para edição. Isso é mostrado em <<users-modifying-chpass-ru>>.
[[users-modifying-chpass-su]]
.Usando o `chpass` como superusuário
[example]
====
[source,shell]
....
#Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
....
====
[[users-modifying-chpass-ru]]
.Usando o `chpass` como usuário regular
[example]
====
[source,shell]
....
#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:
....
====
[NOTE]
====
Os comandos man:chfn[1] e man:chsh[1] são links para man:chpass[1], como são man:ypchpass[1], man:ypchfn[1]eman:ypchsh[1]. Já que o suporte ao NIS é automático, colocar o `yp` antes do comando não é necessário. Os procedimentos para configurar o NIS está documentado em crossref:network-servers[network-servers, Servidores de Rede].
====
[[users-passwd]]
==== `passwd`
Qualquer usuário pode alterar facilmente sua senha usando o man:passwd[1]. Para prevenir alterações acidentais ou não autorizadas, este comando irá solicitar a senha atual ao usuário antes de configurar uma nova senha:
.Alterando Sua Senha
[example]
====
[source,shell]
....
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done
....
====
O superusuário pode alterar a senha de qualquer usuário especificando o nome de usuário ao executar o man:passwd[1]. Quando este utilitário é executado como superusuário, ele não solicita a senha atual do usuário. Isso permite que a senha seja alterada quando um usuário não consegue lembrar a senha original.
.Mudando a senha de outro usuário como superusuário
[example]
====
[source,shell]
....
# passwd jru
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done
....
====
[NOTE]
====
Como com o man:chpass[1], o man:yppasswd[1] é um link para man:passwd[1], então o NIS funciona com ambos os comandos.
====
[[users-pw]]
==== `pw`
O utilitário man:pw[8] pode criar, remover, modificar e exibir usuários e grupos. Funciona como um front-end para o usuário do sistema e para os arquivos de grupo. O man:pw[8] tem um conjunto muito poderoso de opções de linha de comando que o torna adequado para uso em shell scripts, mas novos usuários podem achar isso mais complicado que os outros comandos apresentados nesta seção.
[[users-groups]]
=== Gerenciando Grupos
Um grupo é uma lista de usuários. Um grupo é identificado pelo nome do grupo e pelo GID. No FreeBSD, o kernel usa o UID de um processo, e a lista de grupos a que pertence, para determinar o que o processo pode fazer. Na maioria das vezes, o GID de um usuário ou processo geralmente significa o primeiro grupo na lista.
O mapeamento do nome do grupo para o GID está listado em [.filename]#/etc/group#. Este é um arquivo de texto simples com quatro campos delimitados por dois pontos. O primeiro campo é o nome do grupo, o segundo é a senha criptografada, o terceiro é o GID e o quarto é a lista de membros delimitados por vírgulas. Para uma descrição mais completa da sintaxe, consulte man:group[5].
O superusuário pode modificar o [.filename]#/etc/group# usando um editor de texto. Alternativamente, o man:pw[8] pode ser usado para adicionar e editar grupos. Por exemplo, para adicionar um grupo chamado `teamtwo` e confirmar se ele existe:
.Adicionando um grupo usando o man:pw[8]
[example]
====
[source,shell]
....
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:
....
====
Neste exemplo, `1100` é o GID de `teamtwo`. No momento, `teamtwo` não possui membros. Este comando adicionará `jru` como um membro de `teamtwo`.
.Adicionando contas de usuários a um novo grupo usando o man:pw[8]
[example]
====
[source,shell]
....
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru
....
====
O argumento para a opção `-M` é uma lista de usuários, delimitada por vírgulas, a serem adicionados a um novo grupo (vazio) ou para substituir os membros de um grupo existente. Para o usuário, essa associação ao grupo é diferente (e adicional ao) do grupo principal do usuário listado no arquivo de senha. Isso significa que o usuário não aparecerá como membro ao usar a opção `groupshow` com o man:pw[8], mas mostrará quando a informação é consultada via man:id[1] ou uma ferramenta similar. Quando o man:pw[8] é usado para adicionar um usuário a um grupo, ele apenas manipula o [.filename]#/etc/group# e não tenta ler dados adicionais do [.filename]#/etc/passwd#.
.Adicionando um novo membro a um grupo usando o man:pw[8]
[example]
====
[source,shell]
....
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
teamtwo:*:1100:jru,db
....
====
Neste exemplo, o argumento para `-m` é uma lista delimitada por vírgulas de usuários que devem ser adicionados ao grupo. Ao contrário do exemplo anterior, esses usuários são adicionados ao grupo e não substituem usuários existentes no grupo.
.Usando o man:id[1] para determinar a associação ao grupo
[example]
====
[source,shell]
....
% id jru
uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)
....
====
Neste exemplo, `jru` é um membro dos grupos `jru` e `teamtwo`.
Para obter mais informações sobre este comando e o formato do [.filename]#/etc/group#, consulte man:pw[8] e man:group[5].
[[permissions]]
== Permissões
No FreeBSD, todo arquivo e diretório tem um conjunto associado de permissões e vários utilitários estão disponíveis para visualizar e modificar essas permissões. É necessário entender como as permissões funcionam para garantir que os usuários consigam acessar os arquivos que precisam e não consigam acessar os arquivos usados pelo sistema operacional ou de propriedade de outros usuários.
Esta seção discute as permissões UNIX(TM) tradicionais usadas no FreeBSD. Para um controle de acesso ao sistema de arquivos mais refinado, consulte crossref:security[fs-acl,Listas de Controle de Acesso].
No UNIX(TM), as permissões básicas são atribuídas usando três tipos de acesso: ler, escrever e executar. Esses tipos de acesso são usados para determinar o acesso do arquivo ao proprietário, ao grupo e a outros usuários do arquivo (todos os outros). As permissões de leitura, gravação e execução podem ser representadas como as letras `r`, `w` e `x`. Elas também podem ser representados como números binários, pois cada permissão está ativada ou desativada (`0`). Quando representada como um número, a ordem é sempre lida como `rwx`, onde `r` é ativado com o valor `4`, `w` é ativado com o valor `2` e `x` é ativado com o valor `1`.
A Tabela 4.1 resume as possíveis possibilidades numéricas e alfabéticas. Ao ler a coluna "Listagem do Diretório", um `-` é usado para representar uma permissão que está desativada.
.Permissões UNIX(TM)
[cols="1,1,1", frame="none", options="header"]
|===
| Valor
| Permissão
| Listagem de diretório
|0
|Sem leitura, sem escrita, sem execução
|`---`
|1
|Sem leitura, sem escrita, execução
|`--x`
|2
|Sem leitura, escrita, sem execução
|`-w-`
|3
|Sem leitura, escrita, execução
|`-wx`
|4
|Leitura, sem escrita, sem execução
|`r--`
|5
|Leitura, sem escrita, execução
|`r-x`
|6
|Leitura, escrita, sem execução
|`rw-`
|7
|Leitura, escrita, execução
|`rwx`
|===
Use o argumento `-l` com o man:ls[1] para exibir uma lista longa de diretórios que inclua uma coluna de informações sobre um permissões do arquivo para o proprietário, grupo e outros. Por exemplo, um `ls -l` em um diretório arbitrário pode mostrar:
[source,shell]
....
% ls -l
total 530
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
....
O primeiro caractere (mais à esquerda) da primeira coluna indica se esse arquivo é um arquivo normal, um diretório, um dispositivo de caractere especial, um soquete ou qualquer outro dispositivo especial de pseudo-arquivo. Neste exemplo, o `-` indica um arquivo regular. Os próximos três caracteres, `rw-` neste exemplo, fornecem as permissões para o proprietário do arquivo. Os próximos três caracteres, `r--`, fornecem as permissões para o grupo ao qual o arquivo pertence. Os três últimos caracteres, `r--`, dão as permissões para o resto do mundo. Um traço significa que a permissão está desativada. Neste exemplo, as permissões são definidas para que o proprietário possa ler e gravar no arquivo, o grupo possa ler o arquivo e o resto do mundo só possa ler o arquivo. De acordo com a tabela acima, as permissões para este arquivo seriam `644`, onde cada dígito representa uma das três partes da permissão do arquivo.
Como o sistema controla as permissões nos dispositivos? O FreeBSD trata a maioria dos dispositivos de hardware como um arquivo nos quais os programas podem abrir, ler e gravar dados. Esses arquivos de dispositivos especiais são armazenados em [.filename]#/dev/#.
Diretórios também são tratados como arquivos. Eles tem permissões de leitura, gravação e execução. O bit executável de um diretório tem um significado ligeiramente diferente que nos arquivos. Quando um diretório é marcado como executável, isso significa que é possível mudar para esse diretório usando man:cd[1]. Isso também significa que é possível acessar os arquivos dentro desse diretório, sujeito às permissões dos próprios arquivos.
Para executar uma listagem de diretórios, a permissão de leitura deve estar ativada no diretório. Para deletar um arquivo que se conhece o nome, é necessário ter permissões de escrita _e_ execução no diretório que contém o arquivo.
Há mais bits de permissão, mas eles são usados principalmente em circunstâncias especiais, como binários setuid e diretórios fixos. Para obter mais informações sobre permissões de arquivos e como configurá-las, consulte man:chmod[1].
=== Permissões simbólicas
Permissões simbólicas usam caracteres em vez de valores octais para atribuir permissões a arquivos ou diretórios. Permissões simbólicas usam a sintaxe de (quem) (ação) (permissões), onde os seguintes valores estão disponíveis:
[.informaltable]
[cols="1,1,1", frame="none", options="header"]
|===
| Opção
| Letra
| Representa
|(quem)
|u
|Usuário
|(quem)
|g
|Grupo
|(quem)
|o
|Outros
|(quem)
|a
|Todos ("resto do mundo")
|(açao)
|+
|Adiciona permissões
|(açao)
|-
|Remove permissões
|(açao)
|=
|Permissões definidas explicitamente
|(permissões)
|r
|Leitura
|(permissões)
|w
|Escrita
|(permissões)
|x
|Execução
|(permissões)
|t
|bit fixador
|(permissões)
|s
|Set UID ou GID
|===
Esses valores são usados com o man:chmod[1], mas com letras em vez de números. Por exemplo, o comando a seguir impediria que outros usuários acessassem _FILE_:
[source,shell]
....
% chmod go= FILE
....
Uma lista separada por vírgula pode ser fornecida quando mais de um conjunto de alterações em um arquivo precisar ser feito. Por exemplo, o comando a seguir remove as permissões de gravação do grupo e "resto do mundo" no _FILE_ e adiciona as permissões de execução para todos:
[source,shell]
....
% chmod go-w,a+x FILE
....
=== Flags de arquivos no FreeBSD
Além das permissões de arquivo, o FreeBSD suporta o uso de "flags de arquivo". Esses sinalizadores adicionam um nível a mais de segurança e controle sobre os arquivos, mas não nos diretórios. Com flags de arquivos, mesmo o `root` pode ser impedido de remover ou alterar arquivos.
Os sinalizadores de arquivo são modificados usando o man:chflags[1]. Por exemplo, para ativar o sinalizador undeletable do sistema no arquivo [.filename]#file1#, use o seguinte comando:
[source,shell]
....
# chflags sunlink file1
....
Para desabilitar o sinalizador undeletable do sistema, coloque um "no" na frente do `sunlink`:
[source,shell]
....
# chflags nosunlink file1
....
Para visualizar os sinalizadores de um arquivo, use `-lo` com o man:ls[1]:
[source,shell]
....
# ls -lo file1
....
[.programlisting]
....
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
....
Vários flags de arquivo só podem ser adicionados ou removidos pelo usuário `root`. Em outros casos, o proprietário do arquivo pode definir seus sinalizadores. Consulte man:chflags[1] e man:chflags[2] para maiores informações.
=== As permissões `setuid`, `setgid` e `sticky`
Além das permissões já discutidas, existem três outras configurações específicas que todos os administradores devem conhecer. Eles são as permissões `setuid`, `setgid` e `sticky`.
Essas configurações são importantes para algumas operações UNIX(TM), pois fornecem funcionalidades normalmente não concedidas a usuários normais. Para compreendê-los, a diferença entre o ID real de usuário e o ID efetivo de usuário deve ser explicada.
O ID de usuário real é o UID que inicia ou é o dono do processo. O ID de usuário efetivo é o UID do usuário com o qual o processo é executado. Por exemplo, o man:passwd[1] é executado com o ID do usuário real quando um usuário altera sua senha. No entanto, para atualizar o banco de dados de senhas, o comando é executado como o ID efetivo do usuário `root`. Isso permite que os usuários alterem suas senhas sem ver um erro `Permission Denied`.
A permissão setuid pode ser definida prefixando um conjunto de permissões com o número quatro (4), conforme mostrado no exemplo a seguir:
[source,shell]
....
# chmod 4755 suidexample.sh
....
As permissões em [.filename]#suidexample.sh# agora se parecem com o seguinte:
[.programlisting]
....
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
....
Observe que um `s` agora faz parte do conjunto de permissões designado para o proprietário do arquivo, substituindo o bit executável. Isso viabiliza utilitários que precisam de permissões elevadas, como o man:passwd[1].
[NOTE]
====
A opção `nosuid` man:mount[8] fará com que esses binários falhem silenciosamente sem alertar o usuário. Essa opção não é totalmente confiável, já que um wrapper `nosuid` pode contorná-la.
====
Para ver isso em tempo real, abra dois terminais. Em um deles, digite `passwd` como um usuário normal. Enquanto aguarda uma nova senha, verifique a tabela de processos e observe as informações de usuário do man:passwd[1]:
No terminal A:
[source,shell]
....
Changing local password for trhodes
Old Password:
....
No terminal B:
[source,shell]
....
# ps aux | grep passwd
....
[source,shell]
....
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd
root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
....
Embora man:passwd[1] seja executado como um usuário normal, ele está usando o UID do `root`.
A permissão `setgid` executa a mesma função que a permissão `setuid`; exceto que altera as configurações do grupo. Quando um aplicativo ou utilitário é executado com essa configuração, ele recebe as permissões com base no grupo do arquivo, não no usuário que iniciou o processo.
Para definir a permissão `setgid` em um arquivo, execute o man:chmod[1] com dois (2) no início:
[source,shell]
....
# chmod 2755 sgidexample.sh
....
Na listagem a seguir, observe que o `s` está agora no campo designado para as configurações de permissão do grupo:
[source,shell]
....
-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 sgidexample.sh
....
[NOTE]
====
Nestes exemplos, mesmo que o shell script em questão seja um arquivo executável, ele não será executado com um EUID diferente ou um ID de usuário efetivo. Isso ocorre porque os shell scripts podem não acessar as chamadas de sistema man:setuid[2].
====
Os bits de permissão `setuid` e `setgid` podem diminuir a segurança do sistema, permitindo permissões elevadas. A terceira permissão especial, o `sticky bit`, pode fortalecer a segurança de um sistema.
Quando o `sticky bit` é definido em um diretório, ele permite a exclusão de arquivos apenas pelo proprietário do arquivo. Isso é útil para impedir a exclusão de arquivos em diretórios públicos, como [.filename]#/tmp#, por usuários que não possuem o arquivo. Para utilizar essa permissão, use o um (1) no início das permissões:
[source,shell]
....
# chmod 1777 /tmp
....
A permissão `sticky bit` será exibida como um `t` no final do conjunto de permissões:
[source,shell]
....
# ls -al / | grep tmp
....
[source,shell]
....
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
....
[[dirstructure]]
== Estrutura de Diretórios
Entender a hierarquia de diretórios do FreeBSD é fundamental para obter uma compreensão geral do sistema. O diretório mais importante é o root ou raiz ou "/". Esse diretório é o primeiro montado no momento da inicialização e contém a base do sistema necessária para preparar o sistema operacional para a operação multi-usuário. O diretório raiz também contém pontos de montagem para outros sistemas de arquivos que são montados durante a transição para a operação multi-usuário.
Um ponto de montagem é um diretório no qual sistemas de arquivos adicionais podem ser disponibilizados em um sistema de arquivos principal (geralmente o sistema de arquivos raiz). Isso é descrito em <<disk-organization>>. Os pontos de montagem padrão incluem [.filename]#/usr/#, [.filename]#/var/#, [.filename]#/tmp/#, [.filename]#/mnt/# e [.filename]#/cdrom/#. Esses diretórios são geralmente associados a entradas em [.filename]#/etc/fstab#. Este arquivo é uma tabela de vários sistemas de arquivos e pontos de montagem e é lido pelo sistema. A maioria dos sistemas de arquivos em [.filename]#/etc/fstab# é montada automaticamente no momento da inicialização do script man:rc[8] a não ser que haja a opção `noauto`. Maiores detalhes em <<disks-fstab>>.
Uma descrição completa da hierarquia do sistema de arquivos está disponível em man:hier[7]. A tabela a seguir fornece uma visão geral dos diretórios mais comuns.
[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Diretório
| Descrição
|[.filename]#/#
|Diretório raiz do sistema de arquivos.
|[.filename]#/bin/#
|Utilitários de usuário fundamentais para ambientes mono e multi-usuário.
|[.filename]#/boot/#
|Programas e arquivos de configuração usados durante o bootstrap do sistema operacional.
|[.filename]#/boot/defaults/#
|Arquivos de configuração de inicialização padrão. Consulte man:loader.conf[5] para maiores detalhes.
|[.filename]#/dev/#
|Nós de dispositivo (device nodes). Consulte man:intro[4] para detalhes.
|[.filename]#/etc/#
|Arquivos de configuração do sistema e scripts.
|[.filename]#/etc/defaults/#
|Arquivos padrão de configuração do sistema. Consulte man:rc[8] para maiores detalhes.
|[.filename]#/etc/mail/#
|Arquivos de configuração para agentes de transporte de mensagens, como o man:sendmail[8].
|[.filename]#/etc/periodic/#
|Scripts que são executados diariamente, semanalmente e mensalmente, por meio do man:cron[8]. Consulte man:periodic[8] para maiores detalhes.
|[.filename]#/etc/ppp/#
|Arquivos de configuração do man:ppp[8].
|[.filename]#/mnt/#
|Diretório vazio comumente usado pelos administradores do sistema como um ponto de montagem temporário.
|[.filename]#/proc/#
|Sistema de arquivos de processos. Consulte man:procfs[5], man:mount_procfs[8] para detalhes.
|[.filename]#/rescue/#
|Programas vinculados estaticamente para recuperação de emergência, conforme descrito em man:rescue[8].
|[.filename]#/root/#
|Diretório da conta `root`.
|[.filename]#/sbin/#
|Programas do sistema e utilitários de administração fundamentais para ambientes mono e multi-usuário.
|[.filename]#/tmp/#
|Arquivos temporários que normalmente _não_ são preservados em uma reinicialização do sistema. Um sistema de arquivos baseado em memória é frequentemente montado em [.filename]#/tmp#. Isso pode ser automatizado usando as variáveis relacionadas ao tmpmfs do man:rc.conf[5] ou com uma entrada em [.filename]#/etc/fstab#; consulte man:mdmfs[8] para maiores detalhes.
|[.filename]#/usr/#
|A maioria dos utilitários e aplicativos do usuário.
|[.filename]#/usr/bin/#
|Utilitários comuns, ferramentas de programação e aplicativos.
|[.filename]#/usr/include/#
|Arquivos para "include" do C padrão.
|[.filename]#/usr/lib/#
|Arquivos de biblioteca.
|[.filename]#/usr/libdata/#
|Diversos arquivos de dados de utilitários.
|[.filename]#/usr/libexec/#
|Daemons do sistema e utilitários do sistema executados por outros programas.
|[.filename]#/usr/local/#
|Executáveis e bibliotecas locais. Também é usado como o destino padrão para o framework do ports do FreeBSD. Dentro do [.filename]#/usr/local#, o layout geral esboçado por man:hier[7] para [.filename]#/usr# deve ser usado. Exceções são o diretório man, que está diretamente sob [.filename]#/usr/local# em vez de sob [.filename]#/usr/local/share#, e a documentação do ports está em [.filename]#share/doc/port#.
|[.filename]#/usr/obj/#
|Árvore de destino específica da arquitetura produzida pela construção da árvore [.filename]#/usr/src#.
|[.filename]#/usr/ports/#
|A Coleção de Ports do FreeBSD (opcional).
|[.filename]#/usr/sbin/#
|Daemons do sistema e utilitários do sistema executados pelos usuários.
|[.filename]#/usr/shared/#
|Arquivos independentes de arquitetura.
|[.filename]#/usr/src/#
|Arquivos do código-fonte do BSD.
|[.filename]#/var/#
|Arquivos de log de múltiplos propósitos, temporários, transientes e de spool. Um sistema de arquivos baseado em memória às vezes é montado em [.filename]#/var#. Isso pode ser automatizado usando as variáveis relacionadas ao varmfs em man:rc.conf[5] ou com uma entrada em [.filename]#/etc/fstab#; consulte man:mdmfs[8] para maiores detalhes.
|[.filename]#/var/log/#
|Diversos arquivos de log do sistema.
|[.filename]#/var/mail/#
|Arquivos de caixa de correio do usuário.
|[.filename]#/var/spool/#
|Diretórios de spooling de impressoras e sistemas de email.
|[.filename]#/var/tmp/#
|Arquivos temporários que geralmente são preservados em uma reinicialização do sistema, a menos que [.filename]#/var# seja um sistema de arquivos baseado em memória.
|[.filename]#/var/yp/#
|Mapas de NIS.
|===
[[disk-organization]]
== Organização dos Discos
A menor unidade de organização que o FreeBSD usa para encontrar arquivos é o nome do arquivo. Os nomes dos arquivos diferenciam maiúsculas de minúsculas, o que significa que [.filename]#readme.txt# e [.filename]#README.TXT# são dois arquivos distintos. O FreeBSD não usa a extensão de um arquivo para determinar se é um programa, documento ou alguma outra forma de dados.
Os arquivos são armazenados em diretórios. Um diretório pode não conter arquivos ou pode conter centenas deles. Um diretório também pode conter outros diretórios, permitindo uma hierarquia de diretórios entre si para organizar os dados.
Arquivos e diretórios são referenciados por meio de um nome, seguido por uma barra, `/`, seguido por qualquer outro nome de diretório que seja necessário. Por exemplo, se o diretório [.filename]#foo# contiver um diretório [.filename]#bar# que contenha o arquivo [.filename]#readme.txt#, o nome completo ou _caminho_, para o arquivo é [.filename]#foo/bar/readme.txt#. Observe que isso é diferente do Windows(TM) que usa `\` para separar nomes de arquivos e diretórios. O FreeBSD não usa letras de unidades ou outros nomes de unidades no caminho. Por exemplo, não se deve digitar [.filename]#c:\foo\bar\readme.txt# no FreeBSD.
Diretórios e arquivos são armazenados em um sistema de arquivos. Cada sistema de arquivos contém exatamente um diretório no nível superior, chamado de _diretório raiz_ para esse sistema de arquivos. Este diretório raiz pode conter outros diretórios. Um sistema de arquivos é designado como _sistema de arquivos raiz_ ou `/`. Todos os outros sistemas de arquivos são _montados_ no sistema de arquivos raiz. Não importa quantos discos estejam no sistema FreeBSD, cada diretório parece fazer parte do mesmo disco.
Considere três sistemas de arquivos, chamados `A`, `B` e `C`. Cada sistema de arquivos tem um diretório raiz, que contém dois outros diretórios, chamados `A1`, `A2` (e da mesma forma `B1`, `B2` e `C1`, `C2`).
Chame `A` de sistema de arquivos raiz. Se man:ls[1] for usado para visualizar o conteúdo deste diretório, ele mostrará dois subdiretórios, `A1` e `A2`. A árvore de diretórios tem esta aparência:
image::example-dir1.png[]
Um sistema de arquivos deve ser montado em um diretório em outro sistema de arquivos. Ao montar o sistema de arquivos `B` no diretório `A1`, o diretório raiz de `B` substitui `A1` e os diretórios em `B` aparecem de acordo:
image::example-dir2.png[]
Todos os arquivos que estão nos diretórios `B1` ou `B2` podem ser alcançados com o caminho [.filename]#/A1/B1# ou [.filename]#/A1/B2#, conforme necessário. Todos os arquivos que estavam em [.filename]#/A1# foram temporariamente ocultados. Eles reaparecerão se `B` for _desmontado_ de `A`.
Se `B` tivesse sido montado em `A2`, o diagrama ficaria assim:
image::example-dir3.png[]
e os caminhos seriam [.filename]#/A2/B1# e [.filename]#/A2/B2# respectivamente.
Os sistemas de arquivos podem ser montados uns em cima dos outros. Continuando o último exemplo, o sistema de arquivos `C` pode ser montado no topo do diretório `B1` no sistema de arquivos `B`, levando a esta disposição:
image::example-dir4.png[]
Ou `C` poderia ser montado diretamente no sistema de arquivos `A`, sob o diretório `A1`:
image::example-dir5.png[]
É perfeitamente possível ter um sistema de arquivos raiz grande e não precisar criar nenhum outro. Existem algumas desvantagens nessa abordagem e uma vantagem.
.Benefícios de vários sistemas de arquivos
* Sistemas de arquivos diferentes podem ter diferentes _opções de montagem_. Por exemplo, o sistema de arquivos raiz pode ser montado somente para leitura, impossibilitando que os usuários excluam ou editem inadvertidamente um arquivo crítico. Separar sistemas de arquivos graváveis pelo usuário, como [.filename]#/home#, de outros sistemas de arquivos permite que eles sejam montados como _nosuid_. Essa opção impede que os bits _suid_/_guid_ dos executáveis armazenados no sistema de arquivos entrem em vigor, possivelmente melhorando a segurança.
* O FreeBSD otimiza automaticamente o layout dos arquivos em um sistema de arquivos, dependendo de como o sistema de arquivos está sendo usado. Portanto, um sistema de arquivos que contém muitos arquivos pequenos que são gravados com freqüência terá uma otimização diferente para um que contenha menos arquivos maiores. Ao ter um sistema de arquivos maior, essa otimização é quebrada.
* Os sistemas de arquivos do FreeBSD são robustos se a energia for perdida. No entanto, uma perda de energia em um ponto crítico ainda pode danificar a estrutura do sistema de arquivos. Ao dividir dados em vários sistemas de arquivos, é mais provável que o sistema ainda inicialize, facilitando a restauração do backup conforme necessário.
.Benefício de um sistema de arquivos único
* Os sistemas de arquivos são de tamanho fixo. Se você cria um sistema de arquivos quando instala o FreeBSD e dá a ele um tamanho específico, você pode descobrir mais tarde que precisa aumentar a partição. Isso não é facilmente realizado sem um backup, recriando o sistema de arquivos com o novo tamanho e, em seguida, restaurando os dados de backup.
+
[IMPORTANT]
====
O FreeBSD possui o comando man:growfs[8], que torna possível aumentar o tamanho do sistema de arquivos enquanto montado, removendo essa limitação.
====
Os sistemas de arquivos estão contidos em partições. Isto não tem o mesmo significado que o uso comum do termo partição (por exemplo, a partição MS-DOS(TM)), por causa da herança UNIX(TM) do FreeBSD. Cada partição é identificada por uma letra de `a` até `h`. Cada partição pode conter apenas um sistema de arquivos, o que significa que os sistemas de arquivos geralmente são descritos por seu ponto de montagem típico na hierarquia do sistema de arquivos ou pela letra da partição em que estão contidos.
O FreeBSD também usa espaço em disco para _espaço de swap_ para fornecer _memória virtual_. Isso permite que o seu computador se comporte como se tivesse muito mais memória do que realmente tem. Quando o FreeBSD fica sem memória, ele move alguns dos dados que não estão sendo usados atualmente para o espaço de swap, e os move de volta (removendo alguma outra coisa) quando precisa.
Algumas partições possuem certas convenções associadas a elas.
[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Partição
| Convenção
|`a`
|Normalmente contém o sistema de arquivos raiz.
|`b`
|Normalmente contém espaço de swap.
|`c`
|Normalmente o mesmo tamanho da slice que a envolve. Isso permite que os programas que precisem trabalhar na slice inteira, como um scanner de bloco defeituoso, trabalhem na partição `c`. Um sistema de arquivos normalmente não seria criado nessa partição.
|`d`
|A partição `d` costumava ter um significado especial associado a ela, mas isso foi descontinuado e `d` pode funcionar como qualquer partição normal.
|===
Os discos no FreeBSD são divididos em slices, referidas no Windows(TM) como partições, numeradas de 1 a 4. Estas são então divididas em partições, que contêm sistemas de arquivos, e são rotuladas usando letras.
Os números das slices seguem o nome do dispositivo, prefixado com um `s`, começando em 1. Então "da0__s1__" é a primeira slice na primeira unidade SCSI. Pode haver apenas quatro slices físicas em um disco, mas pode haver slices lógicas dentro de slices físicas do tipo apropriado. Essas slices estendidas são numeradas a partir de 5, então "ada0__s5__" é a primeira slice estendida no primeiro disco SATA. Esses dispositivos são usados por sistemas de arquivos que esperam ocupar uma slice.
Slices, unidades físicas "perigosamente dedicadas" e outras unidades contêm _partições_, que são representadas como letras de `a` até `h`. Esta letra é adicionada ao nome do dispositivo, então "da0__a__" é a partição `a` na primeira unidade `da`, que é "perigosamente dedicada". A "ada1s3__e__" é a quinta partição na terceira slice da segunda unidade de disco SATA.
Finalmente, cada disco no sistema é identificado. Um nome de disco começa com um código que indica o tipo de disco e, em seguida, um número, indicando qual é o disco. Ao contrário das slices, a numeração de discos começa em 0. Códigos usuais são listados em <<disks-naming>>.
Ao se referir a uma partição, inclua o nome do disco, `s`, o número da slice, em seguida, a letra da partição. Exemplos são mostrados em <<basics-disk-slice-part>>.
<<basics-concept-disk-model>> mostra um modelo conceitual de um layout de disco.
Ao instalar o FreeBSD, configure as slices de disco, crie partições dentro da slice a ser usada para o FreeBSD, crie um sistema de arquivos ou espaço de swap em cada partição e decida onde cada sistema de arquivos será montado.
[[disks-naming]]
.Nomes de dispositivos de disco
[cols="1,1", frame="none", options="header"]
|===
| Tipo de drive
| Nome do drive
|discos rígidos SATA e IDE
|`ada` ou `ad`
|Discos rígidos SCSI e dispositivos de armazenamento USB
|`da`
|drives de CD-ROMSATA e IDE
|`cd` ou `acd`
|Unidades SCSICD-ROM
|`cd`
|Unidades de disquete
|`fd`
|Unidades de CD-ROM não-padrão variadas
|`mcd` para CD-ROM Mitsumi e `scd` para dispositivos de CD-ROM Sony
|Unidades de fita SCSI
|`sa`
|Unidades de fita IDE
|`ast`
|Drives RAID
|Exemplos incluem `aacd` para Adaptec(TM) AdvancedRAID, `mlxd` e `mlyd` para Mylex(TM), `amrd` para AMI MegaRAID(TM), `idad` para Compaq Smart RAID, `twed` para 3ware(TM) RAID.
|===
[[basics-disk-slice-part]]
.Exemplo de Nomes de Disco, Slice e Partição
[example]
====
[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| Nome
| Significado
|`ada0s1a`
|A primeira partição (`a`) na primeira slice (`s1`) no primeiro disco SATA (`ada0`).
|`da1s2e`
|A quinta partição (`e`) na segunda slice (`s2`) no segundo disco SCSI (`da1`).
|===
====
[[basics-concept-disk-model]]
.Modelo conceitual de um disco
[example]
====
Este diagrama mostra a visão do FreeBSD do primeiro disco SATA conectado ao sistema. Suponha que o disco tenha 250 GB de tamanho e contenha uma slice de 80 GB e uma slice de 170 GB (partições MS-DOS(TM)). A primeira slice contém um sistema de arquivos Windows(TM)NTFS, [.filename]#C:#, e a segunda fatia contém uma instalação do FreeBSD. Este exemplo de instalação do FreeBSD possui quatro partições de dados e uma partição swap.
Cada uma das quatro partições contém um sistema de arquivos. A partição `a` é usada para o sistema de arquivos raiz, `d` para [.filename]#/var/#, `e` para [.filename]#/tmp/# e `f` para [.filename]#/usr/#. A letra de partição `c` refere-se à fatia inteira e, portanto, não é usada para partições comuns.
image::disk-layout.png[]
====
[[mount-unmount]]
== Montando e Desmontando Sistemas de Arquivos
O sistema de arquivos é melhor visualizado como uma árvore, enraizada, por assim dizer, em [.filename]#/#. O [.filename]#/dev#, [.filename]#/usr#, e os outros diretórios no diretório raiz são ramos, que podem ter suas próprias ramificações, como [.filename]#/usr/local# e assim por diante.
Existem várias razões para abrigar alguns desses diretórios em sistemas de arquivos separados. O [.filename]#/var# contém os diretórios [.filename]#log/#, [.filename]#spool/# e vários tipos de arquivos temporários e, como tal, podem encher. Encher completamente o sistema de arquivos raiz não é uma boa ideia, então separar o [.filename]#/var# do [.filename]#/# geralmente é vantajoso.
Outro motivo comum para colocar determinadas árvores de diretório em outros sistemas de arquivos é se elas forem ser armazenadas em discos físicos separados ou se são discos virtuais separados, tal como montagens de NFS (Network File System), descritas em crossref:network-servers[network-nfs,Network File System (NFS)] ou unidades de CD-ROM.
[[disks-fstab]]
=== O arquivo [.filename]#fstab#
Durante o processo de inicialização (crossref:boot[boot, O processo de inicialização do FreeBSD]), os sistemas de arquivos listados em [.filename]#/etc/fstab# são automaticamente montados, exceto pelas entradas que contêm `noauto`. Este arquivo contém entradas no seguinte formato:
[.programlisting]
....
device /mount-point fstype options dumpfreq passno
....
`device`::
Um nome de dispositivo existente, conforme explicado em <<disks-naming>>.
`mount-point`::
Um diretório existente no qual montar o sistema de arquivos.
`fstype`::
O tipo de sistema de arquivos para passar para o man:mount[8]. O sistema de arquivos padrão do FreeBSD é o `ufs`.
`options`::
`rw` para sistemas de arquivos de leitura/gravação, ou `ro` para sistemas de arquivos somente de leitura, seguidos por quaisquer outras opções que possam ser necessárias. Uma opção comum é `noauto` para sistemas de arquivos normalmente não montados durante a seqüência de inicialização. Outras opções estão listadas em man:mount[8].
`dumpfreq`::
Usado pelo man:dump[8] para determinar quais sistemas de arquivos requerem o dump. Se o campo estiver faltando, um valor zero será assumido.
`passno`::
Determina a ordem em que os sistemas de arquivos devem ser verificados. Os sistemas de arquivos que devem ser ignorados devem ter seu `passno` definido como zero. O sistema de arquivos raiz precisa ser verificado antes de todo o restante e deve ter seu `passno` definido como um. Os outros sistemas de arquivos devem ser configurados para valores maiores que um. Se mais de um sistema de arquivos tiver o mesmo `passno`, o man:fsck[8] tentará verificar os sistemas de arquivos em paralelo, se possível.
Consulte man:fstab[5] para obter maiores informações sobre o formato do [.filename]#/etc/fstab# e suas opções.
[[disks-mount]]
=== Usando o man:mount[8]
Os sistemas de arquivos são montados usando o comando man:mount[8]. A sintaxe mais básica é a seguinte:
[source,shell]
....
# mount device mountpoint
....
Este comando fornece muitas opções que são descritas em man:mount[8]. As opções mais usadas incluem:
.Opções de montagem
`-a`::
Monte todos os sistemas de arquivos listados em [.filename]#/etc/fstab#, exceto aqueles marcados como "noauto", excluídos pela opção `-t`, ou aqueles que já estão montados.
`-d`::
Faz tudo, exceto a chamada real do sistema de montagem. Esta opção é útil em conjunto com a opção `-v` para determinar o que o man:mount[8] está realmente tentando fazer.
`-f`::
Força a montagem de um sistema de arquivos sujo (perigoso) ou a revogação do acesso de gravação ao fazer o downgrade do status de montagem de um sistema de arquivos de leitura/gravação para somente leitura.
`-r`::
Monta o sistema de arquivos somente para leitura. Isso é idêntico ao uso de `-o ro`.
`-t` _fstype_::
Monta o tipo de sistema de arquivos especificado ou monta somente sistemas de arquivos do tipo especificado, se ``-a``estiver incluído. "ufs" é o tipo de sistema de arquivos padrão.
`-u`::
Atualiza as opções de montagem no sistema de arquivos.
`-v`::
Fica verboso (mostra mais informações).
`-w`::
Monta o sistema de arquivos para leitura/gravação.
As seguintes opções podem ser passadas para `-o` como uma lista separada por vírgula:
nosuid::
Não interprete flags setuid ou setgid no sistema de arquivos. Essa também é uma opção de segurança útil.
[[disks-umount]]
=== Usando o man:umount[8]
Para desmontar um sistema de arquivos use man:umount[8]. Esse comando usa um parâmetro que pode ser um ponto de montagem, um nome do dispositivo, `-a` ou `-A`.
Todos os usos aceitam `-f` para forçar a desmontagem e `-v` para ver mais informações. Atenção, em geral `-f` não é uma boa opção, pois pode travar o computador ou danificar os dados no sistema de arquivos.
Para desmontar todos os sistemas de arquivos montados, ou apenas os tipos de sistema de arquivos listados após `-t`, use `-a` ou `-A`. Note que `-A` não tenta desmontar o sistema de arquivos raiz.
[[basics-processes]]
== Processos e Daemons
O FreeBSD é um sistema operacional multitarefa. Cada programa em execução a qualquer momento é chamado de _processo_. Todo comando em execução inicia pelo menos um novo processo e há vários processos de sistema que são executados pelo FreeBSD.
Cada processo é identificado exclusivamente por um número chamado _ID do processo_ (PID). Semelhante aos arquivos, cada processo tem um proprietário e um grupo, e as permissões de proprietário e grupo são usadas para determinar quais arquivos e dispositivos o processo pode abrir. A maioria dos processos também possui um processo pai que os iniciou. Por exemplo, o shell é um processo e qualquer comando iniciado no shell é um processo que tem o shell como seu processo pai. A exceção é um processo especial chamado man:init[8] que é sempre o primeiro processo a rodar na inicialização e que sempre possui um PID de `1`.
Alguns programas não são projetados para serem executados com a entrada contínua do usuário e desconectam do terminal na primeira oportunidade. Por exemplo, um servidor da Web responde a solicitações da Web, em vez de entradas do usuário. Servidores de email são outro exemplo desse tipo de aplicativo. Esses tipos de programas são conhecidos como _daemons_. O termo daemon vem da mitologia grega e representa uma entidade que não é boa nem má, e que invisivelmente realiza tarefas úteis. É por isso que o mascote do BSD é o daemon de aparência alegre com tênis e um tridente.
Existe uma convenção para nomear programas que normalmente são executados como daemons com um "d" à direita. Por exemplo, BIND é o Berkeley Internet Name Domain, mas o programa real que é executado é `named`. O programa do servidor da web Apache é o `httpd` e o daemon de spooling da impressora de linha é o `lpd`. Esta é apenas uma convenção de nomenclatura. Por exemplo, o daemon de correio principal para o aplicativo Sendmail é o `sendmail` e não `maild`.
=== Visualizando Processos
Para ver os processos em execução no sistema, use o man:ps[1] ou o man:top[1]. Para exibir uma lista estática dos processos em execução no momento, seus PIDs, quanta memória eles estão usando e o comando com o qual eles foram iniciados, use o man:ps[1]. Para exibir todos os processos em execução e atualizar a exibição a cada poucos segundos para ver interativamente o que o computador está fazendo, use o man:top[1].
Por padrão, o man:ps[1] mostra apenas os comandos que estão em execução e que são de propriedade do usuário. Por exemplo:
[source,shell]
....
% ps
PID TT STAT TIME COMMAND
8203 0 Ss 0:00.59 /bin/csh
8895 0 R+ 0:00.00 ps
....
A saída do man:ps[1] é organizada em várias colunas. A coluna `PID` exibe o ID do processo. Os PIDs são atribuídos a partir de 1, vão até 99999, e depois retornam ao início. No entanto, um PID não é reatribuído se já estiver em uso. A coluna `TT` mostra o tty em que o programa está sendo executado e `STAT` mostra o estado do programa. `TIME` é a quantidade de tempo que o programa foi executado na CPU. Normalmente, esse não é o tempo decorrido desde que o programa foi iniciado, pois a maioria dos programas gasta muito tempo esperando que as coisas aconteçam antes que precisem gastar tempo na CPU. Finalmente, `COMMAND` é o comando que foi usado para iniciar o programa.
Várias opções diferentes estão disponíveis para alterar as informações exibidas. Um dos conjuntos mais úteis é `auxww`, onde `a` exibe informações sobre todos os processos em execução de todos os usuários, `u` exibe o nome de usuário e o uso de memória do proprietário do processo, `x` exibe informações sobre os processos do daemon e `ww` faz com que o man:ps[1] exiba a linha de comando completa para cada processo, em vez de truncá-la para caber na tela quando é muito longa.
A saída do man:top[1] é semelhante a abaixo:
[source,shell]
....
% top
last pid: 9609; load averages: 0.56, 0.45, 0.36 up 0+00:20:03 10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU: 6.2% user, 0.1% nice, 8.2% system, 0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
557 root 1 -21 r31 136M 42296K select 0 2:20 9.96% Xorg
8198 dru 2 52 0 449M 82736K select 3 0:08 5.96% kdeinit4
8311 dru 27 30 0 1150M 187M uwait 1 1:37 0.98% firefox
431 root 1 20 0 14268K 1728K select 0 0:06 0.98% moused
9551 dru 1 21 0 16600K 2660K CPU3 3 0:01 0.98% top
2357 dru 4 37 0 718M 141M select 0 0:21 0.00% kdeinit4
8705 dru 4 35 0 480M 98M select 2 0:20 0.00% kdeinit4
8076 dru 6 20 0 552M 113M uwait 0 0:12 0.00% soffice.bin
2623 root 1 30 10 12088K 1636K select 3 0:09 0.00% powerd
2338 dru 1 20 0 440M 84532K select 1 0:06 0.00% kwin
1427 dru 5 22 0 605M 86412K select 1 0:05 0.00% kdeinit4
....
A saída é dividida em duas seções. O cabeçalho (as primeiras cinco ou seis linhas) mostra o PID do último processo executado, as médias de carga do sistema (que são uma medida de quão ocupado o sistema está), o tempo de atividade do sistema desde a última reinicialização) e a hora atual. As outras informações no cabeçalho se relacionam com quantos processos estão sendo executados, quanta memória e swap estão em uso e quanto tempo o sistema está gastando em diferentes estados da CPU. Se o módulo do sistema de arquivos ZFS foi carregado, uma linha `ARC` indica a quantidade de dados que foram lidos do cache de memória, e não do disco.
Abaixo do cabeçalho há uma série de colunas contendo informações semelhantes à saída do man:ps[1], como o PID, nome de usuário, quantidade de tempo de CPU e o comando que iniciou o processo. Por padrão, o man:top[1] também exibe a quantidade de espaço de memória ocupada pelo processo. Isso é dividido em duas colunas: uma para o tamanho total e outra para o tamanho do residente. O tamanho total é a quantidade de memória que o aplicativo precisa e o tamanho de residente é o quanto ele está realmente usando agora.
O man:top[1] atualiza automaticamente a exibição a cada dois segundos. Um intervalo diferente pode ser especificado com `-s`.
[[basics-daemons]]
=== Matando Processos
Uma maneira de se comunicar com qualquer processo ou daemon em execução é enviar um _sinal_ usando o man:kill[1]. Existem vários sinais diferentes; alguns têm um significado específico, enquanto outros são descritos na documentação do comando. Um usuário só pode enviar um sinal para um processo que seja seu. Enviar um sinal para o processo de outra pessoa resultará em um erro de permissão negada. A exceção é o usuário `root`, que pode enviar sinais para os processos de qualquer pessoa.
O sistema operacional também pode enviar um sinal para um processo. Se um aplicativo estiver mal escrito e tentar acessar a memória que não deveria, o FreeBSD enviará ao processo o sinal de "Segmentation Violation" (`SIGSEGV`). Se uma aplicação foi escrita para usar a chamada de sistema man:alarm[3] para ser alertada após um período de tempo, será enviado o sinal "Alarm" (`SIGALRM`).
Dois sinais podem ser usados para interromper um processo: `SIGTERM` e `SIGKILL`. `SIGTERM` é a maneira educada de eliminar um processo, pois o processo pode ler o sinal, fechar quaisquer arquivos de log que possam estar abertos e tentar terminar o que está fazendo antes de desligar. Em alguns casos, um processo pode ignorar `SIGTERM` se estiver no meio de alguma tarefa que não pode ser interrompida.
`SIGKILL` não pode ser ignorado por um processo. Enviar um `SIGKILL` para um processo geralmente interromperá esse processo de uma vez por todas. .
Outros sinais comumente usados são `SIGHUP`, `SIGUSR1` e `SIGUSR2`. Como esses são sinais de finalidade geral, diferentes aplicativos responderão de maneira diferente.
Por exemplo, depois de alterar o arquivo de configuração de um servidor da Web, o servidor da Web precisa ser instruído a reler sua configuração. Reiniciar o `httpd` resultaria em um breve período de interrupção no servidor da web. Em vez disso, envie ao daemon o sinal `SIGHUP`. Esteja ciente de que diferentes daemons terão um comportamento diferente, então consulte a documentação do daemon para determinar se `SIGHUP` terá os resultados desejados.
[.procedure]
====
*Procedure: Enviando um sinal para um processo*
Este exemplo mostra como enviar um sinal para o man:inetd[8]. O arquivo de configuração do man:inetd[8] é o [.filename]#/etc/inetd.conf# e o man:inetd[8] irá reler este arquivo de configuração quando for enviado um `SIGHUP`.
. Encontre o PID do processo para enviar o sinal usando man:pgrep[1]. Neste exemplo, o PID do man:inetd[8] é 198:
+
[source,shell]
....
% pgrep -l inetd
198 inetd -wW
....
+
. Use o man:kill[1] para enviar o sinal. Como o man:inetd[8] é de propriedade do `root`, use o man:su[1] para se tornar `root` primeiro.
+
[source,shell]
....
% su
Password:
# /bin/kill -s HUP 198
....
+
Como a maioria dos comandos UNIX(TM), o man:kill[1] não imprimirá nenhuma saída se for bem-sucedido. Se um sinal for enviado para um processo que não pertence ao usuário, a mensagem `kill: _PID_: Operation not permitted` será exibida. Errar o PID irá enviar o sinal para o processo errado, o que poderia ter resultados negativos, ou enviará o sinal para um PID que não esteja em uso no momento, resultando em o erro `kill: _PID_: No such process`.
+
[NOTE]
.Por que usar o `/bin/kill`?
======
Muitos shells fornecem o `kill` como um comando interno, o que significa que o shell enviará o sinal diretamente, em vez de executar o [.filename]#/bin/kill#. Esteja ciente de que diferentes shells possuem uma sintaxe diferente para especificar o nome do sinal a ser enviado. Em vez de tentar aprender todos eles, pode ser mais simples especificar explicitamente o uso do `/bin/kill`.
======
====
Ao enviar outros sinais, substitua `TERM` ou `KILL` pelo nome do sinal.
[IMPORTANT]
====
Matar um processo aleatório no sistema é uma má ideia. Em particular, o man:init[8], PID 1, é especial. Executar `/bin/kill -s KILL 1` é uma maneira rápida e não recomendada de desligar o sistema. _Sempre_ verifique os argumentos do man:kill[1]_antes_ de pressionar a tecla kbd:[Enter].
====
[[shells]]
== Shells
Um _shell_ fornece uma interface de linha de comandos para interagir com o sistema operacional. Um shell recebe comandos do canal de entrada e os executa. Muitos shells fornecem funções incorporadas para ajudar nas tarefas diárias, como gerenciamento de arquivos, referenciamento de arquivos, edição de linha de comando, macros de comando e variáveis de ambiente. O FreeBSD vem com vários shells, incluindo o shell Bourne (man:sh[1]) e o shell C estendido (man:tcsh[1]). Outros shells estão disponíveis na Coleção de Ports do FreeBSD, como o `zsh` e o `bash`.
O shell usado é realmente uma questão de gosto. Um programador C pode se sentir mais confortável com um shell semelhante ao C, como o man:tcsh[1]. Um usuário Linux(TM) pode preferir o `bash`. Cada shell tem propriedades únicas que podem ou não funcionar com o ambiente de trabalho preferido de um usuário, e é por isso que existe a opção de qual shell usar.
Um recurso de shell comum é a conclusão do nome do arquivo. Depois que um usuário digita as primeiras letras de um comando ou nome de arquivo e pressiona a tecla kbd:[Tab], o shell completa o restante do comando ou nome do arquivo. Considere dois arquivos chamados [.filename]#foobar# e [.filename]#football#. Para excluir [.filename]#foobar#, o usuário pode digitar `rm foo` e pressionar a tecla kbd:[Tab] para completar o nome do arquivo.
Mas se o shell mostrar apenas `rm foo`. Não foi possível completar o nome do arquivo porque ambos [.filename]#foobar# e [.filename]#football# começam com `foo`. Algumas shells emitem um sinal sonoro ou mostram todas as opções se houver mais de um nome. O usuário deve digitar mais caracteres para identificar o nome do arquivo desejado. Digitar um `t` e pressionar a tecla kbd:[Tab] novamente é suficiente para permitir que o shell determine qual nome de arquivo é desejado e preencha o resto.
Outra característica do shell é o uso de variáveis de ambiente. As variáveis de ambiente são um par de variável/chave armazenado no ambiente do shell. Esse ambiente pode ser lido por qualquer programa chamado pela shell e, portanto, contém muitas configurações de programas. <<shell-env-vars>> fornece uma lista de variáveis de ambiente comuns e seus significados. Observe que os nomes das variáveis de ambiente estão sempre em maiúsculas.
[[shell-env-vars]]
.Variáveis de Ambiente Comuns
[cols="1,1", frame="none", options="header"]
|===
| Variável
| Descrição
|`USER`
|Nome do usuário atual.
|`PATH`
|Lista de diretórios separados por dois pontos para pesquisa de binários (progamas).
|`DISPLAY`
|Nome de rede do display do Xorg para conexão, se disponível.
|`SHELL`
|O shell atual.
|`TERM`
|O nome do tipo de terminal do usuário. Usado para determinar os recursos do terminal.
|`TERMCAP`
|Acesso à base de dados dos códigos de escape do terminal para executar várias funções do terminal.
|`OSTYPE`
|Tipo de sistema operacional.
|`MACHTYPE`
|A arquitetura da CPU do sistema.
|`EDITOR`
|O editor de texto preferencial do usuário.
|`PAGER`
|O utilitário preferencial do usuário para visualização de texto página à página.
|`MANPATH`
|Lista de diretórios separados por dois pontos para pesquisar páginas de manual.
|===
O processo para definir uma variável de ambiente difere entre as shells. Em man:tcsh[1] e man:csh[1], use `setenv` para definir variáveis de ambiente. Em man:sh[1] e no `bash`, use `export` para definir as variáveis de ambiente atuais. Este exemplo define o `EDITOR` padrão para [.filename]#/usr/local/bin/emacs# para a shell man:tcsh[1]:
[source,shell]
....
% setenv EDITOR /usr/local/bin/emacs
....
O comando equivalente para `bash` seria:
[source,shell]
....
% export EDITOR="/usr/local/bin/emacs"
....
Para expandir uma variável de ambiente para ver sua configuração atual, digite um caracter `$` na frente de seu nome na linha de comando. Por exemplo, `echo $TERM` exibe a configuração atual do `$TERM`.
Shells tratam caracteres especiais, conhecidos como meta-caracteres, como representações especiais de dados. O meta-caracter mais comum é `\*`, que representa qualquer número de caracteres em um nome de arquivo. Meta-caracteres podem ser usados para executar a globalização de nomes de arquivos. Por exemplo, `echo *` é equivalente a `ls` porque a shell pega todos os arquivos que correspondem ao `*` e `echo` os lista na linha de comando.
Para evitar que a shell interprete um caractere especial, escape-o a partir da shell, iniciando-o com uma barra invertida (`\`). Por exemplo, `echo $TERM` imprime a configuração do terminal, enquanto `echo \$TERM` imprime literalmente a string `$TERM`.
[[changing-shells]]
=== Alterando a Shell
A maneira mais fácil de alterar permanentemente a shell padrão é usar o `chsh`. A execução desse comando abrirá o editor que está configurado na variável de ambiente `EDITOR`, que por padrão é definido como o man:vi[1]. Altere a linha `Shell:` para o caminho completo da nova shell.
Como alternativa, use `chsh -s`, que irá definir a shell especificada sem abrir um editor. Por exemplo, para alterar a shell para `bash`:
[source,shell]
....
% chsh -s /usr/local/bin/bash
....
[NOTE]
====
A nova shell _deve_ estar presente no arquivo [.filename]#/etc/shells#. Se a shell foi instalada a partir da coleção de ports do FreeBSD, como descrito em crossref:ports[ports, Instalando Aplicativos. Pacotes e Ports], ela deve ser adicionada automaticamente a este arquivo. Se estiver faltando, adicione-a usando este comando, substituindo o caminho pelo caminho da shell:
[source,shell]
....
# echo /usr/local/bin/bash >> /etc/shells
....
Em seguida, execute novamente o man:chsh[1].
====
=== Técnicas Avançadas de Shell
A shell UNIX(TM) não é apenas um interpretador de comandos, ela atua como uma ferramenta poderosa que permite aos usuários executar comandos, redirecionar sua saída, redirecionar sua entrada e encadear comandos para melhorar o resultado final. Quando essa funcionalidade é mesclada com comandos incorporados, é fornecido ao usuário um ambiente que pode maximizar a eficiência.
O redirecionamento de shell é a ação de enviar a saída ou a entrada de um comando para outro comando ou para um arquivo. Para capturar a saída do comando man:ls[1], por exemplo, em um arquivo, redirecione a saída:
[source,shell]
....
% ls > directory_listing.txt
....
O conteúdo do diretório agora será listado em [.filename]#directory_listing.txt#. Alguns comandos podem ser usados para ler entradas, como man:sort[1]. Para classificar esta listagem, redirecione a entrada:
[source,shell]
....
% sort < directory_listing.txt
....
A entrada será classificada e colocada na tela. Para redirecionar essa entrada para outro arquivo, pode-se redirecionar a saída de man:sort[1] misturando a direção:
[source,shell]
....
% sort < directory_listing.txt > sorted.txt
....
Em todos os exemplos anteriores, os comandos estão executando o redirecionamento usando descritores de arquivos. Todo sistema UNIX(TM) possui descritores de arquivos, que incluem entrada padrão (stdin), saída padrão (stdout) e erro padrão (stderr). Cada um tem um propósito, onde a entrada pode ser um teclado ou um mouse, algo que fornece entrada. A saída pode ser uma tela ou papel em uma impressora. E erro seria tudo o que pode ser usado para mensagens de diagnóstico ou erro. Todos os três são considerados descritores de arquivos baseados em I/O e, às vezes, considerados fluxos.
Através do uso desses descritores, a shell permite que a saída e a entrada sejam passadas por vários comandos e redirecionadas para/ou a partir de um arquivo. Outro método de redirecionamento é o operador de pipe.
O operador pipe UNIX(TM), "|" permite que a saída de um comando seja transmitida diretamente ou direcionada para outro programa. Basicamente, um pipe permite que a saída padrão de um comando seja passada como entrada padrão para outro comando, por exemplo:
[source,shell]
....
% cat directory_listing.txt | sort | less
....
Nesse exemplo, o conteúdo de [.filename]#directory_listing.txt# será classificado e a saída será transmitida para man:less[1]. Isso permite que o usuário role pela saída em seu próprio ritmo e evite que ela role para fora da tela.
[[editors]]
== Editores de Texto
A maioria das configurações do FreeBSD é feita através da edição de arquivos de texto. Por isso, é uma boa ideia familiarizar-se com um editor de texto. O FreeBSD vem com alguns como parte do sistema base, e muitos outros estão disponíveis na coleção do ports.
Um editor simples para aprender é o man:ee[1], que significa editor fácil (Ease Editor). Para iniciar este editor, digite `ee _filename_` em que _filename_ é o nome do arquivo a ser editado. Uma vez dentro do editor, todos os comandos para manipular as funções do editor são listados no topo da tela. O cursor (`^`) representa kbd:[Ctrl], então `^e` expande para kbd:[Ctrl+e]. Para sair do man:ee[1], pressione kbd:[Esc] e escolha a opção "leave editor" no menu principal. O editor pedirá para salvar as alterações, caso o arquivo tenha sido modificado.
O FreeBSD também vem com editores de texto mais poderosos, como o man:vi[1], como parte do sistema base. Outros editores, como package:editors/emacs[] e package:editors/vim[], fazem parte da coleção do ports do FreeBSD. Esses editores oferecem mais funcionalidade às custas de serem mais complicados de aprender. Aprender um editor mais poderoso como o vim ou o Emacs pode economizar mais tempo a longo prazo.
Muitos aplicativos que modificam arquivos ou exigem entrada digitada abrirão automaticamente um editor de texto. Para alterar o editor padrão, defina a variável de ambiente `EDITOR` conforme descrito em <<shells>>.
[[basics-devices]]
== Dispositivos e nós de dispositivos
Um dispositivo é um termo usado principalmente para atividades relacionadas a hardware em um sistema, incluindo discos, impressoras, placas gráficas e teclados. Quando o FreeBSD inicializa, a maioria das mensagens de inicialização se refere aos dispositivos sendo detectados. Uma cópia das mensagens de inicialização é salva em [.filename]#/var/run/dmesg.boot#.
Cada dispositivo tem um nome e um número de dispositivo. Por exemplo, [.filename]#ada0# é o primeiro disco rígido SATA, enquanto [.filename]#kbd0# representa o teclado.
A maioria dos dispositivos no FreeBSD deve ser acessada através de arquivos especiais chamados nós de dispositivos (device nodes), que estão localizados em [.filename]#/dev#.
[[basics-more-information]]
== Páginas de Manual
A documentação mais abrangente sobre o FreeBSD está na forma de páginas de manual. Quase todos os programas do sistema vêm com um breve manual de referência explicando a operação básica e os argumentos disponíveis. Estes manuais podem ser visualizados usando o `man`:
[source,shell]
....
% man command
....
onde _command_ é o nome do comando para aprender. Por exemplo, para saber mais sobre o man:ls[1], digite:
[source,shell]
....
% man ls
....
As páginas de manual são divididas em seções que representam o tipo de tópico. No FreeBSD, as seguintes seções estão disponíveis:
. Comandos de usuário.
. Chamadas do sistema e números de erro.
. Funções nas bibliotecas C.
. Drivers de dispositivos.
. Formatos de arquivo.
. Jogos e outras diversões.
. Informações diversas.
. Comandos de manutenção e operação do sistema.
. Interfaces do kernel do sistema.
Em alguns casos, o mesmo tópico pode aparecer em mais de uma seção do manual online. Por exemplo, existe um comando de usuário `chmod` e uma chamada de sistema `chmod()`. Para informar ao man:man[1] qual seção exibir, especifique o número da seção:
[source,shell]
....
% man 1 chmod
....
Isto irá mostrar a página de manual do comando man:chmod[1]. Referências a uma seção em particular do manual online são tradicionalmente colocadas entre parênteses na documentação escrita, então man:chmod[1] refere-se ao comando do usuário e man:chmod[2] refere-se à chamada do sistema.
Se o nome da página de manual for desconhecido, use `man -k` para procurar por palavras-chave nas descrições da página de manual:
[source,shell]
....
% man -k mail
....
Este comando exibe uma lista de comandos que possuem a palavra-chave "mail" em suas descrições. Isso é equivalente a usar o man:apropos[1].
Para ler as descrições de todos os comandos em [.filename]#/usr/bin#, digite:
[source,shell]
....
% cd /usr/bin
% man -f * | more
....
ou
[source,shell]
....
% cd /usr/bin
% whatis * |more
....
[[basics-info]]
=== Arquivos GNU Info
O FreeBSD inclui vários aplicativos e utilitários produzidos pela Free Software Foundation (FSF). Além das páginas de manual, esses programas podem incluir documentos de hipertexto chamados arquivos `info`. Elas podem ser visualizadas usando man:info[1] ou, se o package:editors/emacs[] estiver instalado, o modo info do emacs.
Para usar o man:info[1], digite:
[source,shell]
....
% info
....
Para uma breve introdução, digite `h`. Para uma referência rápida de comandos, digite `?`.
|